summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/codeql-analysis.yml34
-rw-r--r--INSTALL.md8
-rw-r--r--LICENSE.md4
-rw-r--r--MANIFEST8
-rw-r--r--Makefile.in26
-rw-r--r--NEWS124
-rw-r--r--config.h.in68
-rwxr-xr-xconfigure96
-rw-r--r--configure.ac83
-rw-r--r--docs/UPGRADE.md5
-rw-r--r--docs/cvtsudoers.man.in782
-rw-r--r--docs/cvtsudoers.mdoc.in688
-rw-r--r--docs/schema.OpenLDAP14
-rw-r--r--docs/schema.iPlanet6
-rw-r--r--docs/schema.olcSudo14
-rw-r--r--docs/sudo.conf.man.in100
-rw-r--r--docs/sudo.conf.mdoc.in100
-rw-r--r--docs/sudo.man.in71
-rw-r--r--docs/sudo.mdoc.in68
-rw-r--r--docs/sudo_logsrv.proto.man.in4
-rw-r--r--docs/sudo_logsrv.proto.mdoc.in18
-rw-r--r--docs/sudo_logsrvd.conf.man.in85
-rw-r--r--docs/sudo_logsrvd.conf.mdoc.in85
-rw-r--r--docs/sudo_logsrvd.man.in2
-rw-r--r--docs/sudo_logsrvd.mdoc.in2
-rw-r--r--docs/sudo_plugin.man.in934
-rw-r--r--docs/sudo_plugin.mdoc.in1059
-rw-r--r--docs/sudo_plugin_python.man.in213
-rw-r--r--docs/sudo_plugin_python.mdoc.in217
-rw-r--r--docs/sudo_sendlog.man.in2
-rw-r--r--docs/sudo_sendlog.mdoc.in2
-rw-r--r--docs/sudoers.ldap.man.in264
-rw-r--r--docs/sudoers.ldap.mdoc.in264
-rw-r--r--docs/sudoers.man.in1508
-rw-r--r--docs/sudoers.mdoc.in1619
-rw-r--r--docs/sudoers_timestamp.man.in4
-rw-r--r--docs/sudoers_timestamp.mdoc.in30
-rw-r--r--docs/sudoreplay.man.in12
-rw-r--r--docs/sudoreplay.mdoc.in12
-rw-r--r--docs/visudo.man.in26
-rw-r--r--docs/visudo.mdoc.in25
-rw-r--r--etc/codespell.exclude2
-rw-r--r--etc/codespell.ignore5
-rw-r--r--include/intercept.pb-c.h4
-rw-r--r--include/protobuf-c/protobuf-c.h6
-rw-r--r--include/sudo_compat.h80
-rw-r--r--include/sudo_debug.h6
-rw-r--r--include/sudo_event.h3
-rw-r--r--include/sudo_eventlog.h2
-rw-r--r--include/sudo_fatal.h26
-rw-r--r--include/sudo_iolog.h6
-rw-r--r--include/sudo_json.h20
-rw-r--r--include/sudo_lbuf.h4
-rw-r--r--include/sudo_plugin.h17
-rw-r--r--include/sudo_util.h34
-rw-r--r--lib/eventlog/Makefile.in11
-rw-r--r--lib/eventlog/eventlog.c102
-rw-r--r--lib/eventlog/logwrap.c2
-rw-r--r--lib/eventlog/regress/logwrap/check_wrap.c1
-rw-r--r--lib/fuzzstub/Makefile.in8
-rw-r--r--lib/iolog/Makefile.in29
-rw-r--r--lib/iolog/host_port.c12
-rw-r--r--lib/iolog/hostcheck.c6
-rw-r--r--lib/iolog/iolog_loginfo.c18
-rw-r--r--lib/iolog/iolog_mkdirs.c22
-rw-r--r--lib/iolog/iolog_mkdtemp.c16
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_json.c2
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_legacy.c2
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_timing.c2
-rw-r--r--lib/iolog/regress/host_port/host_port_test.c4
-rw-r--r--lib/iolog/regress/iolog_json/check_iolog_json.c44
-rw-r--r--lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c4
-rw-r--r--lib/iolog/regress/iolog_timing/check_iolog_timing.c4
-rw-r--r--lib/logsrv/Makefile.in16
-rw-r--r--lib/protobuf-c/Makefile.in17
-rw-r--r--lib/protobuf-c/protobuf-c.c11
-rw-r--r--lib/util/Makefile.in119
-rw-r--r--lib/util/aix.c10
-rw-r--r--lib/util/arc4random.c4
-rw-r--r--lib/util/digest_gcrypt.c19
-rw-r--r--lib/util/fatal.c2
-rw-r--r--lib/util/fchownat.c67
-rw-r--r--lib/util/getentropy.c5
-rw-r--r--lib/util/getgrouplist.c2
-rw-r--r--lib/util/getopt_long.c4
-rw-r--r--lib/util/json.c174
-rw-r--r--lib/util/lbuf.c4
-rw-r--r--lib/util/logfac.c2
-rw-r--r--lib/util/logpri.c2
-rw-r--r--lib/util/mkdir_parents.c67
-rw-r--r--lib/util/mktemp.c99
-rw-r--r--lib/util/mmap_alloc.c158
-rw-r--r--lib/util/multiarch.c103
-rw-r--r--lib/util/regress/closefrom/closefrom_test.c1
-rw-r--r--lib/util/regress/fnmatch/fnm_test.c1
-rw-r--r--lib/util/regress/fuzz/fuzz_sudo_conf.c2
-rw-r--r--lib/util/regress/getgrouplist/getgrouplist_test.c1
-rw-r--r--lib/util/regress/glob/globtest.c4
-rw-r--r--lib/util/regress/mktemp/mktemp_test.c6
-rw-r--r--lib/util/regress/multiarch/multiarch_test.c178
-rw-r--r--lib/util/regress/open_parent_dir/open_parent_dir_test.c166
-rw-r--r--lib/util/regress/parse_gids/parse_gids_test.c1
-rw-r--r--lib/util/regress/progname/progname_test.c3
-rw-r--r--lib/util/regress/strsig/strsig_test.c1
-rw-r--r--lib/util/regress/strsplit/strsplit_test.c1
-rw-r--r--lib/util/regress/strtofoo/strtobool_test.c1
-rw-r--r--lib/util/regress/strtofoo/strtoid_test.c1
-rw-r--r--lib/util/regress/strtofoo/strtomode_test.c1
-rw-r--r--lib/util/regress/strtofoo/strtonum_test.c1
-rw-r--r--lib/util/regress/sudo_conf/conf_test.c1
-rw-r--r--lib/util/regress/sudo_parseln/parseln_test.c1
-rw-r--r--lib/util/regress/tailq/hltq_test.c1
-rw-r--r--lib/util/regress/uuid/uuid_test.c1
-rw-r--r--lib/util/roundup.c7
-rw-r--r--lib/util/secure_path.c107
-rw-r--r--lib/util/sha2.c2
-rw-r--r--lib/util/snprintf.c76
-rw-r--r--lib/util/strsignal.c2
-rw-r--r--lib/util/strtoid.c3
-rw-r--r--lib/util/sudo_conf.c46
-rw-r--r--lib/util/sudo_debug.c20
-rw-r--r--lib/util/sudo_dso.c58
-rw-r--r--lib/util/term.c24
-rw-r--r--lib/util/timegm.c1
-rw-r--r--lib/util/util.exp.in10
-rw-r--r--lib/zlib/compress.c6
-rw-r--r--lib/zlib/crc32.c33
-rw-r--r--lib/zlib/deflate.c218
-rw-r--r--lib/zlib/deflate.h4
-rw-r--r--lib/zlib/gzlib.c2
-rw-r--r--lib/zlib/gzread.c8
-rw-r--r--lib/zlib/gzwrite.c2
-rw-r--r--lib/zlib/infback.c17
-rw-r--r--lib/zlib/inflate.c7
-rw-r--r--lib/zlib/inftrees.c4
-rw-r--r--lib/zlib/inftrees.h2
-rw-r--r--lib/zlib/trees.c123
-rw-r--r--lib/zlib/uncompr.c4
-rw-r--r--lib/zlib/zconf.h.in19
-rw-r--r--lib/zlib/zlib.h20
-rw-r--r--lib/zlib/zutil.c16
-rw-r--r--lib/zlib/zutil.h1
-rw-r--r--logsrvd/Makefile.in7
-rw-r--r--logsrvd/iolog_writer.c161
-rw-r--r--logsrvd/logsrv_util.c11
-rw-r--r--logsrvd/logsrvd.c63
-rw-r--r--logsrvd/logsrvd.h2
-rw-r--r--logsrvd/logsrvd_conf.c64
-rw-r--r--logsrvd/logsrvd_journal.c20
-rw-r--r--logsrvd/logsrvd_local.c87
-rw-r--r--logsrvd/logsrvd_queue.c9
-rw-r--r--logsrvd/logsrvd_relay.c11
-rw-r--r--logsrvd/regress/fuzz/fuzz_logsrvd_conf.c2
-rw-r--r--logsrvd/regress/logsrvd_conf/logsrvd_conf_test.c1
-rw-r--r--logsrvd/sendlog.c113
-rw-r--r--logsrvd/sendlog.h2
-rw-r--r--logsrvd/tls_client.c9
-rw-r--r--logsrvd/tls_common.h2
-rw-r--r--logsrvd/tls_init.c7
-rw-r--r--plugins/audit_json/Makefile.in4
-rw-r--r--plugins/audit_json/audit_json.c116
-rw-r--r--plugins/group_file/getgrent.c2
-rw-r--r--plugins/python/Makefile.in13
-rw-r--r--plugins/python/pyhelpers.c9
-rw-r--r--plugins/python/pyhelpers.h2
-rw-r--r--plugins/python/python_convmessage.c4
-rw-r--r--plugins/python/python_importblocker.c44
-rw-r--r--plugins/python/python_plugin_approval.c5
-rw-r--r--plugins/python/python_plugin_approval_multi.inc8
-rw-r--r--plugins/python/python_plugin_audit.c11
-rw-r--r--plugins/python/python_plugin_audit_multi.inc8
-rw-r--r--plugins/python/python_plugin_common.c8
-rw-r--r--plugins/python/python_plugin_group.c6
-rw-r--r--plugins/python/python_plugin_io.c23
-rw-r--r--plugins/python/python_plugin_io_multi.inc20
-rw-r--r--plugins/python/python_plugin_policy.c6
-rw-r--r--plugins/python/regress/check_python_examples.c101
-rw-r--r--plugins/python/regress/iohelpers.h10
-rw-r--r--plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout4
-rw-r--r--plugins/python/sudo_python_module.c14
-rw-r--r--plugins/sample/Makefile.in2
-rw-r--r--plugins/sample/sample_plugin.c49
-rw-r--r--plugins/sample_approval/Makefile.in4
-rw-r--r--plugins/sudoers/Makefile.in103
-rw-r--r--plugins/sudoers/audit.c14
-rw-r--r--plugins/sudoers/auth/bsdauth.c8
-rw-r--r--plugins/sudoers/auth/pam.c2
-rw-r--r--plugins/sudoers/auth/sudo_auth.h2
-rw-r--r--plugins/sudoers/check.c18
-rw-r--r--plugins/sudoers/check_aliases.c2
-rw-r--r--plugins/sudoers/cvtsudoers.c45
-rw-r--r--plugins/sudoers/cvtsudoers.h2
-rw-r--r--plugins/sudoers/cvtsudoers_csv.c4
-rw-r--r--plugins/sudoers/cvtsudoers_json.c6
-rw-r--r--plugins/sudoers/cvtsudoers_ldif.c18
-rw-r--r--plugins/sudoers/cvtsudoers_merge.c10
-rw-r--r--plugins/sudoers/cvtsudoers_pwutil.c6
-rw-r--r--plugins/sudoers/def_data.c24
-rw-r--r--plugins/sudoers/def_data.h172
-rw-r--r--plugins/sudoers/def_data.in20
-rw-r--r--plugins/sudoers/defaults.c5
-rw-r--r--plugins/sudoers/defaults.h11
-rw-r--r--plugins/sudoers/editor.c15
-rw-r--r--plugins/sudoers/env.c22
-rw-r--r--plugins/sudoers/exptilde.c2
-rw-r--r--plugins/sudoers/fmtsudoers.c3
-rw-r--r--plugins/sudoers/getdate.c2519
-rw-r--r--plugins/sudoers/getdate.y8
-rw-r--r--plugins/sudoers/gram.c618
-rw-r--r--plugins/sudoers/gram.h3
-rw-r--r--plugins/sudoers/gram.y42
-rw-r--r--plugins/sudoers/group_plugin.c137
-rw-r--r--plugins/sudoers/insults.h2
-rw-r--r--plugins/sudoers/iolog.c4
-rw-r--r--plugins/sudoers/ldap.c4
-rw-r--r--plugins/sudoers/ldap_conf.c3
-rw-r--r--plugins/sudoers/log_client.c141
-rw-r--r--plugins/sudoers/logging.c30
-rw-r--r--plugins/sudoers/logging.h15
-rw-r--r--plugins/sudoers/match_command.c17
-rw-r--r--plugins/sudoers/match_digest.c4
-rw-r--r--plugins/sudoers/parse.c40
-rw-r--r--plugins/sudoers/parse.h4
-rw-r--r--plugins/sudoers/po/de.mobin78597 -> 80080 bytes
-rw-r--r--plugins/sudoers/po/de.po1551
-rw-r--r--plugins/sudoers/po/fr.mobin82988 -> 84559 bytes
-rw-r--r--plugins/sudoers/po/fr.po1547
-rw-r--r--plugins/sudoers/po/ja.mobin86746 -> 86736 bytes
-rw-r--r--plugins/sudoers/po/ja.po2078
-rw-r--r--plugins/sudoers/po/ko.mobin78472 -> 79927 bytes
-rw-r--r--plugins/sudoers/po/ko.po1557
-rw-r--r--plugins/sudoers/po/pl.mobin76514 -> 77976 bytes
-rw-r--r--plugins/sudoers/po/pl.po1551
-rw-r--r--plugins/sudoers/po/ro.mobin79651 -> 81174 bytes
-rw-r--r--plugins/sudoers/po/ro.po1552
-rw-r--r--plugins/sudoers/po/sr.mobin99815 -> 98181 bytes
-rw-r--r--plugins/sudoers/po/sr.po1590
-rw-r--r--plugins/sudoers/po/sudoers.pot1493
-rw-r--r--plugins/sudoers/po/sv.mobin65932 -> 74658 bytes
-rw-r--r--plugins/sudoers/po/sv.po2718
-rw-r--r--plugins/sudoers/po/uk.mobin103837 -> 105824 bytes
-rw-r--r--plugins/sudoers/po/uk.po1545
-rw-r--r--plugins/sudoers/policy.c73
-rw-r--r--plugins/sudoers/pwutil.c2
-rw-r--r--plugins/sudoers/regress/editor/check_editor.c31
-rw-r--r--plugins/sudoers/regress/exptilde/check_exptilde.c6
-rw-r--r--plugins/sudoers/regress/fuzz/fuzz_policy.c20
-rw-r--r--plugins/sudoers/regress/fuzz/fuzz_stubs.c2
-rw-r--r--plugins/sudoers/regress/fuzz/fuzz_sudoers.c41
-rw-r--r--plugins/sudoers/regress/fuzz/fuzz_sudoers_ldif.c1
-rw-r--r--plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c13
-rw-r--r--plugins/sudoers/regress/parser/check_gentime.c4
-rw-r--r--plugins/sudoers/regress/serialize_list/check_serialize_list.c6
-rw-r--r--plugins/sudoers/regress/testsudoers/test11.out.ok4
-rwxr-xr-xplugins/sudoers/regress/testsudoers/test18.sh2
-rw-r--r--plugins/sudoers/regress/testsudoers/test19.out.ok20
-rwxr-xr-xplugins/sudoers/regress/testsudoers/test19.sh20
-rw-r--r--plugins/sudoers/regress/unescape/check_unesc.c6
-rw-r--r--plugins/sudoers/strlcpy_unesc.c3
-rw-r--r--plugins/sudoers/stubs.c1
-rw-r--r--plugins/sudoers/sudoers.c166
-rw-r--r--plugins/sudoers/sudoers.h19
-rw-r--r--plugins/sudoers/sudoers_hooks.c2
-rw-r--r--plugins/sudoers/sudoreplay.c29
-rw-r--r--plugins/sudoers/testsudoers.c25
-rw-r--r--plugins/sudoers/timestamp.c190
-rw-r--r--plugins/sudoers/timestr.c4
-rw-r--r--plugins/sudoers/toke.c2
-rw-r--r--plugins/sudoers/toke.h2
-rw-r--r--plugins/sudoers/toke.l2
-rw-r--r--plugins/sudoers/tsdump.c2
-rw-r--r--plugins/sudoers/tsgetgrpw.c4
-rw-r--r--plugins/sudoers/tsgetgrpw.h7
-rw-r--r--plugins/sudoers/unesc_str.c4
-rw-r--r--plugins/sudoers/visudo.c66
-rw-r--r--po/cs.mobin24256 -> 24916 bytes
-rw-r--r--po/cs.po618
-rw-r--r--po/de.mobin25923 -> 26587 bytes
-rw-r--r--po/de.po622
-rw-r--r--po/fr.mobin25771 -> 26427 bytes
-rw-r--r--po/fr.po618
-rw-r--r--po/ja.mobin26669 -> 29391 bytes
-rw-r--r--po/ja.po668
-rw-r--r--po/ka.mobin36091 -> 40144 bytes
-rw-r--r--po/ka.po660
-rw-r--r--po/ko.mobin26359 -> 27061 bytes
-rw-r--r--po/ko.po622
-rw-r--r--po/pl.mobin24847 -> 25451 bytes
-rw-r--r--po/pl.po606
-rw-r--r--po/ro.mobin25091 -> 25761 bytes
-rw-r--r--po/ro.po629
-rw-r--r--po/sr.mobin29405 -> 31656 bytes
-rw-r--r--po/sr.po451
-rw-r--r--po/sudo.pot594
-rw-r--r--po/sv.mobin20604 -> 24410 bytes
-rw-r--r--po/sv.po854
-rw-r--r--po/uk.mobin33444 -> 34259 bytes
-rw-r--r--po/uk.po618
-rwxr-xr-xscripts/log2cl.pl4
-rwxr-xr-xscripts/mkdep.pl33
-rw-r--r--src/Makefile.in105
-rw-r--r--src/apparmor.c29
-rw-r--r--src/conversation.c23
-rw-r--r--src/copy_file.c1
-rw-r--r--src/edit_open.c9
-rw-r--r--src/env_hooks.c36
-rw-r--r--src/exec.c63
-rw-r--r--src/exec_common.c6
-rw-r--r--src/exec_intercept.c321
-rw-r--r--src/exec_intercept.h1
-rw-r--r--src/exec_iolog.c613
-rw-r--r--src/exec_nopty.c337
-rw-r--r--src/exec_preload.c357
-rw-r--r--src/exec_ptrace.c1032
-rw-r--r--src/exec_ptrace.h10
-rw-r--r--src/exec_pty.c745
-rw-r--r--src/intercept.pb-c.c19
-rw-r--r--src/intercept.proto2
-rw-r--r--src/load_plugins.c36
-rw-r--r--src/net_ifs.c54
-rw-r--r--src/parse_args.c45
-rw-r--r--src/preload.c6
-rw-r--r--src/regress/intercept/test_ptrace.c10
-rw-r--r--src/regress/noexec/check_noexec.c6
-rw-r--r--src/selinux.c46
-rw-r--r--src/sesh.c216
-rw-r--r--src/sudo.c50
-rw-r--r--src/sudo.h101
-rw-r--r--src/sudo_edit.c94
-rw-r--r--src/sudo_exec.h102
-rw-r--r--src/sudo_intercept.c169
-rw-r--r--src/sudo_intercept_common.c90
-rw-r--r--src/sudo_noexec.c28
-rw-r--r--src/sudo_plugin_int.h10
-rw-r--r--src/sudo_usage.h.in10
-rw-r--r--src/suspend_nopty.c10
336 files changed, 27788 insertions, 19001 deletions
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index e91529392..eb975a4a8 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -13,12 +13,12 @@ name: "CodeQL"
on:
push:
- branches: [ main ]
+ branches: [ "main" ]
pull_request:
# The branches below must be a subset of the branches above
- branches: [ main ]
+ branches: [ "main" ]
schedule:
- - cron: '19 3 * * 2'
+ - cron: '25 15 * * 0'
jobs:
analyze:
@@ -34,37 +34,39 @@ jobs:
matrix:
language: [ 'cpp', 'python' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
- # Learn more about CodeQL language support at https://git.io/codeql-language-support
+ # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v1
+ uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
- # queries: ./path/to/local/query, your-org/your-repo/queries@main
+
+ # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
+ # queries: security-extended,security-and-quality
+
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
- uses: github/codeql-action/autobuild@v1
+ uses: github/codeql-action/autobuild@v2
# â„¹ï¸ Command-line programs to run using the OS shell.
- # 📚 https://git.io/JvXDl
+ # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
- # âœï¸ If the Autobuild fails above, remove it and uncomment the following three lines
- # and modify them (or add more) to build your code if your project
- # uses a compiled language
+ # If the Autobuild fails above, remove it and uncomment the following three lines.
+ # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
- #- run: |
- # make bootstrap
- # make release
+ # - run: |
+ # echo "Run, Build Application using script"
+ # ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v1
+ uses: github/codeql-action/analyze@v2
diff --git a/INSTALL.md b/INSTALL.md
index e6a123138..9946bd08b 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -30,13 +30,13 @@ for a list of packages required to build sudo.
## Simple sudo installation
-0. If you are upgrading from a previous version of sudo, read
+1. If you are upgrading from a previous version of sudo, read
[docs/UPGRADE.md](docs/UPGRADE.md) before proceeding.
-1. Read the "OS dependent notes" section for any particular
+2. 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`
+3. `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
@@ -320,7 +320,7 @@ Defaults are listed in brackets after the description.
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
+ "-l" will be prepended to it. Multiple libraries may be
specified as long as they are space separated.
--with-libtool=PATH
diff --git a/LICENSE.md b/LICENSE.md
index 89cab969f..07c91799d 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -296,7 +296,7 @@ The file getentropy.c bears the following license:
The embedded copy of zlib bears the following license:
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2022 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
@@ -319,7 +319,7 @@ The embedded copy of zlib bears the following license:
The embedded copy of protobuf-c bears the following license:
- Copyright (c) 2008-2018, Dave Benson and the protobuf-c authors.
+ Copyright (c) 2008-2022, Dave Benson and the protobuf-c authors.
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/MANIFEST b/MANIFEST
index 6292985b8..ed456e6f2 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -220,6 +220,7 @@ lib/util/event_select.c
lib/util/explicit_bzero.c
lib/util/fatal.c
lib/util/fchmodat.c
+lib/util/fchownat.c
lib/util/fnmatch.c
lib/util/freezero.c
lib/util/fstatat.c
@@ -251,6 +252,8 @@ lib/util/mkdirat.c
lib/util/mksiglist.c
lib/util/mksigname.c
lib/util/mktemp.c
+lib/util/mmap_alloc.c
+lib/util/multiarch.c
lib/util/nanosleep.c
lib/util/openat.c
lib/util/parseln.c
@@ -278,6 +281,8 @@ lib/util/regress/glob/globtest.c
lib/util/regress/glob/globtest.in
lib/util/regress/harness.in
lib/util/regress/mktemp/mktemp_test.c
+lib/util/regress/multiarch/multiarch_test.c
+lib/util/regress/open_parent_dir/open_parent_dir_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
@@ -1018,6 +1023,8 @@ plugins/sudoers/regress/testsudoers/test17.out.ok
plugins/sudoers/regress/testsudoers/test17.sh
plugins/sudoers/regress/testsudoers/test18.out.ok
plugins/sudoers/regress/testsudoers/test18.sh
+plugins/sudoers/regress/testsudoers/test19.out.ok
+plugins/sudoers/regress/testsudoers/test19.sh
plugins/sudoers/regress/testsudoers/test2.inc
plugins/sudoers/regress/testsudoers/test2.out.ok
plugins/sudoers/regress/testsudoers/test2.sh
@@ -1196,6 +1203,7 @@ src/exec.c
src/exec_common.c
src/exec_intercept.c
src/exec_intercept.h
+src/exec_iolog.c
src/exec_monitor.c
src/exec_nopty.c
src/exec_preload.c
diff --git a/Makefile.in b/Makefile.in
index 6de746f75..c4055c3be 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -58,10 +58,10 @@ python_version = @PYTHON_VERSION@
SUBDIRS = lib/util @ZLIB_SRC@ lib/eventlog lib/fuzzstub lib/iolog \
lib/protobuf-c @LOGSRV_SRC@ @LOGSRVD_SRC@ plugins/audit_json \
- plugins/group_file plugins/sample_approval plugins/sudoers \
- plugins/system_group @PYTHON_PLUGIN_SRC@ src include docs examples
+ plugins/group_file plugins/sudoers plugins/system_group \
+ @PYTHON_PLUGIN_SRC@ src include docs examples
-SAMPLES = plugins/sample
+SAMPLES = plugins/sample plugins/sample_approval
VERSION = @PACKAGE_VERSION@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
@@ -70,6 +70,8 @@ LIBTOOL_DEPS = @LIBTOOL_DEPS@
SHELL = @SHELL@
+EGREP = @EGREP@
+GREP = @GREP@
SED = @SED@
INSTALL = $(SHELL) $(scriptdir)/install-sh -c
@@ -105,19 +107,19 @@ PVS_IGNORE = 'V707,V011,V002,V536,V568'
PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE)
all: config.status
- for d in $(SUBDIRS); do \
+ for d in $(SUBDIRS) $(SAMPLES); do \
(cd $$d && exec $(MAKE) $@) && continue; \
exit $$?; \
done
check check-verbose check-fuzzer fuzz pre-install: config.status
- for d in $(SUBDIRS); do \
+ for d in $(SUBDIRS) $(SAMPLES); do \
(cd $$d && exec $(MAKE) $@) && continue; \
exit $$?; \
done
uncrustify.files: Makefile
- grep '\.[ch]$$' $(top_srcdir)/MANIFEST | egrep -v '(/zlib/|/(arc4random|arc4random_uniform|chacha_private|charclass|fnmatch|getaddrinfo|getcwd|getdate|getentropy|getopt|getopt_long|glob|gram|inet_ntop|inet_pton|log_server.pb-c|mktemp|pw_dup|reallocarray|mktemp_test|protobuf-c|snprintf|stdbool|strlcat|strlcpy|sudo_queue|toke)\.[ch]$$)' > uncrustify.files
+ $(GREP) '\.[ch]$$' $(top_srcdir)/MANIFEST | $(EGREP) -v '(/zlib/|/(arc4random|arc4random_uniform|chacha_private|charclass|fnmatch|getaddrinfo|getcwd|getdate|getentropy|getopt|getopt_long|glob|gram|inet_ntop|inet_pton|log_server.pb-c|mktemp|pw_dup|reallocarray|mktemp_test|protobuf-c|snprintf|stdbool|strlcat|strlcpy|sudo_queue|toke)\.[ch]$$)' > uncrustify.files
reformat: uncrustify.files
( cd $(top_srcdir) && uncrustify -c etc/uncrustify.cfg --replace --no-backup -F $(top_builddir)/uncrustify.files )
@@ -126,11 +128,11 @@ check-format: uncrustify.files
( cd $(top_srcdir) && uncrustify -c etc/uncrustify.cfg --check -F $(top_builddir)/uncrustify.files )
spell:
- ( cd $(top_srcdir) && codespell -I etc/codespell.ignore -x etc/codespell.exclude `egrep -v -f etc/codespell.skip MANIFEST` )
+ ( cd $(top_srcdir) && codespell -I etc/codespell.ignore -x etc/codespell.exclude `$(EGREP) -v -f etc/codespell.skip MANIFEST` )
cppcheck: config.status
rval=0; \
- for d in $(SUBDIRS); do \
+ for d in $(SUBDIRS) $(SAMPLES); do \
echo checking $$d; \
(cd $$d && exec $(MAKE) CPPCHECK_OPTS="$(CPPCHECK_OPTS)" $@) || rval=`expr $$rval + $$?`; \
done; \
@@ -138,7 +140,7 @@ cppcheck: config.status
splint: config.status
rval=0; \
- for d in $(SUBDIRS); do \
+ for d in $(SUBDIRS) $(SAMPLES); do \
echo splinting $$d; \
(cd $$d && exec $(MAKE) SPLINT_OPTS="$(SPLINT_OPTS)" $@) || rval=`expr $$rval + $$?`; \
done; \
@@ -161,7 +163,7 @@ cov-analyze: cov-upload
pvs-studio: config.status
files=; \
rval=0; \
- for d in $(SUBDIRS); do \
+ for d in $(SUBDIRS) $(SAMPLES); 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 \
@@ -234,7 +236,7 @@ depend: siglist.c signame.c
ChangeLog:
if test -d $(srcdir)/.hg; then \
- if hg log -R $(srcdir) --style=changelog -r "sort(branch(.) or follow(), -date)" > $@.tmp; then \
+ if hg log -R $(srcdir) --template=changelog -r "sort(branch(.) or follow(), -date)" > $@.tmp; then \
mv -f $@.tmp $(srcdir)/$@; \
else \
rm -f $@.tmp; \
@@ -440,4 +442,4 @@ sandwich:
fi
.PHONY: clean mostlyclean distclean cleandir clobber realclean ChangeLog \
- me a sandwhich check-format reformat
+ me a sandwich check-format reformat
diff --git a/NEWS b/NEWS
index 10744d326..65502ecf7 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,127 @@
+What's new in Sudo 1.9.12
+
+ * Fixed a bug in the ptrace-based intercept mode where the current
+ working directory could include garbage at the end.
+
+ * Fixed a compilation error on systems that lack the stdint.h
+ header. Bug #1035
+
+ * Fixed a bug when logging the command's exit status in intercept
+ mode. The wrong command could be logged with the exit status.
+
+ * For ptrace-based intercept mode, sudo will now attempt to
+ verify that the command path name, arguments and environment
+ have not changed from the time when they were authorized by the
+ security policy. The new "intercept_verify" sudoers setting can
+ be used to control this behavior.
+
+ * Fixed running commands with a relative path (e.g. ./foo) in
+ intercept mode. Previously, this would fail if sudo's current
+ working directory was different from that of the command.
+
+ * Sudo now supports passing the execve(2) system call the NULL
+ pointer for the `argv` and/or `envp` arguments when in intercept
+ mode. Linux treats a NULL pointer like an empty array.
+
+ * The sudoers LDAP schema now allows sudoUser, sudoRunasUser and
+ sudoRunasGroup to include UTF-8 characters, not just 7-bit ASCII.
+
+ * Fixed a problem with "sudo -i" on SELinux when the target user's
+ home directory is not searchable by sudo. GitHub issue #160.
+
+ * Neovim has been added to the list of visudo editors that support
+ passing the line number on the command line.
+
+ * Fixed a bug in sudo's SHA384 and SHA512 message digest padding.
+
+ * Added a new "-N" (--no-update) command line option to sudo which
+ can be used to prevent sudo from updating the user's cached
+ credentials. It is now possible to determine whether or not a
+ user's cached credentials are currently valid by running:
+
+ $ sudo -Nnv
+
+ and checking the exit value. One use case for this is to indicate
+ in a shell prompt that sudo is "active" for the user.
+
+ * PAM approval modules are no longer invoked when running sub-commands
+ in intercept mode unless the "intercept_authenticate" option is set.
+ There is a substantial performance penalty for calling into PAM
+ for each command run. PAM approval modules are still called for
+ the initial command.
+
+ * Intercept mode on Linux now uses process_vm_readv(2) and
+ process_vm_writev(2) if available.
+
+ * The XDG_CURRENT_DESKTOP environment variable is now preserved
+ by default. This makes it possible for graphical applications
+ to choose the correct theme when run via sudo.
+
+ * On 64-bit systems, if sudo fails to load a sudoers group plugin,
+ it will use system-specific heuristics to try to locate a 64-bit
+ version of the plugin.
+
+ * The cvtsudoers manual now documents the JSON and CSV output
+ formats. GitHub issue #172.
+
+ * Fixed a bug where sub-commands were not being logged to a remote
+ log server when log_subcmds was enabled. GitHub issue #174.
+
+ * The new log_stdin, log_stdout, log_stderr, log_ttyin, and log_ttyout
+ sudoers settings can be used to support more fine-grained I/O logging.
+ The sudo front-end no longer allocates a pseudo-terminal when running
+ a command if the I/O logging plugin requests logging of stdin, stdout,
+ or stderr but not terminal input/output.
+
+ * Quieted a libgcrypt run-time initialization warning.
+ This fixes Debian bug #1019428 and Ubuntu bug #1397663.
+
+ * Fixed a bug in visudo that caused literal backslashes to be removed
+ from the EDITOR environment variable. GitHub issue #179.
+
+ * The sudo Python plugin now implements the "find_spec" method instead
+ of the the deprecated "find_module". This fixes a test failure when
+ a newer version of setuptools that doesn't include "find_module" is
+ found on the system.
+
+ * Fixed a bug introduced in sudo 1.9.9 where sudo_logsrvd created
+ the process ID file, usually /var/run/sudo/sudo_logsrvd.pid, as
+ a directory instead of a plain file. The same bug could result
+ in I/O log directories that end in six or more X's being created
+ literally in addition to the name being used as a template for
+ the mkdtemp(3) function.
+
+ * Fixed a long-standing bug where a sudoers rule with a command
+ line argument of "", which indicates the command may be run with
+ no arguments, would also match a literal "" on the command line.
+ GitHub issue #182.
+
+ * Added the -I option to visudo which only edits the main sudoers
+ file. Include files are not edited unless a syntax error is found.
+
+ * Fixed "sudo -l -U otheruser" output when the runas list is empty.
+ Previously, sudo would list the invoking user instead of the
+ list user. GitHub issue #183.
+
+ * Fixed the display of command tags and options in "sudo -l" output
+ when the RunAs user or group changes. A new line is started for
+ RunAs changes which means we need to display the command tags
+ and options again. GitHub issue #184.
+
+ * The sesh helper program now uses getopt_long(3) to parse the
+ command line options.
+
+ * The embedded copy of zlib has been updated to version 1.2.13.
+
+ * Fixed a bug that prevented event log data from being sent to the
+ log server when I/O logging was not enabled. This only affected
+ systems without PAM or configurations where the pam_session and
+ pam_setcred options were disabled in the sudoers file.
+
+ * Fixed a bug where "sudo -l" output included a carriage return
+ after the newline. This is only needed when displaying to a
+ terminal in raw mode. Bug #1042.
+
What's new in Sudo 1.9.11p3
* Fixed "connection reset" errors on AIX when running shell scripts
diff --git a/config.h.in b/config.h.in
index c9c024a15..ba4d00056 100644
--- a/config.h.in
+++ b/config.h.in
@@ -298,6 +298,9 @@
/* Define to 1 if you have the `fchmodat' function. */
#undef HAVE_FCHMODAT
+/* Define to 1 if you have the `fchownat' function. */
+#undef HAVE_FCHOWNAT
+
/* Define to 1 if your system has the F_CLOSEM fcntl. */
#undef HAVE_FCNTL_CLOSEM
@@ -599,11 +602,17 @@
/* Define to 1 if you have the `mkdirat' function. */
#undef HAVE_MKDIRAT
-/* Define to 1 if you have the `mkdtemp' function. */
-#undef HAVE_MKDTEMP
+/* Define to 1 if you have the `mkdtempat' function. */
+#undef HAVE_MKDTEMPAT
+
+/* Define to 1 if you have the `mkdtempat_np' function. */
+#undef HAVE_MKDTEMPAT_NP
+
+/* Define to 1 if you have the `mkostempsat' function. */
+#undef HAVE_MKOSTEMPSAT
-/* Define to 1 if you have the `mkstemps' function. */
-#undef HAVE_MKSTEMPS
+/* Define to 1 if you have the `mkostempsat_np' function. */
+#undef HAVE_MKOSTEMPSAT_NP
/* Define to 1 if you have the <mps/ldap_ssl.h> header file. */
#undef HAVE_MPS_LDAP_SSL_H
@@ -686,6 +695,9 @@
/* Define to 1 if you have the `priv_set' function. */
#undef HAVE_PRIV_SET
+/* Define to 1 if you have the `process_vm_readv' function. */
+#undef HAVE_PROCESS_VM_READV
+
/* Define to 1 if you have the <procfs.h> header file. */
#undef HAVE_PROCFS_H
@@ -1448,7 +1460,53 @@
code using `volatile' can become incorrect without. Disable with care. */
#undef volatile
-/* Symbol visibility controls */
+#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 functions that call exit() directly. */
+#if __GNUC_PREREQ__(2, 5)
+# define sudo_noreturn __attribute__((__noreturn__))
+#else
+# define sudo_noreturn
+#endif
+
+/* For malloc-like functions that return uninitialized or zeroed memory. */
+#if __GNUC_PREREQ__(2, 96)
+# define sudo_malloclike __attribute__((__malloc__))
+#else
+# define sudo_malloclike
+#endif
+
+/* Compile-time checking for function arguments that must not be NULL. */
+#if __GNUC_PREREQ__(3, 3)
+# define sudo_attr_nonnull(_a) __attribute__((__nonnull__ (_a)))
+#else
+# define sudo_attr_nonnull(_a)
+#endif
+
+/* For catching format string mismatches. */
+#if __GNUC_PREREQ__(2, 7)
+# define sudo_printflike(_f, _v) __attribute__((__format__ (__printf__, _f, _v))) sudo_attr_nonnull(_f)
+# define sudo_printf0like(_f, _v) __attribute__((__format__ (__printf__, _f, _v)))
+# define sudo_attr_fmt_arg(_f) __attribute__((__format_arg__ (_f)))
+#else
+# define sudo_printflike(_f, _v)
+# define sudo_printf0like(_f, _v)
+# define sudo_attr_fmt_arg(_f)
+#endif
+
+/* Symbol visibility controls. */
#ifdef HAVE_DSO_VISIBILITY
# if defined(__GNUC__)
# define sudo_dso_public __attribute__((__visibility__("default")))
diff --git a/configure b/configure
index 2363bb148..efdf3f1f2 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for sudo 1.9.11p3.
+# Generated by GNU Autoconf 2.71 for sudo 1.9.12.
#
# Report bugs to <https://bugzilla.sudo.ws/>.
#
@@ -621,8 +621,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='sudo'
PACKAGE_TARNAME='sudo'
-PACKAGE_VERSION='1.9.11p3'
-PACKAGE_STRING='sudo 1.9.11p3'
+PACKAGE_VERSION='1.9.12'
+PACKAGE_STRING='sudo 1.9.12'
PACKAGE_BUGREPORT='https://bugzilla.sudo.ws/'
PACKAGE_URL=''
@@ -1640,7 +1640,7 @@ 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.9.11p3 to adapt to many kinds of systems.
+\`configure' configures sudo 1.9.12 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1706,7 +1706,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of sudo 1.9.11p3:";;
+ short | recursive ) echo "Configuration of sudo 1.9.12:";;
esac
cat <<\_ACEOF
@@ -1996,7 +1996,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-sudo configure 1.9.11p3
+sudo configure 1.9.12
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2653,7 +2653,7 @@ cat >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.9.11p3, which was
+It was created by sudo $as_me 1.9.12, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -17851,9 +17851,23 @@ fi
# We use our own getentropy() by default on Linux.
: ${ac_cv_func_getentropy='no'}
+ # The glibc arc4random() may fail in chroot on older kernels.
+ # We use our own arc4random() by default on Linux.
+ : ${ac_cv_func_arc4random='no'}
+
# The glibc closefrom() emulation may fail in chroot.
# We use our own closefrom() by default on Linux.
: ${ac_cv_func_closefrom='no'}
+
+ # Linux 3.2 supports reading/writing a another process
+ # without using ptrace(2).
+ ac_fn_c_check_func "$LINENO" "process_vm_readv" "ac_cv_func_process_vm_readv"
+if test "x$ac_cv_func_process_vm_readv" = xyes
+then :
+ printf "%s\n" "#define HAVE_PROCESS_VM_READV 1" >>confdefs.h
+
+fi
+
;;
*-*-gnu*)
# lockf() is broken on the Hurd
@@ -22737,6 +22751,32 @@ fi
done
+ for ac_func in fchownat
+do :
+ ac_fn_c_check_func "$LINENO" "fchownat" "ac_cv_func_fchownat"
+if test "x$ac_cv_func_fchownat" = xyes
+then :
+ printf "%s\n" "#define HAVE_FCHOWNAT 1" >>confdefs.h
+
+else $as_nop
+
+ case " $LIBOBJS " in
+ *" fchownat.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS fchownat.$ac_objext"
+ ;;
+esac
+
+
+ for _sym in sudo_fchownat; do
+ COMPAT_EXP="${COMPAT_EXP}${_sym}
+"
+ done
+
+
+fi
+
+done
+
for ac_func in mkdirat
do :
ac_fn_c_check_func "$LINENO" "mkdirat" "ac_cv_func_mkdirat"
@@ -23297,8 +23337,12 @@ fi
fi
done
+sudo_mktemp=no
+case "$host_os" in
+ darwin*)
+ # macOS has these but uses a _np (non-portable) suffix
- for ac_func in mkstemps mkdtemp
+ for ac_func in mkdtempat_np mkostempsat_np
do :
as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -23309,11 +23353,32 @@ then :
_ACEOF
else $as_nop
- break
+ sudo_mktemp=yes; break
+fi
+
+done
+ ;;
+ *)
+
+ for ac_func in mkdtempat mkostempsat
+do :
+ as_ac_var=`printf "%s\n" "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 `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else $as_nop
+ sudo_mktemp=yes; break
fi
done
-if test X"$ac_cv_func_mkstemps$ac_cv_func_mkdtemp" != X"yesyes"; then
+ ;;
+esac
+# If any of the mktemp family are missing we use our own.
+if test X"$sudo_mktemp" = X"yes"; then
for ac_func in arc4random random lrand48
do :
@@ -23343,9 +23408,8 @@ fi
;;
esac
- # If either mkdtemp() or mkstemps() is missing, replace both.
- for _sym in sudo_mkdtemp sudo_mkstemps; do
+ for _sym in sudo_mkdtemp sudo_mkdtempat sudo_mkostempsat sudo_mkstemp sudo_mkstemps; do
COMPAT_EXP="${COMPAT_EXP}${_sym}
"
done
@@ -32298,7 +32362,7 @@ printf "%s\n" "#define os_init $OS_INIT" >>confdefs.h
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 -Wno-unknown-pragmas"
+ CFLAGS="${CFLAGS} -Wall -Wsign-compare -Wpointer-arith -Wno-unknown-pragmas -Wmissing-prototypes -Wwrite-strings"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wshadow" >&5
printf %s "checking whether C compiler accepts -Wshadow... " >&6; }
if test ${ax_cv_check_cflags___Wshadow+y}
@@ -32384,7 +32448,7 @@ printf "%s\n" "$sudo_cv_var_fallthrough_attribute" >&6; }
if test X"$enable_werror" = X"yes"; then
CFLAGS="${CFLAGS} -Werror"
fi
- case "$host" in
+ case "$host_os" in
# Avoid unwanted warnings on macOS
darwin*) CFLAGS="${CFLAGS} -Wno-deprecated-declarations";;
esac
@@ -33050,7 +33114,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# 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.9.11p3, which was
+This file was extended by sudo $as_me 1.9.12, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -33118,7 +33182,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-sudo config.status 1.9.11p3
+sudo config.status 1.9.12
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 9f845eddd..103bc4fad 100644
--- a/configure.ac
+++ b/configure.ac
@@ -18,7 +18,7 @@ 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.70])
-AC_INIT([sudo], [1.9.11p3], [https://bugzilla.sudo.ws/], [sudo])
+AC_INIT([sudo], [1.9.12], [https://bugzilla.sudo.ws/], [sudo])
AC_CONFIG_HEADERS([config.h pathnames.h])
AC_CONFIG_SRCDIR([src/sudo.c])
AC_CONFIG_AUX_DIR([scripts])
@@ -2080,9 +2080,17 @@ case "$host" in
# We use our own getentropy() by default on Linux.
: ${ac_cv_func_getentropy='no'}
+ # The glibc arc4random() may fail in chroot on older kernels.
+ # We use our own arc4random() by default on Linux.
+ : ${ac_cv_func_arc4random='no'}
+
# The glibc closefrom() emulation may fail in chroot.
# We use our own closefrom() by default on Linux.
: ${ac_cv_func_closefrom='no'}
+
+ # Linux 3.2 supports reading/writing a another process
+ # without using ptrace(2).
+ AC_CHECK_FUNCS([process_vm_readv])
;;
*-*-gnu*)
# lockf() is broken on the Hurd
@@ -2865,6 +2873,10 @@ AC_CHECK_FUNCS(nanosleep, [], [
SUDO_APPEND_COMPAT_EXP(sudo_nanosleep)
])
])
+AC_CHECK_FUNCS([fchownat], [], [
+ AC_LIBOBJ(fchownat)
+ SUDO_APPEND_COMPAT_EXP(sudo_fchownat)
+])
AC_CHECK_FUNCS([mkdirat], [], [
AC_LIBOBJ(mkdirat)
SUDO_APPEND_COMPAT_EXP(sudo_mkdirat)
@@ -2949,15 +2961,24 @@ AC_CHECK_FUNCS([closefrom], [], [AC_LIBOBJ(closefrom)
# include <fcntl.h> ])
COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }closefrom_test"
])
-AC_CHECK_FUNCS([mkstemps mkdtemp], [], [break])
-if test X"$ac_cv_func_mkstemps$ac_cv_func_mkdtemp" != X"yesyes"; then
+sudo_mktemp=no
+case "$host_os" in
+ darwin*)
+ # macOS has these but uses a _np (non-portable) suffix
+ AC_CHECK_FUNCS([mkdtempat_np mkostempsat_np], [], [sudo_mktemp=yes; break])
+ ;;
+ *)
+ AC_CHECK_FUNCS([mkdtempat mkostempsat], [], [sudo_mktemp=yes; break])
+ ;;
+esac
+# If any of the mktemp family are missing we use our own.
+if test X"$sudo_mktemp" = X"yes"; 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)
+ SUDO_APPEND_COMPAT_EXP(sudo_mkdtemp sudo_mkdtempat sudo_mkostempsat sudo_mkstemp sudo_mkstemps)
COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }mktemp_test"
fi
AX_FUNC_SNPRINTF
@@ -4995,7 +5016,7 @@ if test -n "$GCC"; then
dnl
dnl Default warnings for development use.
dnl
- CFLAGS="${CFLAGS} -Wall -Wsign-compare -Wpointer-arith -Wno-unknown-pragmas"
+ CFLAGS="${CFLAGS} -Wall -Wsign-compare -Wpointer-arith -Wno-unknown-pragmas -Wmissing-prototypes -Wwrite-strings"
AX_CHECK_COMPILE_FLAG([-Wshadow], [CFLAGS="$CFLAGS -Wshadow"])
dnl
dnl The fallthrough attribute is supported by gcc 7.0 and clang 10.
@@ -5032,7 +5053,7 @@ if test -n "$GCC"; then
if test X"$enable_werror" = X"yes"; then
CFLAGS="${CFLAGS} -Werror"
fi
- case "$host" in
+ case "$host_os" in
# Avoid unwanted warnings on macOS
darwin*) CFLAGS="${CFLAGS} -Wno-deprecated-declarations";;
esac
@@ -5525,7 +5546,53 @@ dnl
AH_TOP([#ifndef SUDO_CONFIG_H
#define SUDO_CONFIG_H])
-AH_BOTTOM([/* Symbol visibility controls */
+AH_BOTTOM([#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 functions that call exit() directly. */
+#if __GNUC_PREREQ__(2, 5)
+# define sudo_noreturn __attribute__((__noreturn__))
+#else
+# define sudo_noreturn
+#endif
+
+/* For malloc-like functions that return uninitialized or zeroed memory. */
+#if __GNUC_PREREQ__(2, 96)
+# define sudo_malloclike __attribute__((__malloc__))
+#else
+# define sudo_malloclike
+#endif
+
+/* Compile-time checking for function arguments that must not be NULL. */
+#if __GNUC_PREREQ__(3, 3)
+# define sudo_attr_nonnull(_a) __attribute__((__nonnull__ (_a)))
+#else
+# define sudo_attr_nonnull(_a)
+#endif
+
+/* For catching format string mismatches. */
+#if __GNUC_PREREQ__(2, 7)
+# define sudo_printflike(_f, _v) __attribute__((__format__ (__printf__, _f, _v))) sudo_attr_nonnull(_f)
+# define sudo_printf0like(_f, _v) __attribute__((__format__ (__printf__, _f, _v)))
+# define sudo_attr_fmt_arg(_f) __attribute__((__format_arg__ (_f)))
+#else
+# define sudo_printflike(_f, _v)
+# define sudo_printf0like(_f, _v)
+# define sudo_attr_fmt_arg(_f)
+#endif
+
+/* Symbol visibility controls. */
#ifdef HAVE_DSO_VISIBILITY
# if defined(__GNUC__)
# define sudo_dso_public __attribute__((__visibility__("default")))
diff --git a/docs/UPGRADE.md b/docs/UPGRADE.md
index d61eea551..5b2271cec 100644
--- a/docs/UPGRADE.md
+++ b/docs/UPGRADE.md
@@ -25,6 +25,11 @@ Notes on upgrading from an older release
such as those seen with the Linux logrotate utility, which could
interpret a core dump as a valid configuration file.
+ To restore the historic core dump file size behavior, add the
+ following line to the sudoers file:
+
+ Defaults rlimit_core=default
+
* Upgrading from a version prior to 1.9.7:
Sudo now links with OpenSSL 1.0.1 or higher by default if it
diff --git a/docs/cvtsudoers.man.in b/docs/cvtsudoers.man.in
index 5e65be3bf..2b5ac6b78 100644
--- a/docs/cvtsudoers.man.in
+++ b/docs/cvtsudoers.man.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "CVTSUDOERS" "1" "February 16, 2022" "Sudo @PACKAGE_VERSION@" "General Commands Manual"
+.TH "CVTSUDOERS" "1" "September 29, 2022" "Sudo @PACKAGE_VERSION@" "General Commands Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -67,9 +67,8 @@ The options are as follows:
The base DN (distinguished name) that will be used when performing
LDAP queries.
Typically this is of the form
-\fRou=SUDOers,dc=my-domain,dc=com\fR
-for the domain
-\fRmy-domain.com\fR.
+\(lqou=SUDOers,dc=my-domain,dc=com\(rq
+for the domain my-domain.com.
If this option is not specified, the value of the
\fRSUDOERS_BASE\fR
environment variable will be used instead.
@@ -82,10 +81,10 @@ Defaults to
.TP 12n
\fB\-d\fR \fIdeftypes\fR, \fB\--defaults\fR=\fIdeftypes\fR
Only convert
-\fRDefaults\fR
+\fIDefaults\fR
entries of the specified types.
One or more
-\fRDefaults\fR
+\fIDefaults\fR
types may be specified, separated by a comma
(\(oq\&,\(cq).
The supported types are:
@@ -122,7 +121,7 @@ for more information.
If the
\fB\-d\fR
option is not specified, all
-\fRDefaults\fR
+\fIDefaults\fR
entries will be converted.
.RE
.TP 12n
@@ -143,12 +142,9 @@ The following formats are supported:
CSV
CSV (comma-separated value) files are often used by spreadsheets
and report generators.
-For CSV output,
-\fBcvtsudoers\fR
-double quotes strings that contain commas.
-For each literal double quote character present inside the string,
-two double quotes are output.
-This method of quoting commas is compatible with most spreadsheet programs.
+See
+\fICSV output format\fR
+for more details.
.PD
.TP 10n
JSON
@@ -160,6 +156,9 @@ The various values have explicit types which removes much of the
ambiguity of the
\fIsudoers\fR
format.
+See
+\fIJSON output format\fR
+for more details.
.TP 10n
LDIF
LDIF (LDAP Data Interchange Format) files can be imported into an LDAP
@@ -264,7 +263,12 @@ For example,
\fBuser\fR = \fIoperator\fR
or
\fBhost\fR = \fIwww\fR.
-An upper-case Cmnd_Alias, Host_alias, or Host_Alias may be specified as the
+An upper-case
+\fICmnd_Alias\fR,
+\fIHost_alias\fR,
+or
+\fIUser_Alias\fR
+may be specified as the
\(lqcmnd\(rq,
\(lqhost\(rq,
or
@@ -436,7 +440,7 @@ Per-user rules are merged and duplicates are removed.
If a host name is specified with the input file,
\fBcvtsudoers\fR
will change rules that specify a host name of
-\fRALL\fR
+\fBALL\fR
to the host name associated with the policy file being merged.
The merging of rules is currently fairly simplistic but will be
improved in a later release.
@@ -522,6 +526,754 @@ command line option.
.PP
Options on the command line will override values from the
configuration file.
+.SS "JSON output format"
+The
+\fIsudoers\fR
+JSON format may contain any of the following top-level objects:
+.TP 6n
+Defaults
+An array of objects, each containing an
+\fIOptions\fR
+array and an optional
+\fIBinding\fR
+array.
+.sp
+The
+\fIOptions\fR
+array consists of one or more objects, each containing a
+\(lqname:value\(rq
+pair that corresponds to a
+\fIsudoers\fR
+\fIDefaults\fR
+setting.
+\fIOptions\fR
+that operate on a list will also include an
+\fIoperation\fR
+entry in the object, with a value of
+\(lqlist_assign\(rq
+for
+\(oq=\(cq,
+\(lqlist_add\(rq
+for
+\(oq+=\(cq,
+or
+\(lqlist_remove\(rq
+for
+\(oq-=\(cq.
+.sp
+The optional
+\fIBinding\fR
+array consists of one or more objects, each containing a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+If a
+\fIBinding\fR
+is present, the setting will only take effect if one of the specified
+\fIcommand\fR,
+\fIhostname\fR,
+\fInetgroup\fR,
+\fInetworkaddr\fR,
+\fInonunixgid\fR,
+\fInonunixgroup\fR,
+\fIusergid\fR,
+\fIusergroup\fR,
+\fIuserid\fR,
+\fIusername\fR,
+or alias entries match.
+.sp
+For example, the following
+\fIsudoers\fR
+entry:
+.nf
+.sp
+.RS 6n
+Defaults@somehost set_home, env_keep += DISPLAY
+.RE
+.fi
+.RS 6n
+.sp
+converts to:
+.nf
+.sp
+.RS 6n
+"Defaults": [
+ {
+ "Binding": [
+ { "hostname": "somehost" }
+ ],
+ "Options": [
+ { "set_home": true },
+ {
+ "operation": "list_add",
+ "env_keep": [
+ "DISPLAY"
+ ]
+ }
+ ]
+ }
+]
+.RE
+.fi
+.RE
+.TP 6n
+User_Aliases
+A JSON object containing one or more
+\fIsudoers\fR
+\fIUser_Alias\fR
+entries where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be one of
+\fInetgroup\fR,
+\fInonunixgid\fR,
+\fInonunixgroup\fR,
+\fIuseralias\fR,
+\fIusergid\fR,
+\fIusergroup\fR,
+\fIuserid\fR,
+or
+\fIusername\fR.
+.sp
+For example, the following
+\fIsudoers\fR
+entry:
+.nf
+.sp
+.RS 6n
+User_Alias SYSADMIN = will, %wheel, +admin
+.RE
+.fi
+.RS 6n
+.sp
+converts to:
+.nf
+.sp
+.RS 6n
+"User_Aliases": {
+ "SYSADMIN": [
+ { "username": "will" },
+ { "usergroup": "wheel" },
+ { "netgroup": "admin" }
+ ]
+}
+.RE
+.fi
+.RE
+.TP 6n
+Runas_Aliases
+A JSON object containing one or more
+\fIsudoers\fR
+\fIRunas_Alias\fR
+entries, where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be one of
+\fInetgroup\fR,
+\fInonunixgid\fR,
+\fInonunixgroup\fR,
+\fIrunasalias\fR,
+\fIusergid\fR,
+\fIusergroup\fR,
+\fIuserid\fR,
+or
+\fIusername\fR.
+.sp
+For example, the following
+\fIsudoers\fR
+entry:
+.nf
+.sp
+.RS 6n
+Runas_Alias DB = oracle, sybase : OP = root, operator
+.RE
+.fi
+.RS 6n
+.sp
+converts to:
+.nf
+.sp
+.RS 6n
+"Runas_Aliases": {
+ "DB": [
+ { "username": "oracle" },
+ { "username": "sybase" }
+ ],
+ "OP": [
+ { "username": "root" },
+ { "username": "operator" }
+ ]
+}
+.RE
+.fi
+.RE
+.TP 6n
+Host_Aliases
+A JSON object containing one or more
+\fIsudoers\fR
+\fIHost_Alias\fR
+entries where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be one of
+\fIhostalias\fR,
+\fIhostname\fR,
+\fInetgroup\fR,
+or
+\fInetworkaddr\fR.
+.sp
+For example, the following
+\fIsudoers\fR
+entries:
+.nf
+.sp
+.RS 6n
+Host_Alias DORMNET = 128.138.243.0, 128.138.204.0/24
+Host_Alias SERVERS = boulder, refuge
+.RE
+.fi
+.RS 6n
+.sp
+convert to:
+.nf
+.sp
+.RS 6n
+"Host_Aliases": {
+ "DORMNET": [
+ { "networkaddr": "128.138.243.0" },
+ { "networkaddr": "128.138.204.0/24" }
+ ],
+ "SERVERS": [
+ { "hostname": "boulder" },
+ { "hostname": "refuge" }
+ ]
+}
+.RE
+.fi
+.RE
+.TP 6n
+Cmnd_Aliases
+A JSON object containing one or more
+\fIsudoers\fR
+\fICmnd_Alias\fR
+entries where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be either another
+\fIcmndalias\fR
+or a
+\fIcommand\fR.
+For example, the following
+\fIsudoers\fR
+entries:
+.nf
+.sp
+.RS 6n
+Cmnd_Alias SHELLS = /bin/bash, /bin/csh, /bin/sh, /bin/zsh
+Cmnd_Alias VIPW = /usr/bin/chpass, /usr/bin/chfn, /usr/bin/chsh, \e
+ /usr/bin/passwd, /usr/sbin/vigr, /usr/sbin/vipw
+.RE
+.fi
+.RS 6n
+.sp
+convert to:
+.nf
+.sp
+.RS 6n
+"Cmnd_Aliases": {
+ "SHELLS": [
+ { "command": "/bin/bash" },
+ { "command": "/bin/csh" },
+ { "command": "/bin/sh" },
+ { "command": "/bin/zsh" }
+ ],
+ "VIPW": [
+ { "command": "/usr/bin/chpass" },
+ { "command": "/usr/bin/chfn" },
+ { "command": "/usr/bin/chsh" },
+ { "command": "/usr/bin/passwd" },
+ { "command": "/usr/sbin/vigr" },
+ { "command": "/usr/sbin/vipw" }
+ ]
+}
+.RE
+.fi
+.RE
+.TP 6n
+User_Specs
+A JSON array containing one or more objects, each representing a
+\fIsudoers\fR
+User_Spec.
+Each object in the
+\fIUser_Specs\fR
+array should contain a
+\fIUser_List\fR
+array, a
+\fIHost_List\fR
+array and a
+\fICmnd_Specs\fR
+array.
+.sp
+A
+\fIUser_List\fR
+consists of one or more objects.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be one of
+\fInetgroup\fR,
+\fInonunixgid\fR,
+\fInonunixgroup\fR,
+\fIuseralias\fR,
+\fIusergid\fR,
+\fIusergroup\fR,
+\fIuserid\fR,
+or
+\fIusername\fR.
+If
+\fIusername\fR
+is set to the special value
+\fBALL\fR,
+it will match any user.
+.sp
+A
+\fIHost_List\fR
+consists of one or more objects.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be one of
+\fIhostalias\fR,
+\fIhostname\fR,
+\fInetgroup\fR,
+or
+\fInetworkaddr\fR.
+If
+\fIhostname\fR
+is set to the special value
+\fBALL\fR,
+it will match any host.
+.sp
+The
+\fICmnd_Specs\fR
+array consists of one or more JSON objects describing a command that
+may be run.
+Each
+\fICmnd_Specs\fR
+is made up of a
+\fICommands\fR
+array, an optional
+\fIrunasusers\fR
+array, an optional
+\fIrunasgroups\fR
+array, and an optional
+\fIOptions array.\fR
+.sp
+The
+\fICommands\fR
+array consists of one or more objects containing
+\(lqname:value\(rq
+pair elements.
+The following names and values are supported:
+.PP
+.RS 6n
+.PD 0
+.TP 10n
+command
+A string containing the command to run.
+The special value
+\fBALL\fR
+it will match any command.
+.PD
+.TP 10n
+negated
+A boolean value that, if true, will negate any comparison performed
+with the object.
+.TP 10n
+sha224
+A string containing the SHA224 digest of the
+\fIcommand\fR.
+.TP 10n
+sha256
+A string containing the SHA256 digest of the
+\fIcommand\fR.
+.TP 10n
+sha384
+A string containing the SHA384 digest of the
+\fIcommand\fR.
+.TP 10n
+sha512
+A string containing the SHA512 digest of the
+\fIcommand\fR.
+.PP
+The
+\fIrunasusers\fR
+array consists of objects describing users the command may be run as.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be one of
+\fInetgroup\fR,
+\fInonunixgid\fR,
+\fInonunixgroup\fR,
+\fIrunasalias\fR,
+\fIusergid\fR,
+\fIusergroup\fR,
+\fIuserid\fR,
+or
+\fIusername\fR.
+If
+\fIusername\fR
+is set to the special value
+\fBALL\fR,
+it will match any user.
+If
+\fIusername\fR
+is set to the empty string
+\(lq\(rq,
+it will match the invoking user.
+.sp
+The
+\fIrunasgroups\fR
+array consists of objects describing groups the command may be run as.
+Each object contains a
+\(lqname:value\(rq
+pair and an optional
+\fInegated\fR
+entry, which will negate any comparison performed with the object.
+The name may be one of
+\fIrunasalias\fR,
+\fIusergid\fR,
+or
+\fIusergroup\fR.
+If
+\fIusergroup\fR
+is set to the special value
+\fBALL\fR,
+it will match any group.
+.sp
+The
+\fIOptions\fR
+array is of the same format as the one in the
+\fIDefaults\fR
+object.
+Any
+\fITag_Spec\fR
+entries in
+\fIsudoers\fR
+are converted to
+\fIOptions\fR.
+A user with
+\(lqsudo ALL\(rq
+privileges will automatically have the
+\fIsetenv\fR
+option enabled to match the implicit behavior provided by
+\fIsudoers\fR.
+.sp
+For example, the following
+\fIsudoers\fR
+entry:
+.nf
+.sp
+.RS 6n
+millert ALL = (ALL : ALL) NOPASSWD: ALL, !/usr/bin/id
+.RE
+.fi
+.sp
+converts to:
+.nf
+.sp
+.RS 6n
+"User_Specs": [
+ {
+ "User_List": [
+ { "username": "millert" }
+ ],
+ "Host_List": [
+ { "hostname": "ALL" }
+ ],
+ "Cmnd_Specs": [
+ {
+ "runasusers": [
+ { "username": "ALL" }
+ ],
+ "runasgroups": [
+ { "usergroup": "ALL" }
+ ],
+ "Options": [
+ { "authenticate": false },
+ { "setenv": true }
+ ],
+ "Commands": [
+ { "command": "ALL" },
+ {
+ "command": "/usr/bin/id",
+ "negated": true
+ }
+ ]
+ }
+ ]
+ }
+]
+.RE
+.fi
+.RE
+.SS "CSV output format"
+CSV (comma-separated value) files are often used by spreadsheets
+and report generators.
+For CSV output,
+\fBcvtsudoers\fR
+double quotes strings that contain commas.
+For each literal double quote character present inside the string,
+two double quotes are output.
+This method of quoting commas is compatible with most spreadsheet programs.
+.PP
+There are three possible sections in
+\fBcvtsudoers\fR's
+CSV output, each separated by a blank line:
+.TP 6n
+defaults
+This section includes any
+\fIDefaults\fR
+settings in
+\fIsudoers\fR.
+The
+\fIdefaults\fR
+section begins with the following heading:
+.nf
+.sp
+.RS 12n
+defaults_type,binding,name,operator,value
+.RE
+.fi
+.RS 6n
+.sp
+The fields are as follows:
+.TP 10n
+defaults_type
+The type of
+\fIDefaults\fR
+setting; one of
+\fIdefaults\fR,
+\fIdefaults_command\fR,
+\fIdefaults_host\fR,
+\fIdefaults_runas\fR,
+or
+\fIdefaults_user\fR.
+.TP 10n
+binding
+For
+\fIdefaults_command\fR,
+\fIdefaults_host\fR,
+\fIdefaults_runas\fR,
+and
+\fIdefaults_user\fR
+this is the value that must match for the setting to be applied.
+.TP 10n
+name
+The name of the
+\fIDefaults\fR
+setting.
+.TP 10n
+operator
+The operator determines how the value is applied to the setting.
+It may be either
+\(oq=\(cq
+(assignment),
+\(oq+=\(cq
+(append),
+or
+\(oq-=\(cq
+(remove).
+.TP 10n
+value
+The setting's value, usually a string or, for
+settings used in a boolean context,
+\fItrue\fR
+or
+\fIfalse\fR.
+.PD 0
+.PP
+.RE
+.PD
+.TP 6n
+aliases
+This section includes any
+\fICmnd_Alias\fR
+\fIHost_Alias\fR,
+\fIRunas_Alias\fR,
+or
+\fIUser_Alias\fR,
+entries from
+\fIsudoers\fR.
+The
+\fIaliases\fR
+section begins with the following heading:
+.nf
+.sp
+.RS 12n
+alias_type,alias_name,members
+.RE
+.fi
+.RS 6n
+.sp
+The fields are as follows:
+.TP 10n
+alias_type
+The type of alias; one of
+\fICmnd_Alias\fR,
+\fIHost_Alias\fR,
+\fIRunas_Alias\fR,
+or
+\fIUser_Alias\fR.
+.TP 10n
+alias_name
+The name of the alias; a string starting with an upper-case letter that
+consists of upper-case letters, digits, or underscores.
+.TP 10n
+members
+A comma-separated list of members belonging to the alias.
+Due to the use of commas,
+\fImembers\fR
+is surrounded by double quotes if it contains more than one member.
+.PD 0
+.PP
+.RE
+.PD
+.TP 6n
+rules
+.br
+This section includes the
+\fIsudoers\fR
+rules that grant privileges.
+The
+\fIrules\fR
+section begins with the following heading:
+.nf
+.sp
+.RS 12n
+rule,user,host,runusers,rungroups,options,command
+.RE
+.fi
+.RS 6n
+.sp
+The fields are as follows:
+.TP 10n
+rule
+This field indicates a
+\fIsudoers\fR
+\fIrule\fR
+entry.
+.TP 10n
+user
+The user the rule applies to.
+This may also be a Unix group (preceded by a
+\(oq%\(cq
+character), a non-Unix group (preceded by
+\(oq%:\(cq)
+or a netgroup (preceded by a
+\(oq+\(cq
+character)
+or a
+\fIUser_Alias\fR.
+If set to the special value
+\fBALL\fR,
+it will match any user.
+.TP 10n
+host
+The host the rule applies to.
+This may also be a netgroup (preceded by a
+\(oq+\(cq
+character)
+or a
+\fIHost_Alias\fR.
+If set to the special value
+\fBALL\fR,
+it will match any host.
+.TP 10n
+runusers
+An optional comma-separated list of users (or
+\fIRunas_Alias\fRes)
+the command may be run as.
+If it contains more than one member, the value is surrounded by
+double quotes.
+If set to the special value
+\fBALL\fR,
+it will match any user.
+If empty, the root user is assumed.
+.TP 10n
+rungroups
+.br
+An optional comma-separated list of groups (or
+\fIRunas_Alias\fRes)
+the command may be run as.
+If it contains more than one member, the value is surrounded by
+double quotes.
+If set to the special value
+\fBALL\fR,
+it will match any group.
+If empty, the
+\fIrunuser\fR's
+group is used.
+.TP 10n
+options
+An optional list of
+\fIDefaults\fR
+settings to apply to the command.
+Any
+\fITag_Spec\fR
+entries in
+\fIsudoers\fR
+are converted to
+\fIoptions\fR.
+.TP 10n
+commands
+A list of commands, with optional arguments, that the user is allowed to run.
+If set to the special value
+\fBALL\fR,
+it will match any command.
+.PP
+For example, the following
+\fIsudoers\fR
+entry:
+.nf
+.sp
+.RS 6n
+millert ALL = (ALL : ALL) NOPASSWD: ALL, !/usr/bin/id
+.RE
+.fi
+.sp
+converts to:
+.nf
+.sp
+.RS 6n
+rule,millert,ALL,ALL,ALL,"!authenticate","ALL,!/usr/bin/id"
+.RE
+.fi
+.RE
.SH "FILES"
.TP 26n
\fI@sysconfdir@/cvtsudoers.conf\fR
diff --git a/docs/cvtsudoers.mdoc.in b/docs/cvtsudoers.mdoc.in
index 7aa06868f..6d73a0987 100644
--- a/docs/cvtsudoers.mdoc.in
+++ b/docs/cvtsudoers.mdoc.in
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd February 16, 2022
+.Dd September 29, 2022
.Dt CVTSUDOERS 1
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -65,9 +65,8 @@ The options are as follows:
The base DN (distinguished name) that will be used when performing
LDAP queries.
Typically this is of the form
-.Li ou=SUDOers,dc=my-domain,dc=com
-for the domain
-.Li my-domain.com .
+.Dq ou=SUDOers,dc=my-domain,dc=com
+for the domain my-domain.com.
If this option is not specified, the value of the
.Ev SUDOERS_BASE
environment variable will be used instead.
@@ -78,10 +77,10 @@ Defaults to
.Pa @sysconfdir@/cvtsudoers.conf .
.It Fl d Ar deftypes , Fl -defaults Ns = Ns Ar deftypes
Only convert
-.Li Defaults
+.Em Defaults
entries of the specified types.
One or more
-.Li Defaults
+.Em Defaults
types may be specified, separated by a comma
.Pq Ql \&, .
The supported types are:
@@ -110,7 +109,7 @@ for more information.
If the
.Fl d
option is not specified, all
-.Li Defaults
+.Em Defaults
entries will be converted.
.It Fl e , Fl -expand-aliases
Expand aliases in
@@ -125,12 +124,9 @@ The following formats are supported:
.It CSV
CSV (comma-separated value) files are often used by spreadsheets
and report generators.
-For CSV output,
-.Nm
-double quotes strings that contain commas.
-For each literal double quote character present inside the string,
-two double quotes are output.
-This method of quoting commas is compatible with most spreadsheet programs.
+See
+.Sx CSV output format
+for more details.
.It JSON
JSON (JavaScript Object Notation) files are usually easier for
third-party applications to consume than the traditional
@@ -140,6 +136,9 @@ The various values have explicit types which removes much of the
ambiguity of the
.Em sudoers
format.
+See
+.Sx JSON output format
+for more details.
.It LDIF
LDIF (LDAP Data Interchange Format) files can be imported into an LDAP
server for use with
@@ -217,7 +216,12 @@ For example,
.Sy user No = Ar operator
or
.Sy host No = Ar www .
-An upper-case Cmnd_Alias, Host_alias, or Host_Alias may be specified as the
+An upper-case
+.Em Cmnd_Alias ,
+.Em Host_alias ,
+or
+.Em User_Alias
+may be specified as the
.Dq cmnd ,
.Dq host ,
or
@@ -360,9 +364,9 @@ subsequent aliases of the same name are renamed with a numeric suffix
separated with a underscore
.Pq Ql _ .
For example, if there are two different aliases named
-.Li SERVERS ,
+.Dv SERVERS ,
the first will be left as-is and the second will be renamed
-.Li SERVERS_1 .
+.Dv SERVERS_1 .
References to the renamed alias are also updated in the policy file.
Duplicate aliases (those with identical contents) are pruned.
.It
@@ -379,7 +383,7 @@ Per-user rules are merged and duplicates are removed.
If a host name is specified with the input file,
.Nm
will change rules that specify a host name of
-.Li ALL
+.Sy ALL
to the host name associated with the policy file being merged.
The merging of rules is currently fairly simplistic but will be
improved in a later release.
@@ -454,6 +458,656 @@ command line option.
.Pp
Options on the command line will override values from the
configuration file.
+.Ss JSON output format
+The
+.Em sudoers
+JSON format may contain any of the following top-level objects:
+.Bl -tag -width 4n
+.It Defaults
+An array of objects, each containing an
+.Em Options
+array and an optional
+.Em Binding
+array.
+.Pp
+The
+.Em Options
+array consists of one or more objects, each containing a
+.Dq name:value
+pair that corresponds to a
+.Em sudoers
+.Em Defaults
+setting.
+.Em Options
+that operate on a list will also include an
+.Em operation
+entry in the object, with a value of
+.Dq list_assign
+for
+.Ql = ,
+.Dq list_add
+for
+.Ql += ,
+or
+.Dq list_remove
+for
+.Ql -= .
+.Pp
+The optional
+.Em Binding
+array consists of one or more objects, each containing a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+If a
+.Em Binding
+is present, the setting will only take effect if one of the specified
+.Em command ,
+.Em hostname ,
+.Em netgroup ,
+.Em networkaddr ,
+.Em nonunixgid ,
+.Em nonunixgroup ,
+.Em usergid ,
+.Em usergroup ,
+.Em userid ,
+.Em username ,
+or alias entries match.
+.Pp
+For example, the following
+.Em sudoers
+entry:
+.Bd -literal
+Defaults@somehost set_home, env_keep += DISPLAY
+.Ed
+.Pp
+converts to:
+.Bd -literal
+"Defaults": [
+ {
+ "Binding": [
+ { "hostname": "somehost" }
+ ],
+ "Options": [
+ { "set_home": true },
+ {
+ "operation": "list_add",
+ "env_keep": [
+ "DISPLAY"
+ ]
+ }
+ ]
+ }
+]
+.Ed
+.It User_Aliases
+A JSON object containing one or more
+.Em sudoers
+.Em User_Alias
+entries where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be one of
+.Em netgroup ,
+.Em nonunixgid ,
+.Em nonunixgroup ,
+.Em useralias ,
+.Em usergid ,
+.Em usergroup ,
+.Em userid ,
+or
+.Em username .
+.Pp
+For example, the following
+.Em sudoers
+entry:
+.Bd -literal
+User_Alias SYSADMIN = will, %wheel, +admin
+.Ed
+.Pp
+converts to:
+.Bd -literal
+"User_Aliases": {
+ "SYSADMIN": [
+ { "username": "will" },
+ { "usergroup": "wheel" },
+ { "netgroup": "admin" }
+ ]
+}
+.Ed
+.It Runas_Aliases
+A JSON object containing one or more
+.Em sudoers
+.Em Runas_Alias
+entries, where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be one of
+.Em netgroup ,
+.Em nonunixgid ,
+.Em nonunixgroup ,
+.Em runasalias ,
+.Em usergid ,
+.Em usergroup ,
+.Em userid ,
+or
+.Em username .
+.Pp
+For example, the following
+.Em sudoers
+entry:
+.Bd -literal
+Runas_Alias DB = oracle, sybase : OP = root, operator
+.Ed
+.Pp
+converts to:
+.Bd -literal
+"Runas_Aliases": {
+ "DB": [
+ { "username": "oracle" },
+ { "username": "sybase" }
+ ],
+ "OP": [
+ { "username": "root" },
+ { "username": "operator" }
+ ]
+}
+.Ed
+.It Host_Aliases
+A JSON object containing one or more
+.Em sudoers
+.Em Host_Alias
+entries where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be one of
+.Em hostalias ,
+.Em hostname ,
+.Em netgroup ,
+or
+.Em networkaddr .
+.Pp
+For example, the following
+.Em sudoers
+entries:
+.Bd -literal
+Host_Alias DORMNET = 128.138.243.0, 128.138.204.0/24
+Host_Alias SERVERS = boulder, refuge
+.Ed
+.Pp
+convert to:
+.Bd -literal
+"Host_Aliases": {
+ "DORMNET": [
+ { "networkaddr": "128.138.243.0" },
+ { "networkaddr": "128.138.204.0/24" }
+ ],
+ "SERVERS": [
+ { "hostname": "boulder" },
+ { "hostname": "refuge" }
+ ]
+}
+.Ed
+.It Cmnd_Aliases
+A JSON object containing one or more
+.Em sudoers
+.Em Cmnd_Alias
+entries where each named alias has as its value an array
+containing one or more objects.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be either another
+.Em cmndalias
+or a
+.Em command .
+For example, the following
+.Em sudoers
+entries:
+.Bd -literal
+Cmnd_Alias SHELLS = /bin/bash, /bin/csh, /bin/sh, /bin/zsh
+Cmnd_Alias VIPW = /usr/bin/chpass, /usr/bin/chfn, /usr/bin/chsh, \e
+ /usr/bin/passwd, /usr/sbin/vigr, /usr/sbin/vipw
+.Ed
+.Pp
+convert to:
+.Bd -literal
+"Cmnd_Aliases": {
+ "SHELLS": [
+ { "command": "/bin/bash" },
+ { "command": "/bin/csh" },
+ { "command": "/bin/sh" },
+ { "command": "/bin/zsh" }
+ ],
+ "VIPW": [
+ { "command": "/usr/bin/chpass" },
+ { "command": "/usr/bin/chfn" },
+ { "command": "/usr/bin/chsh" },
+ { "command": "/usr/bin/passwd" },
+ { "command": "/usr/sbin/vigr" },
+ { "command": "/usr/sbin/vipw" }
+ ]
+}
+.Ed
+.It User_Specs
+A JSON array containing one or more objects, each representing a
+.Em sudoers
+User_Spec.
+Each object in the
+.Em User_Specs
+array should contain a
+.Em User_List
+array, a
+.Em Host_List
+array and a
+.Em Cmnd_Specs
+array.
+.Pp
+A
+.Em User_List
+consists of one or more objects.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be one of
+.Em netgroup ,
+.Em nonunixgid ,
+.Em nonunixgroup ,
+.Em useralias ,
+.Em usergid ,
+.Em usergroup ,
+.Em userid ,
+or
+.Em username .
+If
+.Em username
+is set to the special value
+.Sy ALL ,
+it will match any user.
+.Pp
+A
+.Em Host_List
+consists of one or more objects.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be one of
+.Em hostalias ,
+.Em hostname ,
+.Em netgroup ,
+or
+.Em networkaddr .
+If
+.Em hostname
+is set to the special value
+.Sy ALL ,
+it will match any host.
+.Pp
+The
+.Em Cmnd_Specs
+array consists of one or more JSON objects describing a command that
+may be run.
+Each
+.Em Cmnd_Specs
+is made up of a
+.Em Commands
+array, an optional
+.Em runasusers
+array, an optional
+.Em runasgroups
+array, and an optional
+.Em Options array.
+.Pp
+The
+.Em Commands
+array consists of one or more objects containing
+.Dq name:value
+pair elements.
+The following names and values are supported:
+.Bl -tag -width 8n
+.It command
+A string containing the command to run.
+The special value
+.Sy ALL
+it will match any command.
+.It negated
+A boolean value that, if true, will negate any comparison performed
+with the object.
+.It sha224
+A string containing the SHA224 digest of the
+.Em command .
+.It sha256
+A string containing the SHA256 digest of the
+.Em command .
+.It sha384
+A string containing the SHA384 digest of the
+.Em command .
+.It sha512
+A string containing the SHA512 digest of the
+.Em command .
+.El
+.Pp
+The
+.Em runasusers
+array consists of objects describing users the command may be run as.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be one of
+.Em netgroup ,
+.Em nonunixgid ,
+.Em nonunixgroup ,
+.Em runasalias ,
+.Em usergid ,
+.Em usergroup ,
+.Em userid ,
+or
+.Em username .
+If
+.Em username
+is set to the special value
+.Sy ALL ,
+it will match any user.
+If
+.Em username
+is set to the empty string
+.Dq "" ,
+it will match the invoking user.
+.Pp
+The
+.Em runasgroups
+array consists of objects describing groups the command may be run as.
+Each object contains a
+.Dq name:value
+pair and an optional
+.Em negated
+entry, which will negate any comparison performed with the object.
+The name may be one of
+.Em runasalias ,
+.Em usergid ,
+or
+.Em usergroup .
+If
+.Em usergroup
+is set to the special value
+.Sy ALL ,
+it will match any group.
+.Pp
+The
+.Em Options
+array is of the same format as the one in the
+.Em Defaults
+object.
+Any
+.Em Tag_Spec
+entries in
+.Em sudoers
+are converted to
+.Em Options .
+A user with
+.Dq sudo ALL
+privileges will automatically have the
+.Em setenv
+option enabled to match the implicit behavior provided by
+.Em sudoers .
+.Pp
+For example, the following
+.Em sudoers
+entry:
+.Bd -literal
+millert ALL = (ALL : ALL) NOPASSWD: ALL, !/usr/bin/id
+.Ed
+.Pp
+converts to:
+.Bd -literal
+"User_Specs": [
+ {
+ "User_List": [
+ { "username": "millert" }
+ ],
+ "Host_List": [
+ { "hostname": "ALL" }
+ ],
+ "Cmnd_Specs": [
+ {
+ "runasusers": [
+ { "username": "ALL" }
+ ],
+ "runasgroups": [
+ { "usergroup": "ALL" }
+ ],
+ "Options": [
+ { "authenticate": false },
+ { "setenv": true }
+ ],
+ "Commands": [
+ { "command": "ALL" },
+ {
+ "command": "/usr/bin/id",
+ "negated": true
+ }
+ ]
+ }
+ ]
+ }
+]
+.Ed
+.El
+.Ss CSV output format
+CSV (comma-separated value) files are often used by spreadsheets
+and report generators.
+For CSV output,
+.Nm
+double quotes strings that contain commas.
+For each literal double quote character present inside the string,
+two double quotes are output.
+This method of quoting commas is compatible with most spreadsheet programs.
+.Pp
+There are three possible sections in
+.Nm cvtsudoers Ns 's
+CSV output, each separated by a blank line:
+.Bl -tag -width 4n
+.It defaults
+This section includes any
+.Em Defaults
+settings in
+.Em sudoers .
+The
+.Em defaults
+section begins with the following heading:
+.Bd -literal -offset indent
+defaults_type,binding,name,operator,value
+.Ed
+.Pp
+The fields are as follows:
+.Bl -tag -width 8n
+.It defaults_type
+The type of
+.Em Defaults
+setting; one of
+.Em defaults ,
+.Em defaults_command ,
+.Em defaults_host ,
+.Em defaults_runas ,
+or
+.Em defaults_user .
+.It binding
+For
+.Em defaults_command ,
+.Em defaults_host ,
+.Em defaults_runas ,
+and
+.Em defaults_user
+this is the value that must match for the setting to be applied.
+.It name
+The name of the
+.Em Defaults
+setting.
+.It operator
+The operator determines how the value is applied to the setting.
+It may be either
+.Ql =
+(assignment),
+.Ql +=
+(append),
+or
+.Ql -=
+(remove).
+.It value
+The setting's value, usually a string or, for
+settings used in a boolean context,
+.Em true
+or
+.Em false .
+.El
+.It aliases
+This section includes any
+.Em Cmnd_Alias
+.Em Host_Alias ,
+.Em Runas_Alias ,
+or
+.Em User_Alias ,
+entries from
+.Em sudoers .
+The
+.Em aliases
+section begins with the following heading:
+.Bd -literal -offset indent
+alias_type,alias_name,members
+.Ed
+.Pp
+The fields are as follows:
+.Bl -tag -width 8n
+.It alias_type
+The type of alias; one of
+.Em Cmnd_Alias ,
+.Em Host_Alias ,
+.Em Runas_Alias ,
+or
+.Em User_Alias .
+.It alias_name
+The name of the alias; a string starting with an upper-case letter that
+consists of upper-case letters, digits, or underscores.
+.It members
+A comma-separated list of members belonging to the alias.
+Due to the use of commas,
+.Em members
+is surrounded by double quotes if it contains more than one member.
+.El
+.It rules
+This section includes the
+.Em sudoers
+rules that grant privileges.
+The
+.Em rules
+section begins with the following heading:
+.Bd -literal -offset indent
+rule,user,host,runusers,rungroups,options,command
+.Ed
+.Pp
+The fields are as follows:
+.Bl -tag -width 8n
+.It rule
+This field indicates a
+.Em sudoers
+.Em rule
+entry.
+.It user
+The user the rule applies to.
+This may also be a Unix group (preceded by a
+.Ql %
+character), a non-Unix group (preceded by
+.Ql %: )
+or a netgroup (preceded by a
+.Ql +
+character)
+or a
+.Em User_Alias .
+If set to the special value
+.Sy ALL ,
+it will match any user.
+.It host
+The host the rule applies to.
+This may also be a netgroup (preceded by a
+.Ql +
+character)
+or a
+.Em Host_Alias .
+If set to the special value
+.Sy ALL ,
+it will match any host.
+.It runusers
+An optional comma-separated list of users (or
+.Em Runas_Alias Ns No es )
+the command may be run as.
+If it contains more than one member, the value is surrounded by
+double quotes.
+If set to the special value
+.Sy ALL ,
+it will match any user.
+If empty, the root user is assumed.
+.It rungroups
+An optional comma-separated list of groups (or
+.Em Runas_Alias Ns No es )
+the command may be run as.
+If it contains more than one member, the value is surrounded by
+double quotes.
+If set to the special value
+.Sy ALL ,
+it will match any group.
+If empty, the
+.Em runuser Ns 's
+group is used.
+.It options
+An optional list of
+.Em Defaults
+settings to apply to the command.
+Any
+.Em Tag_Spec
+entries in
+.Em sudoers
+are converted to
+.Em options .
+.It commands
+A list of commands, with optional arguments, that the user is allowed to run.
+If set to the special value
+.Sy ALL ,
+it will match any command.
+.El
+.Pp
+For example, the following
+.Em sudoers
+entry:
+.Bd -literal
+millert ALL = (ALL : ALL) NOPASSWD: ALL, !/usr/bin/id
+.Ed
+.Pp
+converts to:
+.Bd -literal
+rule,millert,ALL,ALL,ALL,"!authenticate","ALL,!/usr/bin/id"
+.Ed
+.El
.Sh FILES
.Bl -tag -width 24n
.It Pa @sysconfdir@/cvtsudoers.conf
diff --git a/docs/schema.OpenLDAP b/docs/schema.OpenLDAP
index e1d525f84..451c5250a 100644
--- a/docs/schema.OpenLDAP
+++ b/docs/schema.OpenLDAP
@@ -7,9 +7,9 @@
attributetype ( 1.3.6.1.4.1.15953.9.1.1
NAME 'sudoUser'
DESC 'User(s) who may run sudo'
- EQUALITY caseExactIA5Match
- SUBSTR caseExactIA5SubstringsMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SUBSTR caseExactSubstringsMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.2
NAME 'sudoHost'
@@ -39,14 +39,14 @@ attributetype ( 1.3.6.1.4.1.15953.9.1.5
attributetype ( 1.3.6.1.4.1.15953.9.1.6
NAME 'sudoRunAsUser'
DESC 'User(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.7
NAME 'sudoRunAsGroup'
DESC 'Group(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.8
NAME 'sudoNotBefore'
diff --git a/docs/schema.iPlanet b/docs/schema.iPlanet
index e51286436..56ad02bc0 100644
--- a/docs/schema.iPlanet
+++ b/docs/schema.iPlanet
@@ -1,11 +1,11 @@
dn: cn=schema
-attributeTypes: ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
+attributeTypes: ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'SUDO' )
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
-attributeTypes: ( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
-attributeTypes: ( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
+attributeTypes: ( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'SUDO' )
+attributeTypes: ( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'SUDO' )
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Start of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
attributeTypes: ( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an integer to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
diff --git a/docs/schema.olcSudo b/docs/schema.olcSudo
index 8748dfc2a..8948ca4ae 100644
--- a/docs/schema.olcSudo
+++ b/docs/schema.olcSudo
@@ -9,9 +9,9 @@ cn: sudoschema
olcattributetypes: ( 1.3.6.1.4.1.15953.9.1.1
NAME 'sudoUser'
DESC 'User(s) who may run sudo'
- EQUALITY caseExactIA5Match
- SUBSTR caseExactIA5SubstringsMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SUBSTR caseExactSubstringsMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
#
olcattributetypes: ( 1.3.6.1.4.1.15953.9.1.2
NAME 'sudoHost'
@@ -41,14 +41,14 @@ olcattributetypes: ( 1.3.6.1.4.1.15953.9.1.5
olcattributetypes: ( 1.3.6.1.4.1.15953.9.1.6
NAME 'sudoRunAsUser'
DESC 'User(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
#
olcattributetypes: ( 1.3.6.1.4.1.15953.9.1.7
NAME 'sudoRunAsGroup'
DESC 'Group(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
#
olcattributetypes: ( 1.3.6.1.4.1.15953.9.1.8
NAME 'sudoNotBefore'
diff --git a/docs/sudo.conf.man.in b/docs/sudo.conf.man.in
index e5433a1b0..485c1fd02 100644
--- a/docs/sudo.conf.man.in
+++ b/docs/sudo.conf.man.in
@@ -70,17 +70,17 @@ Leading white space is removed from the beginning of lines
even when a continuation character is used.
.PP
Non-comment lines that don't begin with
-\fRPlugin\fR,
-\fRPath\fR,
-\fRDebug\fR,
+\fIPlugin\fR,
+\fIPath\fR,
+\fIDebug\fR,
or
-\fRSet\fR
+\fISet\fR
are silently ignored.
.PP
The
\fBsudo.conf\fR
file is always parsed in the
-\(lq\fRC\fR\(rq
+\(oqC\(cq
locale.
.SS "Plugin configuration"
\fBsudo\fR
@@ -94,9 +94,9 @@ Plugins are dynamically loaded based on the contents of
\fBsudo.conf\fR.
.PP
A
-\fRPlugin\fR
+\fIPlugin\fR
line consists of the
-\fRPlugin\fR
+\fIPlugin\fR
keyword, followed by the
\fIsymbol_name\fR
and the
@@ -105,14 +105,14 @@ to the dynamic shared object that contains the plugin.
The
\fIsymbol_name\fR
is the name of the
-\fRapproval_plugin\fR,
-\fRaudit_plugin\fR,
-\fRio_plugin\fR,
+\fIstruct approval_plugin\fR,
+\fIstruct audit_plugin\fR,
+\fIstruct io_plugin\fR,
or
-\fRpolicy_plugin\fR
-struct contained in the plugin.
+\fIstruct policy_plugin\fR
+defined by the plugin.
If a plugin implements multiple plugin types, there must be a
-\fRPlugin\fR
+\fIPlugin\fR
line for each unique symbol name.
The
\fIpath\fR
@@ -120,7 +120,7 @@ may be fully qualified or relative.
If not fully qualified, it is relative to the directory
specified by the
\fIplugin_dir\fR
-\fRPath\fR
+\fIPath\fR
setting, which defaults to
\fI@plugindir@\fR.
In other words:
@@ -182,7 +182,7 @@ This limitation does not apply to I/O plugins.
If no
\fBsudo.conf\fR
file is present, or if it contains no
-\fRPlugin\fR
+\fIPlugin\fR
lines, the
\fBsudoers\fR
plugin will be used as the default security policy, for I/O logging
@@ -221,9 +221,9 @@ sudo_plugin(@mansectform@)
manual.
.SS "Path settings"
A
-\fRPath\fR
+\fIPath\fR
line consists of the
-\fRPath\fR
+\fIPath\fR
keyword, followed by the name of the path to set and its value.
For example:
.nf
@@ -238,7 +238,7 @@ Path askpass /usr/X11R6/bin/ssh-askpass
If no path name is specified, features relying on the specified
setting will be disabled.
Disabling
-\fRPath\fR
+\fIPath\fR
settings is only supported in
\fBsudo\fR
version 1.8.16 and higher.
@@ -277,7 +277,7 @@ If terminal devices may be located in a sub-directory of
that path must be explicitly listed in
\fIdevsearch\fR.
The default value is
-\fR/dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev\fR
+\fI/dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev\fR
.sp
This option is ignored on systems that support either the
\fBdevname\fR()
@@ -290,15 +290,15 @@ macOS and Solaris.
intercept
.br
The fully-qualified path to a shared library containing a wrappers for the
-\fBexecl\fR(),
-\fBexecle\fR(),
-\fBexeclp\fR(),
-\fBexecv\fR(),
-\fBexecve\fR(),
-\fBexecvp\fR(),
-\fBexecvpe\fR(),
+execve(2),
+execl(3),
+execle(3),
+execlp(3),
+execv(3),
+execvp(3),
+execvpe(3),
and
-\fBsystem\fR()
+system(3)
library functions that intercepts attempts to run further commands and
performs a policy check before allowing them to be executed.
This is used to implement the
@@ -312,23 +312,23 @@ The default value is
noexec
The fully-qualified path to a shared library containing wrappers
for the
-\fBexecl\fR(),
-\fBexecle\fR(),
-\fBexeclp\fR(),
-\fBexect\fR(),
-\fBexecv\fR(),
-\fBexecve\fR(),
-\fBexecveat\fR(),
-\fBexecvP\fR(),
-\fBexecvp\fR(),
-\fBexecvpe\fR(),
-\fBfexecve\fR(),
-\fBpopen\fR(),
-\fBposix_spawn\fR(),
-\fBposix_spawnp\fR(),
-\fBsystem\fR(),
+execve(2),
+execl(3),
+execle(3),
+execlp(3),
+exect(3),
+execv(3),
+execveat(3),
+execvP(3),
+execvp(3),
+execvpe(3),
+fexecve(3),
+popen(3),
+posix_spawn(3),
+posix_spawnp(3),
+system(3),
and
-\fBwordexp\fR()
+wordexp(3)
library functions that prevent the execution of further commands.
This is used to implement the
\fInoexec\fR
@@ -569,9 +569,9 @@ that can log what
is doing internally if there is a problem.
.PP
A
-\fRDebug\fR
+\fIDebug\fR
line consists of the
-\fRDebug\fR
+\fIDebug\fR
keyword, followed by the name of the program, plugin, or shared object
to debug, the debug file name, and a comma-separated list of debug flags.
The debug flag syntax used by
@@ -613,25 +613,25 @@ intercept functionality on some systems.
As of
\fBsudo\fR
1.8.12, multiple
-\fRDebug\fR
+\fIDebug\fR
entries may be specified per program.
Older versions of
\fBsudo\fR
only support a single
-\fRDebug\fR
+\fIDebug\fR
entry per program.
Plugin-specific
-\fRDebug\fR
+\fIDebug\fR
entries are also supported starting with
\fBsudo\fR
1.8.12 and are matched by either the base name of the plugin that was loaded
(for example
-\fRsudoers.so\fR)
+\fIsudoers.so\fR)
or by the plugin's fully-qualified path name.
Previously, the
\fBsudoers\fR
plugin shared the same
-\fRDebug\fR
+\fIDebug\fR
entry as the
\fBsudo\fR
front-end and could not be configured separately.
diff --git a/docs/sudo.conf.mdoc.in b/docs/sudo.conf.mdoc.in
index add83a667..20c898edb 100644
--- a/docs/sudo.conf.mdoc.in
+++ b/docs/sudo.conf.mdoc.in
@@ -67,17 +67,17 @@ Leading white space is removed from the beginning of lines
even when a continuation character is used.
.Pp
Non-comment lines that don't begin with
-.Li Plugin ,
-.Li Path ,
-.Li Debug ,
+.Em Plugin ,
+.Em Path ,
+.Em Debug ,
or
-.Li Set
+.Em Set
are silently ignored.
.Pp
The
.Nm
file is always parsed in the
-.Dq Li C
+.Ql C
locale.
.Ss Plugin configuration
.Nm sudo
@@ -91,9 +91,9 @@ Plugins are dynamically loaded based on the contents of
.Nm .
.Pp
A
-.Li Plugin
+.Em Plugin
line consists of the
-.Li Plugin
+.Em Plugin
keyword, followed by the
.Em symbol_name
and the
@@ -102,14 +102,14 @@ to the dynamic shared object that contains the plugin.
The
.Em symbol_name
is the name of the
-.Li approval_plugin ,
-.Li audit_plugin ,
-.Li io_plugin ,
+.Vt struct approval_plugin ,
+.Vt struct audit_plugin ,
+.Vt struct io_plugin ,
or
-.Li policy_plugin
-struct contained in the plugin.
+.Vt struct policy_plugin
+defined by the plugin.
If a plugin implements multiple plugin types, there must be a
-.Li Plugin
+.Em Plugin
line for each unique symbol name.
The
.Em path
@@ -117,7 +117,7 @@ may be fully qualified or relative.
If not fully qualified, it is relative to the directory
specified by the
.Em plugin_dir
-.Li Path
+.Em Path
setting, which defaults to
.Pa @plugindir@ .
In other words:
@@ -167,7 +167,7 @@ This limitation does not apply to I/O plugins.
If no
.Nm
file is present, or if it contains no
-.Li Plugin
+.Em Plugin
lines, the
.Nm sudoers
plugin will be used as the default security policy, for I/O logging
@@ -203,9 +203,9 @@ plugin architecture, see the
manual.
.Ss Path settings
A
-.Li Path
+.Em Path
line consists of the
-.Li Path
+.Em Path
keyword, followed by the name of the path to set and its value.
For example:
.Bd -literal -offset 4n
@@ -217,7 +217,7 @@ Path askpass /usr/X11R6/bin/ssh-askpass
If no path name is specified, features relying on the specified
setting will be disabled.
Disabling
-.Li Path
+.Em Path
settings is only supported in
.Nm sudo
version 1.8.16 and higher.
@@ -254,7 +254,7 @@ If terminal devices may be located in a sub-directory of
that path must be explicitly listed in
.Em devsearch .
The default value is
-.Li /dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev
+.Pa /dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev
.Pp
This option is ignored on systems that support either the
.Fn devname
@@ -265,15 +265,15 @@ functions, for example
macOS and Solaris.
.It intercept
The fully-qualified path to a shared library containing a wrappers for the
-.Fn execl ,
-.Fn execle ,
-.Fn execlp ,
-.Fn execv ,
-.Fn execve ,
-.Fn execvp ,
-.Fn execvpe ,
+.Xr execve 2 ,
+.Xr execl 3 ,
+.Xr execle 3 ,
+.Xr execlp 3 ,
+.Xr execv 3 ,
+.Xr execvp 3 ,
+.Xr execvpe 3 ,
and
-.Fn system
+.Xr system 3
library functions that intercepts attempts to run further commands and
performs a policy check before allowing them to be executed.
This is used to implement the
@@ -286,23 +286,23 @@ The default value is
.It noexec
The fully-qualified path to a shared library containing wrappers
for the
-.Fn execl ,
-.Fn execle ,
-.Fn execlp ,
-.Fn exect ,
-.Fn execv ,
-.Fn execve ,
-.Fn execveat ,
-.Fn execvP ,
-.Fn execvp ,
-.Fn execvpe ,
-.Fn fexecve ,
-.Fn popen ,
-.Fn posix_spawn ,
-.Fn posix_spawnp ,
-.Fn system ,
+.Xr execve 2 ,
+.Xr execl 3 ,
+.Xr execle 3 ,
+.Xr execlp 3 ,
+.Xr exect 3 ,
+.Xr execv 3 ,
+.Xr execveat 3 ,
+.Xr execvP 3 ,
+.Xr execvp 3 ,
+.Xr execvpe 3 ,
+.Xr fexecve 3 ,
+.Xr popen 3 ,
+.Xr posix_spawn 3 ,
+.Xr posix_spawnp 3 ,
+.Xr system 3 ,
and
-.Fn wordexp
+.Xr wordexp 3
library functions that prevent the execution of further commands.
This is used to implement the
.Em noexec
@@ -519,9 +519,9 @@ that can log what
is doing internally if there is a problem.
.Pp
A
-.Li Debug
+.Em Debug
line consists of the
-.Li Debug
+.Em Debug
keyword, followed by the name of the program, plugin, or shared object
to debug, the debug file name, and a comma-separated list of debug flags.
The debug flag syntax used by
@@ -557,25 +557,25 @@ intercept functionality on some systems.
As of
.Nm sudo
1.8.12, multiple
-.Li Debug
+.Em Debug
entries may be specified per program.
Older versions of
.Nm sudo
only support a single
-.Li Debug
+.Em Debug
entry per program.
Plugin-specific
-.Li Debug
+.Em Debug
entries are also supported starting with
.Nm sudo
1.8.12 and are matched by either the base name of the plugin that was loaded
(for example
-.Li sudoers.so )
+.Pa sudoers.so )
or by the plugin's fully-qualified path name.
Previously, the
.Nm sudoers
plugin shared the same
-.Li Debug
+.Em Debug
entry as the
.Nm sudo
front-end and could not be configured separately.
diff --git a/docs/sudo.man.in b/docs/sudo.man.in
index 15a07c0ac..8b95deefe 100644
--- a/docs/sudo.man.in
+++ b/docs/sudo.man.in
@@ -25,7 +25,7 @@
.nr BA @BAMAN@
.nr LC @LCMAN@
.nr PS @PSMAN@
-.TH "SUDO" "@mansectsu@" "February 16, 2022" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
+.TH "SUDO" "@mansectsu@" "September 13, 2022" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -41,7 +41,7 @@
.HP 5n
\fBsudo\fR
\fB\-v\fR
-[\fB\-ABknS\fR]
+[\fB\-ABkNnS\fR]
.if \n(BA [\fB\-a\fR\ \fItype\fR]
[\fB\-g\fR\ \fIgroup\fR]
[\fB\-h\fR\ \fIhost\fR]
@@ -51,7 +51,7 @@
.HP 5n
\fBsudo\fR
\fB\-l\fR
-[\fB\-ABknS\fR]
+[\fB\-ABkNnS\fR]
.if \n(BA [\fB\-a\fR\ \fItype\fR]
[\fB\-g\fR\ \fIgroup\fR]
[\fB\-h\fR\ \fIhost\fR]
@@ -81,7 +81,7 @@
.br
.HP 9n
\fBsudoedit\fR
-[\fB\-ABknS\fR]
+[\fB\-ABkNnS\fR]
.if \n(BA [\fB\-a\fR\ \fItype\fR]
[\fB\-C\fR\ \fInum\fR]
.if \n(LC [\fB\-c\fR\ \fIclass\fR]
@@ -135,9 +135,7 @@ time limit.
This limit is policy-specific; the default password prompt timeout
for the
\fIsudoers\fR
-security policy is
-\fR@password_timeout@\fR
-minutes.
+security policy is @password_timeout@ minutes.
.PP
Security policies may support credential caching to allow the user
to run
@@ -145,9 +143,7 @@ to run
again for a period of time without requiring authentication.
By default, the
\fIsudoers\fR
-policy caches credentials on a per-terminal basis for
-\fR@timeout@\fR
-minutes.
+policy caches credentials on a per-terminal basis for @timeout@ minutes.
See the
\fItimestamp_type\fR
and
@@ -399,7 +395,7 @@ may be either a group name or a numeric group-ID
prefixed with the
\(oq#\(cq
character (e.g.,
-\fR#0\fR
+\(oq#0\(cq
for GID 0).
When running a command as a GID, many shells require that the
\(oq#\(cq
@@ -532,6 +528,22 @@ is specified but not allowed by the policy,
\fBsudo\fR
will exit with a status value of 1.
.TP 12n
+\fB\-N\fR, \fB\--no-update\fR
+Do not update the user's cached credentials, even if the user successfully
+authenticates.
+Unlike the
+\fB\-k\fR
+flag, existing cached credentials are used if they are valid.
+To detect when the user's cached credentials are valid (or when no
+authentication is required), the following command can be used:
+.RS 18n
+sudo -Nnv
+.RE
+.RS 12n
+.sp
+Not all security policies support credential caching.
+.RE
+.TP 12n
\fB\-n\fR, \fB\--non-interactive\fR
Avoid prompting the user for input of any kind.
If a password is required for the command to run,
@@ -558,7 +570,7 @@ policy:
.RS 12n
.PD 0
.TP 4n
-\fR%H\fR
+%H
expanded to the host name including the domain name (only if the
machine's host name is fully qualified or the
\fIfqdn\fR
@@ -566,10 +578,10 @@ option is set in
sudoers(@mansectform@))
.PD
.TP 4n
-\fR%h\fR
+%h
expanded to the local host name without the domain name
.TP 4n
-\fR%p\fR
+%p
expanded to the name of the user whose password is being requested
(respects the
\fIrootpw\fR,
@@ -579,16 +591,16 @@ and
flags in
sudoers(@mansectform@))
.TP 4n
-\fR\&%U\fR
+\&%U
expanded to the login name of the user the command will be run as
(defaults to root unless the
\fB\-u\fR
option is also specified)
.TP 4n
-\fR%u\fR
+%u
expanded to the invoking user's login name
.TP 4n
-\fR%%\fR
+%%
two consecutive
\(oq%\(cq
characters are collapsed into a single
@@ -691,7 +703,7 @@ may be either a user name or a numeric user-ID
prefixed with the
\(oq#\(cq
character (e.g.,
-\fR#0\fR
+\(oq#0\(cq
for UID 0).
When running commands as a UID, many shells require that the
\(oq#\(cq
@@ -724,9 +736,7 @@ For the
\fIsudoers\fR
plugin, this extends the
\fBsudo\fR
-timeout for another
-\fR@timeout@\fR
-minutes by default, but does not run a command.
+timeout for another @timeout@ minutes by default, but does not run a command.
Not all security policies support cached credentials.
.TP 12n
\fB\--\fR
@@ -762,7 +772,7 @@ option is set in
the command to be run has the
\fRSETENV\fR
tag set or the command matched is
-\fRALL\fR,
+\fBALL\fR,
the user may set variables that would otherwise be forbidden.
See
sudoers(@mansectform@)
@@ -970,7 +980,7 @@ run in a new pty,
may execute the command directly instead of running it as a child process.
.SS "Plugins"
Plugins may be specified via
-\fRPlugin\fR
+\fIPlugin\fR
directives in the
sudo.conf(@mansectform@)
file.
@@ -981,7 +991,7 @@ binary.
If no
sudo.conf(@mansectform@)
file is present, or if it doesn't contain any
-\fRPlugin\fR
+\fIPlugin\fR
lines,
\fBsudo\fR
will use
@@ -1070,9 +1080,9 @@ By default,
\fBsudo\fR
will only log the command it explicitly runs.
If a user runs a command such as
-\fRsudo su\fR
+\(oqsudo su\(cq
or
-\fRsudo sh\fR,
+\(oqsudo sh\(cq,
subsequent commands run from that shell are not subject to
\fBsudo\fR's
security policy.
@@ -1160,7 +1170,7 @@ or when
is enabled in
\fIsudoers\fR
and
-\fIHOME\fR
+\fRHOME\fR
is not present in the
\fIenv_keep\fR
list.
@@ -1210,8 +1220,7 @@ Default editor to use in
Set to the group-ID of the user who invoked sudo.
.TP 17n
\fRSUDO_PROMPT\fR
-Used as the default password prompt unless
-the
+Used as the default password prompt unless the
\fB\-p\fR
option was specified.
.TP 17n
@@ -1299,7 +1308,7 @@ $ sudo shutdown -r +15 "quick reboot"
.PP
To make a usage listing of the directories in the /home partition.
The commands are run in a sub-shell to allow the
-\fRcd\fR
+\(oqcd\(cq
command and file redirection to work.
.nf
.sp
@@ -1484,7 +1493,7 @@ plugin's
functionality.
.PP
It is not meaningful to run the
-\fRcd\fR
+\(oqcd\(cq
command directly via sudo, e.g.,
.nf
.sp
diff --git a/docs/sudo.mdoc.in b/docs/sudo.mdoc.in
index 3b1914aa2..82985f2da 100644
--- a/docs/sudo.mdoc.in
+++ b/docs/sudo.mdoc.in
@@ -24,7 +24,7 @@
.nr BA @BAMAN@
.nr LC @LCMAN@
.nr PS @PSMAN@
-.Dd February 16, 2022
+.Dd September 13, 2022
.Dt SUDO @mansectsu@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -36,7 +36,7 @@
.Fl h | K | k | V
.Nm sudo
.Fl v
-.Op Fl ABknS
+.Op Fl ABkNnS
.if \n(BA \{\
.Op Fl a Ar type
.\}
@@ -46,7 +46,7 @@
.Op Fl u Ar user
.Nm sudo
.Fl l
-.Op Fl ABknS
+.Op Fl ABkNnS
.if \n(BA \{\
.Op Fl a Ar type
.\}
@@ -80,7 +80,7 @@
.Op Fl i | s
.Op Ar command
.Nm sudoedit
-.Op Fl ABknS
+.Op Fl ABkNnS
.if \n(BA \{\
.Op Fl a Ar type
.\}
@@ -139,9 +139,7 @@ time limit.
This limit is policy-specific; the default password prompt timeout
for the
.Em sudoers
-security policy is
-.Li @password_timeout@
-minutes.
+security policy is @password_timeout@ minutes.
.Pp
Security policies may support credential caching to allow the user
to run
@@ -149,9 +147,7 @@ to run
again for a period of time without requiring authentication.
By default, the
.Em sudoers
-policy caches credentials on a per-terminal basis for
-.Li @timeout@
-minutes.
+policy caches credentials on a per-terminal basis for @timeout@ minutes.
See the
.Em timestamp_type
and
@@ -380,7 +376,7 @@ may be either a group name or a numeric group-ID
prefixed with the
.Ql #
character (e.g.,
-.Li #0
+.Ql #0
for GID 0).
When running a command as a GID, many shells require that the
.Ql #
@@ -505,6 +501,17 @@ If a
is specified but not allowed by the policy,
.Nm
will exit with a status value of 1.
+.It Fl N , -no-update
+Do not update the user's cached credentials, even if the user successfully
+authenticates.
+Unlike the
+.Fl k
+flag, existing cached credentials are used if they are valid.
+To detect when the user's cached credentials are valid (or when no
+authentication is required), the following command can be used:
+.Dl sudo -Nnv
+.Pp
+Not all security policies support credential caching.
.It Fl n , -non-interactive
Avoid prompting the user for input of any kind.
If a password is required for the command to run,
@@ -526,15 +533,15 @@ escape sequences are supported by the
.Em sudoers
policy:
.Bl -tag -width 2n
-.It Li %H
+.It %H
expanded to the host name including the domain name (only if the
machine's host name is fully qualified or the
.Em fqdn
option is set in
.Xr sudoers @mansectform@ )
-.It Li %h
+.It %h
expanded to the local host name without the domain name
-.It Li %p
+.It %p
expanded to the name of the user whose password is being requested
(respects the
.Em rootpw ,
@@ -543,14 +550,14 @@ and
.Em runaspw
flags in
.Xr sudoers @mansectform@ )
-.It Li \&%U
+.It \&%U
expanded to the login name of the user the command will be run as
(defaults to root unless the
.Fl u
option is also specified)
-.It Li %u
+.It %u
expanded to the invoking user's login name
-.It Li %%
+.It %%
two consecutive
.Ql %
characters are collapsed into a single
@@ -645,7 +652,7 @@ may be either a user name or a numeric user-ID
prefixed with the
.Ql #
character (e.g.,
-.Li #0
+.Ql #0
for UID 0).
When running commands as a UID, many shells require that the
.Ql #
@@ -676,9 +683,7 @@ For the
.Em sudoers
plugin, this extends the
.Nm
-timeout for another
-.Li @timeout@
-minutes by default, but does not run a command.
+timeout for another @timeout@ minutes by default, but does not run a command.
Not all security policies support cached credentials.
.It Fl -
The
@@ -712,9 +717,9 @@ If the
option is set in
.Em sudoers ,
the command to be run has the
-.Li SETENV
+.Dv SETENV
tag set or the command matched is
-.Li ALL ,
+.Sy ALL ,
the user may set variables that would otherwise be forbidden.
See
.Xr sudoers @mansectform@
@@ -911,7 +916,7 @@ run in a new pty,
may execute the command directly instead of running it as a child process.
.Ss Plugins
Plugins may be specified via
-.Li Plugin
+.Em Plugin
directives in the
.Xr sudo.conf @mansectform@
file.
@@ -922,7 +927,7 @@ binary.
If no
.Xr sudo.conf @mansectform@
file is present, or if it doesn't contain any
-.Li Plugin
+.Em Plugin
lines,
.Nm
will use
@@ -1011,9 +1016,9 @@ By default,
.Nm
will only log the command it explicitly runs.
If a user runs a command such as
-.Li sudo su
+.Ql sudo su
or
-.Li sudo sh ,
+.Ql sudo sh ,
subsequent commands run from that shell are not subject to
.Nm sudo Ns 's
security policy.
@@ -1096,7 +1101,7 @@ or when
is enabled in
.Em sudoers
and
-.Em HOME
+.Ev HOME
is not present in the
.Em env_keep
list.
@@ -1138,8 +1143,7 @@ Default editor to use in
.It Ev SUDO_GID
Set to the group-ID of the user who invoked sudo.
.It Ev SUDO_PROMPT
-Used as the default password prompt unless
-the
+Used as the default password prompt unless the
.Fl p
option was specified.
.It Ev SUDO_PS1
@@ -1206,7 +1210,7 @@ $ sudo shutdown -r +15 "quick reboot"
.Pp
To make a usage listing of the directories in the /home partition.
The commands are run in a sub-shell to allow the
-.Li cd
+.Ql cd
command and file redirection to work.
.Bd -literal -offset 4n
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
@@ -1374,7 +1378,7 @@ plugin's
functionality.
.Pp
It is not meaningful to run the
-.Li cd
+.Ql cd
command directly via sudo, e.g.,
.Bd -literal -offset 4n
$ sudo cd /usr/local/protected
diff --git a/docs/sudo_logsrv.proto.man.in b/docs/sudo_logsrv.proto.man.in
index 5e0e1a91e..fadb8b6ec 100644
--- a/docs/sudo_logsrv.proto.man.in
+++ b/docs/sudo_logsrv.proto.man.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "SUDO_LOGSRV.PROTO" "@mansectform@" "February 16, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDO_LOGSRV.PROTO" "@mansectform@" "September 13, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -93,7 +93,7 @@ message TimeSpec {
A
\fITimeSpec\fR
is the equivalent of a POSIX
-\fRstruct timespec\fR,
+\fIstruct timespec\fR,
containing seconds and nanoseconds members.
The
\fItv_sec\fR
diff --git a/docs/sudo_logsrv.proto.mdoc.in b/docs/sudo_logsrv.proto.mdoc.in
index af9239c29..daa4a551b 100644
--- a/docs/sudo_logsrv.proto.mdoc.in
+++ b/docs/sudo_logsrv.proto.mdoc.in
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd February 16, 2022
+.Dd September 13, 2022
.Dt SUDO_LOGSRV.PROTO @mansectform@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -87,7 +87,7 @@ message TimeSpec {
A
.Em TimeSpec
is the equivalent of a POSIX
-.Li struct timespec ,
+.Vt struct timespec ,
containing seconds and nanoseconds members.
The
.Em tv_sec
@@ -237,10 +237,10 @@ If the command was terminated by a signal, this is set to the
name of the signal without the leading
.Dq SIG .
For example,
-.Li INT ,
-.Li TERM ,
-.Li KILL ,
-.Li SEGV .
+.Dv INT ,
+.Dv TERM ,
+.Dv KILL ,
+.Dv SEGV .
.It error
A message from the client indicating that the command was terminated
unexpectedly due to an error.
@@ -397,9 +397,9 @@ should be calculated using a monotonic clock where possible.
The signal name without the leading
.Dq SIG .
For example,
-.Li STOP ,
-.Li TSTP ,
-.Li CONT .
+.Dv STOP ,
+.Dv TSTP ,
+.Dv CONT .
.El
.Sh Server Messages
A
diff --git a/docs/sudo_logsrvd.conf.man.in b/docs/sudo_logsrvd.conf.man.in
index 84b5b03e8..ccdcca481 100644
--- a/docs/sudo_logsrvd.conf.man.in
+++ b/docs/sudo_logsrvd.conf.man.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "SUDO_LOGSRVD.CONF" "@mansectform@" "February 16, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDO_LOGSRVD.CONF" "@mansectform@" "September 13, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -168,14 +168,16 @@ will enable the TCP keepalive socket option on the client connection.
This enables the periodic transmission of keepalive messages to the client.
If the client does not respond to a message in time, the connection will
be closed.
-Defaults to true.
+Defaults to
+\fItrue\fR.
.TP 10n
timeout = number
The amount of time, in seconds,
\fBsudo_logsrvd\fR
will wait for the client to respond.
A value of 0 will disable the timeout.
-The default value is 30.
+The default value is
+\fI30\fR.
.TP 10n
tls_cacert = path
The path to a certificate authority bundle file, in PEM format,
@@ -202,7 +204,7 @@ authority, the
setting must be set to a CA bundle that contains the CA certificate
used to generate the client certificate.
The default value is
-\fRfalse\fR.
+\fIfalse\fR.
.TP 10n
tls_ciphers_v12 = string
A list of ciphers to use for connections secured by TLS version 1.2 only,
@@ -214,7 +216,7 @@ section in
openssl-ciphers(1)
for full details.
The default value is
-\fRHIGH:!aNULL\fR
+\(lqHIGH:!aNULL\(rq
which consists of encryption cipher suites with key lengths larger than
128 bits, and some cipher suites with 128-bit keys.
Cipher suites that offer no authentication are excluded.
@@ -241,7 +243,8 @@ TLS_AES_128_CCM_8_SHA256
.RE
.RS 10n
.sp
-The default cipher suite is TLS_AES_256_GCM_SHA384.
+The default cipher suite is
+\(lqTLS_AES_256_GCM_SHA384\(rq.
.RE
.PD
.TP 10n
@@ -274,7 +277,8 @@ configuration is changed.
If false, no verification is performed of the server certificate.
When using self-signed certificates without a certificate authority,
this setting should be set to false.
-The default value is true.
+The default value is
+\fItrue\fR.
.SS "relay"
The
\fIrelay\fR
@@ -301,7 +305,8 @@ setting controls the amount of time
\fBsudo_logsrvd\fR
will wait for the relay to respond.
A value of 0 will disable the timeout.
-The default value is 30.
+The default value is
+\fI30\fR.
.TP 10n
relay_dir = path
The directory in which log messages are temporarily stored before they
@@ -339,7 +344,8 @@ lines are specified, the first available relay host will be used.
retry_interval = number
The number of seconds to wait after a connection error before making
a new attempt to forward a message to a relay host.
-The default value is 30 seconds.
+The default value is
+\fI30\fR.
.TP 10n
store_first = boolean
If true,
@@ -365,7 +371,8 @@ The amount of time, in seconds,
\fBsudo_logsrvd\fR
will wait for the relay server to respond after a connection has succeeded.
A value of 0 will disable the timeout.
-The default value is 30.
+The default value is
+\fI30\fR.
.TP 10n
tls_cacert = path
The path to a certificate authority bundle file, in PEM format,
@@ -455,7 +462,7 @@ If set, I/O logs will be compressed using
Enabling compression can make it harder to view the logs in real-time as
the program is executing due to buffering.
The default value is
-\fRfalse\fR.
+\fIfalse\fR.
.TP 10n
iolog_dir = path
The top-level directory to use when constructing the path
@@ -471,30 +478,30 @@ escape sequences are supported:
.RS 10n
.PD 0
.TP 6n
-\fR%{seq}\fR
+%{seq}
expanded to a monotonically increasing base-36 sequence number, such as 0100A5,
where every two digits are used to form a new directory, e.g.,
\fI01/00/A5\fR
.PD
.TP 6n
-\fR%{user}\fR
+%{user}
expanded to the invoking user's login name
.TP 6n
-\fR%{group}\fR
+%{group}
expanded to the name of the invoking user's real group-ID
.TP 6n
-\fR%{runas_user}\fR
+%{runas_user}
expanded to the login name of the user the command will
be run as (e.g., root)
.TP 6n
-\fR%{runas_group}\fR
+%{runas_group}
expanded to the group name of the user the command will
be run as (e.g., wheel)
.TP 6n
-\fR%{hostname}\fR
+%{hostname}
expanded to the local host name without the domain name
.TP 6n
-\fR%{command}\fR
+%{command}
expanded to the base name of the command being run
.PP
In addition, any escape sequences supported by the system's
@@ -516,7 +523,7 @@ It is possible for
\fIiolog_file\fR
to contain directory components.
The default value is
-\fR%{seq}\fR.
+\(lq%{seq}\(rq.
.sp
See the
\fIiolog_dir\fR
@@ -526,9 +533,9 @@ escape sequences.
.sp
In addition to the escape sequences, path names that end in six or
more
-\fRX\fRs
+\fIX\fRs
will have the
-\fRX\fRs
+\fIX\fRs
replaced with a unique combination of digits and letters, similar to the
mktemp(3)
function.
@@ -542,7 +549,7 @@ overwritten unless
\fIiolog_file\fR
ends in six or
more
-\fRX\fRs.
+\fIX\fRs.
.TP 10n
iolog_flush = boolean
If set, I/O log data is flushed to disk after each write instead of
@@ -553,7 +560,7 @@ of I/O log compression.
I/O logs are always flushed before sending a commit point to the client
regardless of this setting.
The default value is
-\fRtrue\fR.
+\fItrue\fR.
.TP 10n
iolog_group = name
The group name to look up when setting the group-ID on new I/O log
@@ -579,7 +586,7 @@ When creating I/O log directories, search (execute) bits are added
to match the read and write bits specified by
\fIiolog_mode\fR.
The default value is
-\fR0600\fR.
+\fI0600\fR.
.TP 10n
iolog_user = name
The user name to look up when setting the owner of new
@@ -599,7 +606,7 @@ the password will still be present in the I/O log.
If
\fIlog_passwords\fR
is set to
-\fRfalse\fR,
+\fIfalse\fR,
\fBsudo_logsrvd\fR
will attempt to prevent passwords from being logged.
It does this by using the regular expressions in
@@ -617,16 +624,16 @@ when the
option is set), only the
first character of the password will be replaced in the I/O log.
The default value is
-\fRtrue\fR.
+\fItrue\fR.
.TP 10n
maxseq = number
The maximum sequence number that will be substituted for the
-\(lq\fR%{seq}\fR\(rq
+\(lq%{seq}\(rq
escape in the I/O log file (see the
\fIiolog_dir\fR
description above for more information).
While the value substituted for
-\(lq\fR%{seq}\fR\(rq
+\(lq%{seq}\(rq
is in base 36,
\fImaxseq\fR
itself should be expressed in decimal.
@@ -634,7 +641,8 @@ Values larger than 2176782336 (which corresponds to the
base 36 sequence number
\(lqZZZZZZ\(rq)
will be silently truncated to 2176782336.
-The default value is 2176782336.
+The default value is
+\fI2176782336\fR.
.TP 10n
passprompt_regex = string
One or more POSIX extended regular expressions used to
@@ -669,7 +677,8 @@ log_exit = boolean
If true,
\fBsudo_logsrvd\fR
will log an event when a command exits or is terminated by a signal.
-Defaults to false.
+Defaults to
+\fIfalse\fR.
.TP 6n
log_format = string
The event log format.
@@ -691,7 +700,7 @@ syslog(3).
facility = string
Syslog facility if syslog is being used for logging.
Defaults to
-\fR@logfac@\fR.
+\fI@logfac@\fR.
.sp
The following syslog facilities are supported:
\fBauthpriv\fR
@@ -714,7 +723,7 @@ accept_priority = string
Syslog priority to use when the user is allowed to run a command and
authentication is successful.
Defaults to
-\fR@goodpri@\fR.
+\fI@goodpri@\fR.
.sp
The following syslog priorities are supported:
\fBalert\fR,
@@ -735,7 +744,7 @@ reject_priority = string
Syslog priority to use when the user is not allowed to run a command or
when authentication is unsuccessful.
Defaults to
-\fR@badpri@\fR.
+\fI@badpri@\fR.
.sp
See
\fIaccept_priority\fR
@@ -744,7 +753,7 @@ for the list of supported syslog priorities.
alert_priority = string
Syslog priority to use for event log alert messages received from the client.
Defaults to
-\fR@badpri@\fR.
+\fI@badpri@\fR.
.sp
See
\fIaccept_priority\fR
@@ -779,7 +788,7 @@ server_facility = string
Syslog facility if syslog is being used for server warning messages.
See above for a list of supported facilities.
Defaults to
-\fRdaemon\fR
+\fIdaemon\fR
.SS "logfile"
The
\fIlogfile\fR
@@ -800,10 +809,12 @@ Formatting is performed via the system's
strftime(3)
function so any escape sequences supported by that function will be expanded.
The default value is
-\(lq\fR%h %e %T\fR\(rq
+\(lq%h %e %T\(rq
which produces dates like
\(lqOct 3 07:15:24\(rq
-in the C locale.
+in the
+\(oqC\(cq
+locale.
.SH "FILES"
.TP 26n
\fI@sysconfdir@/sudo_logsrvd.conf\fR
diff --git a/docs/sudo_logsrvd.conf.mdoc.in b/docs/sudo_logsrvd.conf.mdoc.in
index ba017e1a5..d3a388d99 100644
--- a/docs/sudo_logsrvd.conf.mdoc.in
+++ b/docs/sudo_logsrvd.conf.mdoc.in
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd February 16, 2022
+.Dd September 13, 2022
.Dt SUDO_LOGSRVD.CONF @mansectform@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -152,13 +152,15 @@ will enable the TCP keepalive socket option on the client connection.
This enables the periodic transmission of keepalive messages to the client.
If the client does not respond to a message in time, the connection will
be closed.
-Defaults to true.
+Defaults to
+.Em true .
.It timeout = number
The amount of time, in seconds,
.Nm sudo_logsrvd
will wait for the client to respond.
A value of 0 will disable the timeout.
-The default value is 30.
+The default value is
+.Em 30 .
.It tls_cacert = path
The path to a certificate authority bundle file, in PEM format,
to use instead of the system's default certificate authority database
@@ -182,7 +184,7 @@ authority, the
setting must be set to a CA bundle that contains the CA certificate
used to generate the client certificate.
The default value is
-.Li false .
+.Em false .
.It tls_ciphers_v12 = string
A list of ciphers to use for connections secured by TLS version 1.2 only,
separated by a colon
@@ -193,7 +195,7 @@ section in
.Xr openssl-ciphers 1
for full details.
The default value is
-.Li HIGH:!aNULL
+.Dq HIGH:!aNULL
which consists of encryption cipher suites with key lengths larger than
128 bits, and some cipher suites with 128-bit keys.
Cipher suites that offer no authentication are excluded.
@@ -212,7 +214,8 @@ but should include the following:
.It TLS_AES_128_CCM_8_SHA256
.El
.Pp
-The default cipher suite is TLS_AES_256_GCM_SHA384.
+The default cipher suite is
+.Dq TLS_AES_256_GCM_SHA384 .
.It tls_dhparams = path
The path to a file containing custom Diffie-Hellman parameters in PEM format.
This file can be created with the following command:
@@ -235,7 +238,8 @@ configuration is changed.
If false, no verification is performed of the server certificate.
When using self-signed certificates without a certificate authority,
this setting should be set to false.
-The default value is true.
+The default value is
+.Em true .
.El
.Ss relay
The
@@ -263,7 +267,8 @@ setting controls the amount of time
.Nm sudo_logsrvd
will wait for the relay to respond.
A value of 0 will disable the timeout.
-The default value is 30.
+The default value is
+.Em 30 .
.It relay_dir = path
The directory in which log messages are temporarily stored before they
are sent to the relay host.
@@ -298,7 +303,8 @@ lines are specified, the first available relay host will be used.
.It retry_interval = number
The number of seconds to wait after a connection error before making
a new attempt to forward a message to a relay host.
-The default value is 30 seconds.
+The default value is
+.Em 30 .
.It store_first = boolean
If true,
.Nm sudo_logsrvd
@@ -321,7 +327,8 @@ The amount of time, in seconds,
.Nm sudo_logsrvd
will wait for the relay server to respond after a connection has succeeded.
A value of 0 will disable the timeout.
-The default value is 30.
+The default value is
+.Em 30 .
.It tls_cacert = path
The path to a certificate authority bundle file, in PEM format,
to use instead of the system's default certificate authority database
@@ -404,7 +411,7 @@ If set, I/O logs will be compressed using
Enabling compression can make it harder to view the logs in real-time as
the program is executing due to buffering.
The default value is
-.Li false .
+.Em false .
.It iolog_dir = path
The top-level directory to use when constructing the path
name for the I/O log directory.
@@ -416,23 +423,23 @@ The following percent
.Pq Ql %
escape sequences are supported:
.Bl -tag -width 4n
-.It Li %{seq}
+.It %{seq}
expanded to a monotonically increasing base-36 sequence number, such as 0100A5,
where every two digits are used to form a new directory, e.g.,
.Pa 01/00/A5
-.It Li %{user}
+.It %{user}
expanded to the invoking user's login name
-.It Li %{group}
+.It %{group}
expanded to the name of the invoking user's real group-ID
-.It Li %{runas_user}
+.It %{runas_user}
expanded to the login name of the user the command will
be run as (e.g., root)
-.It Li %{runas_group}
+.It %{runas_group}
expanded to the group name of the user the command will
be run as (e.g., wheel)
-.It Li %{hostname}
+.It %{hostname}
expanded to the local host name without the domain name
-.It Li %{command}
+.It %{command}
expanded to the base name of the command being run
.El
.Pp
@@ -453,7 +460,7 @@ It is possible for
.Em iolog_file
to contain directory components.
The default value is
-.Li %{seq} .
+.Dq %{seq} .
.Pp
See the
.Em iolog_dir
@@ -463,9 +470,9 @@ escape sequences.
.Pp
In addition to the escape sequences, path names that end in six or
more
-.Li X Ns s
+.Em X Ns s
will have the
-.Li X Ns s
+.Em X Ns s
replaced with a unique combination of digits and letters, similar to the
.Xr mktemp 3
function.
@@ -479,7 +486,7 @@ overwritten unless
.Em iolog_file
ends in six or
more
-.Li X Ns s .
+.Em X Ns s .
.It iolog_flush = boolean
If set, I/O log data is flushed to disk after each write instead of
buffering it.
@@ -489,7 +496,7 @@ of I/O log compression.
I/O logs are always flushed before sending a commit point to the client
regardless of this setting.
The default value is
-.Li true .
+.Em true .
.It iolog_group = name
The group name to look up when setting the group-ID on new I/O log
files and directories.
@@ -513,7 +520,7 @@ When creating I/O log directories, search (execute) bits are added
to match the read and write bits specified by
.Em iolog_mode .
The default value is
-.Li 0600 .
+.Em 0600 .
.It iolog_user = name
The user name to look up when setting the owner of new
I/O log files and directories.
@@ -531,7 +538,7 @@ the password will still be present in the I/O log.
If
.Em log_passwords
is set to
-.Li false ,
+.Em false ,
.Nm sudo_logsrvd
will attempt to prevent passwords from being logged.
It does this by using the regular expressions in
@@ -549,15 +556,15 @@ when the
option is set), only the
first character of the password will be replaced in the I/O log.
The default value is
-.Li true .
+.Em true .
.It maxseq = number
The maximum sequence number that will be substituted for the
-.Dq Li %{seq}
+.Dq %{seq}
escape in the I/O log file (see the
.Em iolog_dir
description above for more information).
While the value substituted for
-.Dq Li %{seq}
+.Dq %{seq}
is in base 36,
.Em maxseq
itself should be expressed in decimal.
@@ -565,7 +572,8 @@ Values larger than 2176782336 (which corresponds to the
base 36 sequence number
.Dq ZZZZZZ )
will be silently truncated to 2176782336.
-The default value is 2176782336.
+The default value is
+.Em 2176782336 .
.It passprompt_regex = string
One or more POSIX extended regular expressions used to
match password prompts in the terminal output when
@@ -599,7 +607,8 @@ The default value is
If true,
.Nm sudo_logsrvd
will log an event when a command exits or is terminated by a signal.
-Defaults to false.
+Defaults to
+.Em false .
.It log_format = string
The event log format.
Supported log formats are
@@ -621,7 +630,7 @@ section configures how events are logged via
.It facility = string
Syslog facility if syslog is being used for logging.
Defaults to
-.Li @logfac@ .
+.Em @logfac@ .
.Pp
The following syslog facilities are supported:
.Sy authpriv
@@ -643,7 +652,7 @@ and
Syslog priority to use when the user is allowed to run a command and
authentication is successful.
Defaults to
-.Li @goodpri@ .
+.Em @goodpri@ .
.Pp
The following syslog priorities are supported:
.Sy alert ,
@@ -663,7 +672,7 @@ will disable logging of successful commands.
Syslog priority to use when the user is not allowed to run a command or
when authentication is unsuccessful.
Defaults to
-.Li @badpri@ .
+.Em @badpri@ .
.Pp
See
.Em accept_priority
@@ -671,7 +680,7 @@ for the list of supported syslog priorities.
.It alert_priority = string
Syslog priority to use for event log alert messages received from the client.
Defaults to
-.Li @badpri@ .
+.Em @badpri@ .
.Pp
See
.Em accept_priority
@@ -704,7 +713,7 @@ JSON-format log entries are never split and are not affected by
Syslog facility if syslog is being used for server warning messages.
See above for a list of supported facilities.
Defaults to
-.Li daemon
+.Em daemon
.El
.Ss logfile
The
@@ -725,10 +734,12 @@ Formatting is performed via the system's
.Xr strftime 3
function so any escape sequences supported by that function will be expanded.
The default value is
-.Dq Li "%h %e %T"
+.Dq "%h %e %T"
which produces dates like
.Dq Oct 3 07:15:24
-in the C locale.
+in the
+.Ql C
+locale.
.El
.Sh FILES
.Bl -tag -width 24n
diff --git a/docs/sudo_logsrvd.man.in b/docs/sudo_logsrvd.man.in
index c0bccf412..bffa4ecb6 100644
--- a/docs/sudo_logsrvd.man.in
+++ b/docs/sudo_logsrvd.man.in
@@ -117,7 +117,7 @@ section.
.SS "Debugging sudo_logsrvd"
\fBsudo_logsrvd\fR
supports a flexible debugging framework that is configured via
-\fRDebug\fR
+\fIDebug\fR
lines in the
sudo.conf(@mansectform@)
file.
diff --git a/docs/sudo_logsrvd.mdoc.in b/docs/sudo_logsrvd.mdoc.in
index 8c6a1e59a..d2d809d7b 100644
--- a/docs/sudo_logsrvd.mdoc.in
+++ b/docs/sudo_logsrvd.mdoc.in
@@ -112,7 +112,7 @@ section.
.Ss Debugging sudo_logsrvd
.Nm
supports a flexible debugging framework that is configured via
-.Li Debug
+.Em Debug
lines in the
.Xr sudo.conf @mansectform@
file.
diff --git a/docs/sudo_plugin.man.in b/docs/sudo_plugin.man.in
index 4fa699e21..d4e003628 100644
--- a/docs/sudo_plugin.man.in
+++ b/docs/sudo_plugin.man.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "SUDO_PLUGIN" "5" "May 26, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDO_PLUGIN" "5" "October 7, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -48,12 +48,12 @@ A plugin should be check the version passed to it and make sure that the
major version matches.
.PP
The plugin API is defined by the
-\fRsudo_plugin.h\fR
+<\fIsudo_plugin.h\fR>
header file.
.SS "Policy plugin API"
A policy plugin must declare and populate a
-\fRpolicy_plugin\fR
-struct in the global scope.
+\fIstruct policy_plugin\fR
+in the global scope.
This structure contains pointers to the functions that implement the
\fBsudo\fR
policy checks.
@@ -70,7 +70,7 @@ struct policy_plugin {
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 plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], char * const user_env[],
char * const plugin_options[], const char **errstr);
void (*close)(int exit_status, int error);
@@ -79,9 +79,9 @@ struct policy_plugin {
char *env_add[], char **command_info[],
char **argv_out[], char **user_env_out[], const char **errstr);
int (*list)(int argc, char * const argv[], int verbose,
- const char *list_user, const char **errstr);
+ const char *user, const char **errstr);
int (*validate)(const char **errstr);
- void (*invalidate)(int remove);
+ void (*invalidate)(int rmcred);
int (*init_session)(struct passwd *pwd, char **user_env[],
const char **errstr);
void (*register_hooks)(int version,
@@ -93,16 +93,18 @@ struct policy_plugin {
.RE
.fi
.PP
-The policy_plugin struct has the following fields:
+A
+\fIstruct policy_plugin\fR
+has the following fields:
.TP 6n
-type
+\fItype\fR
The
-\fRtype\fR
+\fItype\fR
field should always be set to SUDO_POLICY_PLUGIN.
.TP 6n
-version
+\fIversion\fR
The
-\fRversion\fR
+\fIversion\fR
field should be set to
\fRSUDO_API_VERSION\fR.
.sp
@@ -111,11 +113,11 @@ This allows
to determine the API version the plugin was
built against.
.TP 6n
-open
+\fIopen\fR
.nf
.RS 6n
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], char * const user_env[],
char * const plugin_options[], const char **errstr);
.RE
@@ -130,21 +132,21 @@ will print a usage message before it exits.
If an error occurs, the plugin may optionally call the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function with
\fRSUDO_CONF_ERROR_MSG\fR
to present additional error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-version
+\fIversion\fR
The version passed in by
\fBsudo\fR
allows the plugin to determine the
major and minor version number of the plugin API supported by
\fBsudo\fR.
.TP 6n
-conversation
+\fIconversation\fR
A pointer to the
\fBconversation\fR()
function that can be used by the plugin to interact with the user (see
@@ -152,7 +154,7 @@ function that can be used by the plugin to interact with the user (see
for details).
Returns 0 on success and \-1 on failure.
.TP 6n
-plugin_printf
+\fIsudo_plugin_printf\fR
A pointer to a
\fBprintf\fR()-style
function that may be used to display informational or error messages (see
@@ -160,7 +162,7 @@ function that may be used to display informational or error messages (see
for details).
Returns the number of characters printed on success and \-1 on failure.
.TP 6n
-settings
+\fIsettings\fR
A vector of user-supplied
\fBsudo\fR
settings in the form of
@@ -182,8 +184,7 @@ equal sign
(\(oq=\(cq)
since the
\fIname\fR
-field will never include one
-itself but the
+field will never include one itself but the
\fIvalue\fR
might.
.sp
@@ -235,7 +236,7 @@ Only available starting with API version 1.16.
debug_flags=string
A debug file path name followed by a space and a comma-separated
list of debug flags that correspond to the plugin's
-\fRDebug\fR
+\fIDebug\fR
entry in
sudo.conf(@mansectform@),
if there is one.
@@ -264,7 +265,7 @@ will only pass
if
sudo.conf(@mansectform@)
contains a plugin-specific
-\fRDebug\fR
+\fIDebug\fR
entry.
.TP 6n
ignore_ticket=bool
@@ -304,6 +305,7 @@ filtering and the
action.
Other systems will use a dynamic shared object to implement
intercept.
+Only available starting with API version 1.19.
.TP 6n
intercept_setid=bool
Indicates whether or not the system supports running set-user-ID
@@ -321,6 +323,7 @@ This will disable intercept mode for that program and any other
programs that it executes.
The policy plugin may refuse to execute a set-user-ID or set-group-ID
binary in intercept mode to avoid this.
+Only available starting with API version 1.19.
.TP 6n
login_class=string
BSD
@@ -463,7 +466,7 @@ function or return \-2 with a usage error
if the plugin does not support
\fIsudoedit\fR.
For more information, see the
-\fIcheck_policy\fR
+\fBcheck_policy\fR()
section.
.TP 6n
timeout=string
@@ -473,12 +476,19 @@ option.
Not all plugins support command timeouts and the ability of the
user to set a timeout may be restricted by policy.
The format of the timeout string is plugin-specific.
+.TP 6n
+update_ticket=bool
+Set to false if the user specified the
+\fB\-N\fR
+option, indicating that the user wishes to avoid updating any cached
+authentication credentials.
+Only available starting with API version 1.20.
.PP
Additional settings may be added in the future so the plugin should
silently ignore settings that it does not recognize.
.RE
.TP 6n
-user_info
+\fIuser_info\fR
A vector of information about the user running the command in the form of
\(lqname=value\(rq
strings.
@@ -667,7 +677,7 @@ tty=string
The path to the user's terminal device.
If the user has no terminal device associated with the session,
the value will be empty, as in
-\(lq\fRtty=\fR\(rq.
+\(oqtty=\(cq.
.TP 6n
uid=uid_t
The real user-ID of the user invoking
@@ -685,7 +695,7 @@ The name of the user invoking
.RE
.PD
.TP 6n
-user_env
+\fIuser_env\fR
The user's environment in the form of a
\fRNULL\fR-terminated vector of
\(lqname=value\(rq
@@ -704,7 +714,7 @@ itself but the
\fIvalue\fR
might.
.TP 6n
-plugin_options
+\fIplugin_options\fR
Any (non-comment) strings immediately after the plugin path are
passed as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -731,7 +741,7 @@ front-end before using
\fIplugin_options\fR.
Failure to do so may result in a crash.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBopen\fR()
function returns a value other than 1, the plugin may
@@ -762,7 +772,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-close
+\fIclose\fR
.br
.nf
.RS 6n
@@ -792,30 +802,30 @@ function returned successfully.
.sp
The function arguments are as follows:
.TP 6n
-exit_status
+\fIexit_status\fR
The command's exit status, as returned by the
wait(2)
system call, or zero if no command was run.
The value of
-\fRexit_status\fR
+\fIexit_status\fR
is undefined if
-\fRerror\fR
+\fIerror\fR
is non-zero.
.TP 6n
-error
+\fIerror\fR
.br
If the command could not be executed, this is set to the value of
-\fRerrno\fR
+\fIerrno\fR
set by the
execve(2)
system call.
The plugin is responsible for displaying error information via the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function.
If the command was successfully executed, the value of
-\fRerror\fR
+\fIerror\fR
is zero.
.PP
If no
@@ -823,17 +833,17 @@ If no
function is defined, no I/O logging plugins are loaded,
and neither the
\fItimeout\fR
-not
+nor
\fIuse_pty\fR
options are set in the
-\fRcommand_info\fR
+\fIcommand_info\fR
list, the
\fBsudo\fR
front-end may execute the command directly instead of running
it as a child process.
.RE
.TP 6n
-show_version
+\fIshow_version\fR
.nf
.RS 6n
int (*show_version)(int verbose);
@@ -845,24 +855,25 @@ The
\fBshow_version\fR()
function is called by
\fBsudo\fR
-when the user specifies
-the
+when the user specifies the
\fB\-V\fR
option.
The plugin may display its version information to the user via the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function using
\fRSUDO_CONV_INFO_MSG\fR.
-If the user requests detailed version information, the verbose flag will be set.
+If the user requests detailed version information, the
+\fIverbose\fR
+flag will be non-zero.
.sp
Returns 1 on success, 0 on failure, \-1 if a general error occurred,
or \-2 if there was a usage error, although the return value is currently
ignored.
.RE
.TP 6n
-check_policy
+\fIcheck_policy\fR
.nf
.RS 6n
int (*check_policy)(int argc, char * const argv[], char *env_add[],
@@ -883,8 +894,7 @@ If the
\fIsudoedit\fR
option was enabled in the
\fIsettings\fR
-array
-passed to the
+array passed to the
\fBopen\fR()
function, the user has requested
\fIsudoedit\fR
@@ -911,12 +921,11 @@ into
\fIargv_out\fR,
separated from the
editor and its arguments by a
-\(lq\fR--\fR\(rq
+\(oq--\(cq
element.
The
-\(lq\fR--\fR\(rq
-will
-be removed by
+\(oq--\(cq
+will be removed by
\fBsudo\fR
before the editor is executed.
The plugin should also set
@@ -939,21 +948,21 @@ exits.
If an error occurs, the plugin may optionally call the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function with
\fRSUDO_CONF_ERROR_MSG\fR
to present additional error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-argc
+\fIargc\fR
The number of elements in
\fIargv\fR,
not counting the final
\fRNULL\fR
pointer.
.TP 6n
-argv
+\fIargv\fR
The argument vector describing the command the user wishes to run,
in the same form as what would be passed to the
execve(2)
@@ -962,7 +971,7 @@ The vector is terminated by a
\fRNULL\fR
pointer.
.TP 6n
-env_add
+\fIenv_add\fR
Additional environment variables specified by the user on the command
line in the form of a
\fRNULL\fR-terminated
@@ -980,19 +989,17 @@ equal sign
(\(oq=\(cq)
since the
\fIname\fR
-field will never include one
-itself but the
+field will never include one itself but the
\fIvalue\fR
might.
.TP 6n
-command_info
+\fIcommand_info\fR
Information about the command being run in the form of
\(lqname=value\(rq
strings.
These values are used by
\fBsudo\fR
-to set the execution
-environment when running a command.
+to set the execution environment when running a command.
The plugin is responsible for creating and populating the vector,
which must be terminated with a
\fRNULL\fR
@@ -1003,9 +1010,13 @@ The following values are recognized by
.RS 6n
.PD 0
.TP 6n
+apparmor_profile=string
+AppArmor profile to transition to when executing the command.
+Only available starting with API version 1.19.
+.PD
+.TP 6n
chroot=string
The root directory to use when running the command.
-.PD
.TP 6n
closefrom=number
If specified,
@@ -1028,7 +1039,7 @@ not be run unless
is also set (see below).
.TP 6n
cwd_optional=bool
-If enabled,
+If set,
\fBsudo\fR
will treat an inability to change to the new working directory as a
non-fatal error.
@@ -1065,7 +1076,7 @@ Otherwise, any terminal input must be passed to the command, whether it
has required it or not (the kernel buffers terminals so it is not possible
to tell whether the command really wants the input).
This is different from historic
-\fIsudo\fR
+\fBsudo\fR
behavior or when the command is not being run in a pseudo-terminal.
.sp
For this to work seamlessly, the operating system must support the
@@ -1109,7 +1120,7 @@ The specified
must refer to an open file descriptor.
.TP 6n
intercept=bool
-If specified,
+If set,
\fBsudo\fR
will intercept attempts to execute a subsequent command and perform
a policy check via the policy plugin's
@@ -1122,6 +1133,17 @@ See
in
sudoers(@mansectform@)
for details.
+Only available starting with API version 1.18.
+.TP 6n
+intercept_verify=bool
+If set,
+\fBsudo\fR
+will attempt to verify that a command run in intercept mode has the
+expected path name, command line arguments and environment.
+This setting has no effect unless
+\fIuse_ptrace\fR
+is also enabled.
+Only available starting with API version 1.20.
.TP 6n
iolog_compress=bool
Set to true if the I/O logging plugins, if any, should compress the
@@ -1188,7 +1210,7 @@ BSD
systems.
.TP 6n
log_subcmds=bool
-If specified,
+If set,
\fBsudo\fR
will call the audit plugin's
\fBaccept\fR()
@@ -1204,6 +1226,7 @@ See
in
sudoers(@mansectform@)
for more information.
+Only available starting with API version 1.18.
.TP 6n
noexec=bool
If set, prevent the command from executing other programs.
@@ -1220,7 +1243,7 @@ If set,
\fBsudo\fR
will preserve the user's group vector instead of
initializing the group vector based on
-\fRrunas_user\fR.
+\fIrunas_user\fR.
.TP 6n
rlimit_as=soft,hard
The maximum size to which the process's address space may grow (in bytes),
@@ -1237,7 +1260,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_core=soft,hard
The largest size core dump file that may be created (in bytes).
@@ -1253,7 +1276,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_cpu=soft,hard
The maximum amount of CPU time that the process may use (in seconds).
@@ -1269,7 +1292,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_data=soft,hard
The maximum size of the data segment for the process (in bytes).
@@ -1285,7 +1308,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_fsize=soft,hard
The largest size file that the process may create (in bytes).
@@ -1301,7 +1324,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_locks=soft,hard
The maximum number of locks that the process may establish,
@@ -1318,7 +1341,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_memlock=soft,hard
The maximum size that the process may lock in memory (in bytes),
@@ -1335,7 +1358,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_nofile=soft,hard
The maximum number of files that the process may have open.
@@ -1351,7 +1374,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_nproc=soft,hard
The maximum number of processes that the user may run simultaneously.
@@ -1367,7 +1390,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_rss=soft,hard
The maximum size to which the process's resident set size may grow (in bytes).
@@ -1383,7 +1406,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
rlimit_stack=soft,hard
The maximum size to which the process's stack may grow (in bytes).
@@ -1399,7 +1422,7 @@ A value of
\(lqdefault\(rq
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.TP 6n
runas_egid=gid
Effective group-ID to run the command as.
@@ -1495,7 +1518,7 @@ These restrictions are not enforced when
\fBsudoedit\fR
is run by root.
The
-\fIsudoedit_follow\fR
+\fIsudoedit_checkdir\fR
option can be set to false to disable this check.
Only available starting with API version 1.8.
.TP 6n
@@ -1530,7 +1553,7 @@ Force the value specified by the
option to override any umask set by PAM or login.conf.
.TP 6n
use_ptrace=bool
-If specified,
+If set,
\fBsudo\fR
will use
ptrace(2)
@@ -1538,6 +1561,7 @@ to implement intercept mode if supported by the system.
This setting has no effect unless
\fIintercept\fR
is also set.
+Only available starting with API version 1.19.
.TP 6n
use_pty=bool
Allocate a pseudo-terminal to run the command in, regardless of whether
@@ -1561,7 +1585,7 @@ the invoking user's existing entry.
Unsupported values will be ignored.
.RE
.TP 6n
-argv_out
+\fIargv_out\fR
The
\fRNULL\fR-terminated
argument vector to pass to the
@@ -1569,13 +1593,13 @@ execve(2)
system call when executing the command.
The plugin is responsible for allocating and populating the vector.
.TP 6n
-user_env_out
+\fIuser_env_out\fR
The
\fRNULL\fR-terminated
environment vector to use when executing the command.
The plugin is responsible for allocating and populating the vector.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBcheck_policy\fR()
function returns a value other than 1, the plugin may
@@ -1606,11 +1630,11 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-list
+\fIlist\fR
.nf
.RS 6n
int (*list)(int argc, char * const argv[], int verbose,
- const char *list_user, const char **errstr);
+ const char *user, const char **errstr);
.RE
.fi
.RS 6n
@@ -1620,7 +1644,7 @@ Returns 1 on success, 0 on failure, and \-1 on error.
On error, the plugin may optionally call the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function with
\fRSUDO_CONF_ERROR_MSG\fR
to present additional error information to
@@ -1629,20 +1653,20 @@ the user.
Privileges should be output via the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function using
\fRSUDO_CONV_INFO_MSG\fR.
.sp
The function arguments are as follows:
.TP 6n
-argc
+\fIargc\fR
The number of elements in
\fIargv\fR,
not counting the final
\fRNULL\fR
pointer.
.TP 6n
-argv
+\fIargv\fR
If
non-\fRNULL\fR,
an argument vector describing a command the user
@@ -1653,17 +1677,17 @@ system call.
If the command is permitted by the policy, the fully-qualified path
to the command should be displayed along with any command line arguments.
.TP 6n
-verbose
+\fIverbose\fR
Flag indicating whether to list in verbose mode or not.
.TP 6n
-list_user
+\fIuser\fR
The name of a different user to list privileges for if the policy
allows it.
If
\fRNULL\fR,
the plugin should list the privileges of the invoking user.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBlist\fR()
function returns a value other than 1, the plugin may
@@ -1694,7 +1718,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-validate
+\fIvalidate\fR
.nf
.RS 6n
int (*validate)(const char **errstr);
@@ -1725,7 +1749,7 @@ Returns 1 on success, 0 on failure, and \-1 on error.
On error, the plugin may optionally call the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function with
\fRSUDO_CONF_ERROR_MSG\fR
to present additional
@@ -1733,7 +1757,7 @@ error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBvalidate\fR()
function returns a value other than 1, the plugin may
@@ -1764,10 +1788,10 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-invalidate
+\fIinvalidate\fR
.nf
.RS 6n
-void (*invalidate)(int remove);
+void (*invalidate)(int rmcred);
.RE
.fi
.RS 6n
@@ -1787,8 +1811,8 @@ that
cache authentication credentials, this function will invalidate the
credentials.
If the
-\fIremove\fR
-flag is set, the plugin may remove
+\fIrmcred\fR
+flag is non-zero, the plugin may remove
the credentials instead of simply invalidating them.
.sp
The
@@ -1798,10 +1822,11 @@ function should be
if the plugin does not support credential caching.
.RE
.TP 6n
-init_session
+\fIinit_session\fR
.nf
.RS 6n
-int (*init_session)(struct passwd *pwd, char **user_env_out[]);
+int (*init_session)(struct passwd *pwd, char **user_env[],
+ const char **errstr);
.RE
.fi
.RS 6n
@@ -1814,7 +1839,7 @@ sets up the
execution environment for the command.
It is run in the parent
\fBsudo\fR
-process and before any user-ID or group-ID changes.
+process before any user-ID or group-ID changes.
This can be used to perform session setup that is not supported by
\fIcommand_info\fR,
such as opening the PAM session.
@@ -1822,25 +1847,31 @@ The
\fBclose\fR()
function can be
used to tear down the session that was opened by
-\fRinit_session\fR.
+\fBinit_session\fR().
.sp
-The
+Returns 1 on success, 0 on failure, and \-1 on error.
+On error, the plugin may optionally call the
+\fBconversation\fR()
+or
+\fBsudo_plugin_printf\fR()
+function with
+\fRSUDO_CONF_ERROR_MSG\fR
+to present additional
+error information to the user.
+.sp
+The function arguments are as follows:
+.TP 6n
+\fIpwd\fR
+If the user-ID the command will run as was found in the password database,
\fIpwd\fR
-argument points to a passwd struct for the user the
-command will be run as if the user-ID the command will run as was found
-in the password database, otherwise it will be
+will describe that user, otherwise it will be
\fRNULL\fR.
-.sp
-The
+.TP 6n
\fIuser_env_out\fR
-argument points to the environment the command will
-run in, in the form of a
+The
\fRNULL\fR-terminated
-vector of
-\(lqname=value\(rq
-strings.
-This is the same string passed back to the front-end via
-the Policy Plugin's
+environment vector to use when executing the command.
+This is the same string passed back to the front-end via the Policy Plugin's
\fIuser_env_out\fR
parameter.
If the
@@ -1863,19 +1894,39 @@ version specified by the
front-end before using
\fIuser_env_out\fR.
Failure to do so may result in a crash.
+.TP 6n
+\fIerrstr\fR
+If the
+\fBinit_session\fR()
+function returns a value other than 1, the plugin may
+store a message describing the failure or error in
+\fIerrstr\fR.
+The
+\fBsudo\fR
+front-end will then pass this value to any registered audit plugins.
+The string stored in
+\fIerrstr\fR
+must remain valid until the plugin's
+\fBclose\fR()
+function is called.
.sp
-Returns 1 on success, 0 on failure, and \-1 on error.
-On error, the plugin may optionally call the
-\fBconversation\fR()
-or
-\fBplugin_printf\fR()
-function with
-\fRSUDO_CONF_ERROR_MSG\fR
-to present additional
-error information to the user.
+The
+\fIerrstr\fR
+parameter is only available starting with
+API version 1.15.
+A plugin
+\fBmust\fR
+check the API version specified by the
+\fBsudo\fR
+front-end before using
+\fIerrstr\fR.
+Failure to do so may result in a crash.
+.PD 0
+.PP
.RE
+.PD
.TP 6n
-register_hooks
+\fIregister_hooks\fR
.nf
.RS 6n
void (*register_hooks)(int version,
@@ -1889,7 +1940,7 @@ The
function is called by the sudo front-end to
register any hooks the plugin needs.
If the plugin does not support hooks,
-\fRregister_hooks\fR
+\fIregister_hooks\fR
should be set to the
\fRNULL\fR
pointer.
@@ -1907,13 +1958,12 @@ function should be used to register any supported
hooks the plugin needs.
It returns 0 on success, 1 if the hook type is not supported, and \-1
if the major version in
-\fRstruct hook\fR
+\fIstruct sudo_hook\fR
does not match the front-end's major hook API version.
.sp
See the
\fIHook function API\fR
-section below for more information
-about hooks.
+section below for more information about hooks.
.sp
The
\fBregister_hooks\fR()
@@ -1923,11 +1973,11 @@ If the
\fBsudo\fR
front-end doesn't support API
version 1.2 or higher,
-\fRregister_hooks\fR
+\fBregister_hooks\fR()
will not be called.
.RE
.TP 6n
-deregister_hooks
+\fIderegister_hooks\fR
.nf
.RS 6n
void (*deregister_hooks)(int version,
@@ -1941,7 +1991,7 @@ The
function is called by the sudo front-end
to deregister any hooks the plugin has registered.
If the plugin does not support hooks,
-\fRderegister_hooks\fR
+\fIderegister_hooks\fR
should be set to the
\fRNULL\fR
pointer.
@@ -1960,13 +2010,12 @@ hooks that were put in place by the
\fBregister_hook\fR()
function.
If the plugin tries to deregister a hook that the front-end does not support,
-\fRderegister_hook\fR
+\fBderegister_hook\fR()
will return an error.
.sp
See the
\fIHook function API\fR
-section below for more information
-about hooks.
+section below for more information about hooks.
.sp
The
\fBderegister_hooks\fR()
@@ -1976,11 +2025,11 @@ If the
\fBsudo\fR
front-end doesn't support API
version 1.2 or higher,
-\fRderegister_hooks\fR
+\fBderegister_hooks\fR()
will not be called.
.RE
.TP 6n
-event_alloc
+\fIevent_alloc\fR
.nf
.RS 6n
struct sudo_plugin_event * (*event_alloc)(void);
@@ -1991,12 +2040,12 @@ struct sudo_plugin_event * (*event_alloc)(void);
The
\fBevent_alloc\fR()
function is used to allocate a
-\fRstruct sudo_plugin_event\fR
+\fIstruct sudo_plugin_event\fR
which provides access to the main
\fBsudo\fR
event loop.
Unlike the other fields, the
-\fBevent_alloc\fR()
+\fIevent_alloc\fR
pointer is filled in by the
\fBsudo\fR
front-end, not by the plugin.
@@ -2014,36 +2063,9 @@ If the
\fBsudo\fR
front-end doesn't support API
version 1.15 or higher,
-\fBevent_alloc\fR()
+\fIevent_alloc\fR
will not be set.
.RE
-.TP 6n
-errstr
-If the
-\fBinit_session\fR()
-function returns a value other than 1, the plugin may
-store a message describing the failure or error in
-\fIerrstr\fR.
-The
-\fBsudo\fR
-front-end will then pass this value to any registered audit plugins.
-The string stored in
-\fIerrstr\fR
-must remain valid until the plugin's
-\fBclose\fR()
-function is called.
-.sp
-The
-\fIerrstr\fR
-parameter is only available starting with
-API version 1.15.
-A plugin
-\fBmust\fR
-check the API version specified by the
-\fBsudo\fR
-front-end before using
-\fIerrstr\fR.
-Failure to do so may result in a crash.
.PP
\fIPolicy Plugin Version Macros\fR
.nf
@@ -2075,7 +2097,7 @@ struct io_plugin {
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 plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_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[], const char **errstr);
@@ -2111,13 +2133,16 @@ session.
If any of the standard input, standard output, or standard error do not
correspond to a tty,
\fBsudo\fR
-will open a pipe to capture
-the I/O for logging before passing it on.
+will open a pipe to capture the I/O for logging before passing it on.
.PP
-The log_ttyin function receives the raw user input from the terminal
+The
+\fBlog_ttyin\fR()
+function receives the raw user input from the terminal
device (this will include input even when echo is disabled,
such as when a password is read).
-The log_ttyout function receives output from the pseudo-terminal that is
+The
+\fBlog_ttyout\fR()
+function receives output from the pseudo-terminal that is
suitable for replaying the user's session at a later time.
The
\fBlog_stdin\fR(),
@@ -2147,17 +2172,19 @@ If an output logging function rejects the data by returning 0, the
command will be terminated and the data will not be written to the
terminal, though it will still be sent to any other I/O logging plugins.
.PP
-The audit_plugin struct has the following fields:
+A
+\fIstruct audit_plugin\fR
+has the following fields:
.TP 6n
-type
+\fItype\fR
The
-\fRtype\fR
+\fItype\fR
field should always be set to
\fRSUDO_IO_PLUGIN\fR.
.TP 6n
-version
+\fIversion\fR
The
-\fRversion\fR
+\fIversion\fR
field should be set to
\fRSUDO_API_VERSION\fR.
.sp
@@ -2166,11 +2193,11 @@ This allows
to determine the API version the plugin was
built against.
.TP 6n
-open
+\fIopen\fR
.nf
.RS 6n
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_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[]);
@@ -2203,25 +2230,25 @@ will print a usage message before it exits.
If an error occurs, the plugin may optionally call the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function with
\fRSUDO_CONF_ERROR_MSG\fR
to present additional error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-version
+\fIversion\fR
The version passed in by
\fBsudo\fR
allows the plugin to determine the
major and minor version number of the plugin API supported by
\fBsudo\fR.
.TP 6n
-conversation
+\fIconversation\fR
A pointer to the
\fBconversation\fR()
function that may be used by the
-\fBshow_version\fR()
+\fBFa\fR(\fIshow_version\fR)
function to display version information (see
\fBshow_version\fR()
below).
@@ -2232,7 +2259,7 @@ The
\fBconversation\fR()
function returns 0 on success and \-1 on failure.
.TP 6n
-plugin_printf
+\fIsudo_plugin_printf\fR
A pointer to a
\fBprintf\fR()-style
function that may be used by the
@@ -2240,13 +2267,13 @@ function that may be used by the
function to display version information (see
show_version below).
The
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function may also be used to display additional error message to the user.
The
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function returns number of characters printed on success and \-1 on failure.
.TP 6n
-settings
+\fIsettings\fR
A vector of user-supplied
\fBsudo\fR
settings in the form of
@@ -2277,7 +2304,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible settings.
.TP 6n
-user_info
+\fIuser_info\fR
A vector of information about the user running the command in the form of
\(lqname=value\(rq
strings.
@@ -2302,7 +2329,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-command_info
+\fIcommand_info\fR
A vector of information describing the command being run in the form of
\(lqname=value\(rq
strings.
@@ -2327,18 +2354,19 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-argc
+\fIargc\fR
The number of elements in
\fIargv\fR,
not counting the final
\fRNULL\fR
pointer.
-It can be zero, when
+It can be zero, such as when
\fBsudo\fR
-is called with
-\fB\-V\fR.
+is called with the
+\fB\-V\fR
+option.
.TP 6n
-argv
+\fIargv\fR
If
non-\fRNULL\fR,
an argument vector describing a command the user
@@ -2346,7 +2374,7 @@ wishes to run in the same form as what would be passed to the
execve(2)
system call.
.TP 6n
-user_env
+\fIuser_env\fR
The user's environment in the form of a
\fRNULL\fR-terminated
vector of
@@ -2366,7 +2394,7 @@ itself but the
\fIvalue\fR
might.
.TP 6n
-plugin_options
+\fIplugin_options\fR
Any (non-comment) strings immediately after the plugin path are
treated as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -2392,7 +2420,7 @@ front-end before using
\fIplugin_options\fR.
Failure to do so may result in a crash.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBopen\fR()
function returns a value other than 1, the plugin may
@@ -2423,7 +2451,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-close
+\fIclose\fR
.br
.nf
.RS 6n
@@ -2440,32 +2468,32 @@ is finished, shortly before it exits.
.sp
The function arguments are as follows:
.TP 6n
-exit_status
+\fIexit_status\fR
The command's exit status, as returned by the
wait(2)
system call, or zero if no command was run.
The value of
-\fRexit_status\fR
+\fIexit_status\fR
is undefined if
-\fRerror\fR
+\fIerror\fR
is non-zero.
.TP 6n
-error
+\fIerror\fR
.br
If the command could not be executed, this is set to the value of
-\fRerrno\fR
+\fIerrno\fR
set by the
execve(2)
system call.
If the command was successfully executed, the value of
-\fRerror\fR
+\fIerror\fR
is zero.
.PD 0
.PP
.RE
.PD
.TP 6n
-show_version
+\fIshow_version\fR
.nf
.RS 6n
int (*show_version)(int verbose);
@@ -2477,23 +2505,25 @@ The
\fBshow_version\fR()
function is called by
\fBsudo\fR
-when the user specifies
-the
+when the user specifies the
\fB\-V\fR
option.
The plugin may display its version information to the user via the
\fBconversation\fR()
or
-\fBplugin_printf\fR()
+\fBsudo_plugin_printf\fR()
function using
\fRSUDO_CONV_INFO_MSG\fR.
+If the user requests detailed version information, the
+\fIverbose\fR
+flag will be non-zero.
.sp
Returns 1 on success, 0 on failure, \-1 if a general error occurred,
or \-2 if there was a usage error, although the return value is currently
ignored.
.RE
.TP 6n
-log_ttyin
+\fIlog_ttyin\fR
.nf
.RS 6n
int (*log_ttyin)(const char *buf, unsigned int len,
@@ -2514,15 +2544,15 @@ error occurred.
.sp
The function arguments are as follows:
.TP 6n
-buf
+\fIbuf\fR
The buffer containing user input.
.TP 6n
-len
+\fIlen\fR
The length of
\fIbuf\fR
in bytes.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBlog_ttyin\fR()
function returns a value other than 1, the plugin may
@@ -2553,7 +2583,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-log_ttyout
+\fIlog_ttyout\fR
.nf
.RS 6n
int (*log_ttyout)(const char *buf, unsigned int len,
@@ -2573,15 +2603,15 @@ Returns 1 if the data should be passed to the user, 0 if the data is rejected
.sp
The function arguments are as follows:
.TP 6n
-buf
+\fIbuf\fR
The buffer containing command output.
.TP 6n
-len
+\fIlen\fR
The length of
\fIbuf\fR
in bytes.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBlog_ttyout\fR()
function returns a value other than 1, the plugin may
@@ -2612,7 +2642,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-log_stdin
+\fIlog_stdin\fR
.nf
.RS 6n
int (*log_stdin)(const char *buf, unsigned int len,
@@ -2635,15 +2665,15 @@ if an error occurred.
.sp
The function arguments are as follows:
.TP 6n
-buf
+\fIbuf\fR
The buffer containing user input.
.TP 6n
-len
+\fIlen\fR
The length of
\fIbuf\fR
in bytes.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBlog_stdin\fR()
function returns a value other than 1, the plugin may
@@ -2674,7 +2704,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-log_stdout
+\fIlog_stdout\fR
.nf
.RS 6n
int (*log_stdout)(const char *buf, unsigned int len,
@@ -2697,15 +2727,15 @@ an error occurred.
.sp
The function arguments are as follows:
.TP 6n
-buf
+\fIbuf\fR
The buffer containing command output.
.TP 6n
-len
+\fIlen\fR
The length of
\fIbuf\fR
in bytes.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBlog_stdout\fR()
function returns a value other than 1, the plugin may
@@ -2736,7 +2766,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-log_stderr
+\fIlog_stderr\fR
.nf
.RS 6n
int (*log_stderr)(const char *buf, unsigned int len,
@@ -2759,15 +2789,15 @@ an error occurred.
.sp
The function arguments are as follows:
.TP 6n
-buf
+\fIbuf\fR
The buffer containing command output.
.TP 6n
-len
+\fIlen\fR
The length of
\fIbuf\fR
in bytes.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBlog_stderr\fR()
function returns a value other than 1, the plugin may
@@ -2798,19 +2828,19 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-register_hooks
+\fIregister_hooks\fR
See the
\fIPolicy plugin API\fR
section for a description of
-\fRregister_hooks\fR.
+\fBregister_hooks\fR().
.TP 6n
-deregister_hooks
+\fIderegister_hooks\fR
See the
\fIPolicy plugin API\fR
section for a description of
-\fRderegister_hooks\fR.
+\fBderegister_hooks\fR().
.TP 6n
-change_winsize
+\fIchange_winsize\fR
.nf
.RS 6n
int (*change_winsize)(unsigned int lines, unsigned int cols,
@@ -2823,7 +2853,7 @@ The
\fBchange_winsize\fR()
function is called whenever the window size of the terminal changes from
the initial values specified in the
-\fRuser_info\fR
+\fIuser_info\fR
list.
Returns \-1 if an error occurred, in which case no further calls to
\fBchange_winsize\fR()
@@ -2831,14 +2861,14 @@ will be made,
.sp
The function arguments are as follows:
.TP 6n
-lines
+\fIlines\fR
.br
The number of lines (rows) in the re-sized terminal.
.TP 6n
-cols
+\fIcols\fR
The number of columns in the re-sized terminal.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBchange_winsize\fR()
function returns a value other than 1, the plugin may
@@ -2869,7 +2899,7 @@ Failure to do so may result in a crash.
.RE
.PD
.TP 6n
-log_suspend
+\fIlog_suspend\fR
.nf
.RS 6n
int (*log_suspend)(int signo, const char **errstr);
@@ -2888,13 +2918,13 @@ will be made,
.sp
The function arguments are as follows:
.TP 6n
-signo
+\fIsigno\fR
.br
The signal that caused the command to be suspended, or
\fRSIGCONT\fR
if the command was resumed.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBlog_suspend\fR()
function returns a value other than 1, the plugin may
@@ -2921,7 +2951,7 @@ front-end before using
\fIerrstr\fR.
Failure to do so may result in a crash.
.TP 6n
-event_alloc
+\fIevent_alloc\fR
.nf
.RS 6n
struct sudo_plugin_event * (*event_alloc)(void);
@@ -2932,7 +2962,7 @@ struct sudo_plugin_event * (*event_alloc)(void);
The
\fBevent_alloc\fR()
function is used to allocate a
-\fRstruct sudo_plugin_event\fR
+\fIstruct sudo_plugin_event\fR
which provides access to the main
\fBsudo\fR
event loop.
@@ -2978,7 +3008,7 @@ struct audit_plugin {
unsigned int type; /* always SUDO_AUDIT_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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -3010,17 +3040,19 @@ independent of the policy or any I/O plugins.
Multiple audit plugins may be specified in
sudo.conf(@mansectform@).
.PP
-The audit_plugin struct has the following fields:
+A
+\fIstruct audit_plugin\fR
+has the following fields:
.TP 6n
-type
+\fItype\fR
The
-\fRtype\fR
+\fItype\fR
field should always be set to
\fRSUDO_AUDIT_PLUGIN\fR.
.TP 6n
-version
+\fIversion\fR
The
-\fRversion\fR
+\fIversion\fR
field should be set to
\fRSUDO_API_VERSION\fR.
.sp
@@ -3029,11 +3061,11 @@ This allows
to determine the API version the plugin was
built against.
.TP 6n
-open
+\fIopen\fR
.nf
.RS 6n
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t sudo_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -3062,14 +3094,14 @@ to present additional error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-version
+\fIversion\fR
The version passed in by
\fBsudo\fR
allows the plugin to determine the
major and minor version number of the plugin API supported by
\fBsudo\fR.
.TP 6n
-conversation
+\fIconversation\fR
A pointer to the
\fBconversation\fR()
function that may be used by the
@@ -3084,7 +3116,7 @@ The
\fBconversation\fR()
function returns 0 on success, and \-1 on failure.
.TP 6n
-plugin_printf
+\fIplugin_printf\fR
A pointer to a
\fBprintf\fR()-style
function that may be used by the
@@ -3098,7 +3130,7 @@ The
\fBplugin_printf\fR()
function returns number of characters printed on success and \-1 on failure.
.TP 6n
-settings
+\fIsettings\fR
A vector of user-supplied
\fBsudo\fR
settings in the form of
@@ -3129,7 +3161,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible settings.
.TP 6n
-user_info
+\fIuser_info\fR
A vector of information about the user running the command in the form of
\(lqname=value\(rq
strings.
@@ -3154,7 +3186,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-submit_optind
+\fIsubmit_optind\fR
The index into
\fIsubmit_argv\fR
that corresponds to the first entry that is not a command line option.
@@ -3165,10 +3197,10 @@ only consists of options, which may be the case with the
or
\fB\-v\fR
options,
-\fRsubmit_argv[submit_optind]\fR
+\fIsubmit_argv\fR[\fIsubmit_optind\fR]
will evaluate to the NULL pointer.
.TP 6n
-submit_argv
+\fIsubmit_argv\fR
The argument vector
\fBsudo\fR
was invoked with, including all command line options.
@@ -3176,7 +3208,7 @@ The
\fIsubmit_optind\fR
argument can be used to determine the end of the command line options.
.TP 6n
-submit_envp
+\fIsubmit_envp\fR
The invoking user's environment in the form of a
\fRNULL\fR-terminated
vector of
@@ -3196,7 +3228,7 @@ itself but the
\fIvalue\fR
might.
.TP 6n
-plugin_options
+\fIplugin_options\fR
Any (non-comment) strings immediately after the plugin path are
treated as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -3209,7 +3241,7 @@ will be the
\fRNULL\fR
pointer.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBopen\fR()
function returns a value other than 1, the plugin may
@@ -3228,7 +3260,7 @@ function is called.
.RE
.PD
.TP 6n
-close
+\fIclose\fR
.br
.nf
.RS 6n
@@ -3245,7 +3277,7 @@ is finished, shortly before it exits.
.sp
The function arguments are as follows:
.TP 6n
-status_type
+\fIstatus_type\fR
The type of status being passed.
One of
\fRSUDO_PLUGIN_NO_STATUS\fR,
@@ -3254,18 +3286,18 @@ One of
or
\fRSUDO_PLUGIN_SUDO_ERROR\fR.
.TP 6n
-status
+\fIstatus\fR
Depending on the value of
\fIstatus_type\fR,
this value is either
ignored, the command's exit status as returned by the
wait(2)
system call, the value of
-\fRerrno\fR
+\fIerrno\fR
set by the
execve(2)
system call, or the value of
-\fRerrno\fR
+\fIerrno\fR
resulting from an error in the
\fBsudo\fR
front-end.
@@ -3274,7 +3306,7 @@ front-end.
.RE
.PD
.TP 6n
-accept
+\fIaccept\fR
.nf
.RS 6n
int (*accept)(const char *plugin_name, unsigned int plugin_type,
@@ -3290,14 +3322,14 @@ function is called when a command or action is accepted by a policy
or approval plugin.
The function arguments are as follows:
.TP 6n
-plugin_name
+\fIplugin_name\fR
The name of the plugin that accepted the command or
\(lqsudo\(rq
for the
\fBsudo\fR
front-end.
.TP 6n
-plugin_type
+\fIplugin_type\fR
The type of plugin that accepted the command, currently either
\fRSUDO_POLICY_PLUGIN\fR,
\fRSUDO_POLICY_APPROVAL\fR,
@@ -3325,7 +3357,7 @@ functions will
\fIboth\fR
be called.
.TP 6n
-command_info
+\fIcommand_info\fR
An optional
vector of information describing the command being run in the form of
\(lqname=value\(rq
@@ -3351,7 +3383,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-run_argv
+\fIrun_argv\fR
A
\fRNULL\fR-terminated
argument vector describing a command that will be run in the
@@ -3359,7 +3391,7 @@ same form as what would be passed to the
execve(2)
system call.
.TP 6n
-run_envp
+\fIrun_envp\fR
The environment the command will be run with in the form of a
\fRNULL\fR-terminated
vector of
@@ -3379,7 +3411,7 @@ itself but the
\fIvalue\fR
might.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBaccept\fR()
function returns a value other than 1, the plugin may
@@ -3398,7 +3430,7 @@ function is called.
.RE
.PD
.TP 6n
-reject
+\fIreject\fR
.nf
.RS 6n
int (*reject)(const char *plugin_name, unsigned int plugin_type,
@@ -3413,10 +3445,10 @@ The
function is called when a command or action is rejected by a plugin.
The function arguments are as follows:
.TP 6n
-plugin_name
+\fIplugin_name\fR
The name of the plugin that rejected the command.
.TP 6n
-plugin_type
+\fIplugin_type\fR
The type of plugin that rejected the command, currently either
\fRSUDO_POLICY_PLUGIN\fR,
\fRSUDO_APPROVAL_PLUGIN\fR,
@@ -3431,7 +3463,7 @@ function is not called on behalf of the
\fBsudo\fR
front-end.
.TP 6n
-audit_msg
+\fIaudit_msg\fR
An optional string describing the reason the command was rejected
by the plugin.
If the plugin did not provide a reason,
@@ -3440,7 +3472,7 @@ will be the
\fRNULL\fR
pointer.
.TP 6n
-command_info
+\fIcommand_info\fR
An optional
vector of information describing the command being run in the form of
\(lqname=value\(rq
@@ -3466,7 +3498,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBreject\fR()
function returns a value other than 1, the plugin may
@@ -3485,7 +3517,7 @@ function is called.
.RE
.PD
.TP 6n
-error
+\fIerror\fR
.br
.nf
.RS 6n
@@ -3503,21 +3535,21 @@ function is called when a plugin or the
front-end returns an error.
The function arguments are as follows:
.TP 6n
-plugin_name
+\fIplugin_name\fR
The name of the plugin that generated the error or
\(lqsudo\(rq
for the
\fBsudo\fR
front-end.
.TP 6n
-plugin_type
+\fIplugin_type\fR
The type of plugin that generated the error, or
\fRSUDO_FRONT_END\fR
for the
\fBsudo\fR
front-end.
.TP 6n
-audit_msg
+\fIaudit_msg\fR
An optional string describing the plugin error.
If the plugin did not provide a description,
\fIaudit_msg\fR
@@ -3525,7 +3557,7 @@ will be the
\fRNULL\fR
pointer.
.TP 6n
-command_info
+\fIcommand_info\fR
An optional
vector of information describing the command being run in the form of
\(lqname=value\(rq
@@ -3551,7 +3583,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBerror\fR()
function returns a value other than 1, the plugin may
@@ -3570,7 +3602,7 @@ function is called.
.RE
.PD
.TP 6n
-show_version
+\fIshow_version\fR
.nf
.RS 6n
int (*show_version)(int verbose);
@@ -3582,8 +3614,7 @@ The
\fBshow_version\fR()
function is called by
\fBsudo\fR
-when the user specifies
-the
+when the user specifies the
\fB\-V\fR
option.
The plugin may display its version information to the user via the
@@ -3599,19 +3630,19 @@ or \-2 if there was a usage error, although the return value is currently
ignored.
.RE
.TP 6n
-register_hooks
+\fIregister_hooks\fR
See the
\fIPolicy plugin API\fR
section for a description of
-\fRregister_hooks\fR.
+\fBregister_hooks\fR().
.TP 6n
-deregister_hooks
+\fIderegister_hooks\fR
See the
\fIPolicy plugin API\fR
section for a description of
-\fRderegister_hooks\fR.
+\fBderegister_hooks\fR().
.TP 6n
-event_alloc
+\fIevent_alloc\fR
.nf
.RS 6n
struct sudo_plugin_event * (*event_alloc)(void);
@@ -3622,12 +3653,12 @@ struct sudo_plugin_event * (*event_alloc)(void);
The
\fBevent_alloc\fR()
function is used to allocate a
-\fRstruct sudo_plugin_event\fR
+\fIstruct sudo_plugin_event\fR
which provides access to the main
\fBsudo\fR
event loop.
Unlike the other fields, the
-\fBevent_alloc\fR()
+\fIevent_alloc\fR
pointer is filled in by the
\fBsudo\fR
front-end, not by the plugin.
@@ -3656,7 +3687,7 @@ struct approval_plugin {
unsigned int type; /* always SUDO_APPROVAL_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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -3681,17 +3712,19 @@ before the plugin is closed).
Multiple approval plugins may be specified in
sudo.conf(@mansectform@).
.PP
-The approval_plugin struct has the following fields:
+A
+\fIstruct approval_plugin\fR
+has the following fields:
.TP 6n
-type
+\fItype\fR
The
-\fRtype\fR
+\fItype\fR
field should always be set to
\fRSUDO_APPROVAL_PLUGIN\fR.
.TP 6n
-version
+\fIversion\fR
The
-\fRversion\fR
+\fIversion\fR
field should be set to
\fRSUDO_API_VERSION\fR.
.sp
@@ -3700,11 +3733,11 @@ This allows
to determine the API version the plugin was
built against.
.TP 6n
-open
+\fIopen\fR
.nf
.RS 6n
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t sudo_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -3738,14 +3771,14 @@ to present additional error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-version
+\fIversion\fR
The version passed in by
\fBsudo\fR
allows the plugin to determine the
major and minor version number of the plugin API supported by
\fBsudo\fR.
.TP 6n
-conversation
+\fIconversation\fR
A pointer to the
\fBconversation\fR()
function that can be used by the plugin to interact with the user (see
@@ -3753,7 +3786,7 @@ function that can be used by the plugin to interact with the user (see
for details).
Returns 0 on success and \-1 on failure.
.TP 6n
-plugin_printf
+\fIplugin_printf\fR
A pointer to a
\fBprintf\fR()-style
function that may be used to display informational or error messages (see
@@ -3761,7 +3794,7 @@ function that may be used to display informational or error messages (see
for details).
Returns the number of characters printed on success and \-1 on failure.
.TP 6n
-settings
+\fIsettings\fR
A vector of user-supplied
\fBsudo\fR
settings in the form of
@@ -3792,7 +3825,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible settings.
.TP 6n
-user_info
+\fIuser_info\fR
A vector of information about the user running the command in the form of
\(lqname=value\(rq
strings.
@@ -3817,7 +3850,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-submit_optind
+\fIsubmit_optind\fR
The index into
\fIsubmit_argv\fR
that corresponds to the first entry that is not a command line option.
@@ -3828,10 +3861,10 @@ only consists of options, which may be the case with the
or
\fB\-v\fR
options,
-\fRsubmit_argv[submit_optind]\fR
+\fIsubmit_argv\fR[\fIsubmit_optind\fR]
will evaluate to the NULL pointer.
.TP 6n
-submit_argv
+\fIsubmit_argv\fR
The argument vector
\fBsudo\fR
was invoked with, including all command line options.
@@ -3839,7 +3872,7 @@ The
\fIsubmit_optind\fR
argument can be used to determine the end of the command line options.
.TP 6n
-submit_envp
+\fIsubmit_envp\fR
The invoking user's environment in the form of a
\fRNULL\fR-terminated
vector of
@@ -3859,7 +3892,7 @@ itself but the
\fIvalue\fR
might.
.TP 6n
-plugin_options
+\fIplugin_options\fR
Any (non-comment) strings immediately after the plugin path are
treated as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -3872,7 +3905,7 @@ will be the
\fRNULL\fR
pointer.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBopen\fR()
function returns a value other than 1, the plugin may
@@ -3891,7 +3924,7 @@ function is called.
.RE
.PD
.TP 6n
-close
+\fIclose\fR
.br
.nf
.RS 6n
@@ -3919,7 +3952,7 @@ may be set to the
pointer.
.RE
.TP 6n
-check
+\fIcheck\fR
.br
.nf
.RS 6n
@@ -3951,7 +3984,7 @@ to present additional error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-command_info
+\fIcommand_info\fR
A vector of information describing the command being run in the form of
\(lqname=value\(rq
strings.
@@ -3976,7 +4009,7 @@ See the
\fIPolicy plugin API\fR
section for a list of all possible strings.
.TP 6n
-run_argv
+\fIrun_argv\fR
A
\fRNULL\fR-terminated
argument vector describing a command that will be run in the
@@ -3984,7 +4017,7 @@ same form as what would be passed to the
execve(2)
system call.
.TP 6n
-run_envp
+\fIrun_envp\fR
The environment the command will be run with in the form of a
\fRNULL\fR-terminated
vector of
@@ -4004,7 +4037,7 @@ itself but the
\fIvalue\fR
might.
.TP 6n
-errstr
+\fIerrstr\fR
If the
\fBopen\fR()
function returns a value other than 1, the plugin may
@@ -4023,7 +4056,7 @@ function is called.
.RE
.PD
.TP 6n
-show_version
+\fIshow_version\fR
.nf
.RS 6n
int (*show_version)(int verbose);
@@ -4035,8 +4068,7 @@ The
\fBshow_version\fR()
function is called by
\fBsudo\fR
-when the user specifies
-the
+when the user specifies the
\fB\-V\fR
option.
The plugin may display its version information to the user via the
@@ -4138,19 +4170,19 @@ struct sudo_hook {
.RE
.fi
.PP
-The
-\fRsudo_hook\fR
-structure has the following fields:
+A
+\fIstruct sudo_hook\fR
+has the following fields:
.TP 6n
-hook_version
+\fIhook_version\fR
The
-\fRhook_version\fR
+\fIhook_version\fR
field should be set to
\fRSUDO_HOOK_VERSION\fR.
.TP 6n
-hook_type
+\fIhook_type\fR
The
-\fRhook_type\fR
+\fIhook_type\fR
field may be one of the following supported hook types:
.PP
.RS 6n
@@ -4162,7 +4194,7 @@ setenv(3)
function.
Any registered hooks will run before the C library implementation.
The
-\fRhook_fn\fR
+\fIhook_fn\fR
field should
be a function that matches the following typedef:
.nf
@@ -4185,7 +4217,7 @@ unsetenv(3)
function.
Any registered hooks will run before the C library implementation.
The
-\fRhook_fn\fR
+\fIhook_fn\fR
field should
be a function that matches the following typedef:
.nf
@@ -4202,7 +4234,7 @@ getenv(3)
function.
Any registered hooks will run before the C library implementation.
The
-\fRhook_fn\fR
+\fIhook_fn\fR
field should
be a function that matches the following typedef:
.nf
@@ -4224,7 +4256,7 @@ putenv(3)
function.
Any registered hooks will run before the C library implementation.
The
-\fRhook_fn\fR
+\fIhook_fn\fR
field should
be a function that matches the following typedef:
.nf
@@ -4244,32 +4276,33 @@ unspecified.
.RE
.PD
.TP 6n
-hook_fn
+\fIhook_fn\fR
+.nf
+.RS 6n
sudo_hook_fn_t hook_fn;
+.RE
+.fi
+.RS 6n
.sp
The
-\fRhook_fn\fR
+\fIhook_fn\fR
field should be set to the plugin's hook implementation.
The actual function arguments will vary depending on the
-\fRhook_type\fR
+\fIhook_type\fR
(see
-\fRhook_type\fR
+\fIhook_type\fR
above).
In all cases, the
-\fRclosure\fR
+\fIclosure\fR
field of
-\fRstruct sudo_hook\fR
+\fIstruct sudo_hook\fR
is passed as the last function parameter.
This can be used to pass arbitrary data to the plugin's hook implementation.
.sp
The function return value may be one of the following:
-.PP
-.RS 6n
-.PD 0
.TP 6n
\fRSUDO_HOOK_RET_ERROR\fR
The hook function encountered an error.
-.PD
.TP 6n
\fRSUDO_HOOK_RET_NEXT\fR
The hook completed without error, go on to the next hook (including
@@ -4284,10 +4317,10 @@ if the specified variable was not found in the private copy of the environment.
The hook completed without error, stop processing hooks for this invocation.
This can be used to replace the system implementation.
For example, a
-\fRsetenv\fR
+\fIsetenv\fR
hook that operates on a private copy of
the environment but leaves
-\fRenviron\fR
+\fIenviron\fR
unchanged.
.PD 0
.PP
@@ -4310,7 +4343,7 @@ function to guard against nested calls.
For example:
.nf
.sp
-.RS 0n
+.RS 6n
static int in_progress = 0; /* avoid recursion */
if (in_progress)
return SUDO_HOOK_RET_NEXT;
@@ -4368,10 +4401,11 @@ struct sudo_plugin_event {
.RE
.fi
.PP
-The sudo_plugin_event struct contains the following function pointers:
+A
+\fIstruct sudo_plugin_event\fR
+contains the following function pointers:
.TP 6n
-\fBset\fR()
-.br
+\fIset\fR
.nf
.RS 6n
int (*set)(struct sudo_plugin_event *pev, int fd, int events,
@@ -4384,8 +4418,10 @@ The
\fBset\fR()
function takes the following arguments:
.TP 6n
-struct sudo_plugin_event *\fIpev\fR
-A pointer to the struct sudo_plugin_event itself.
+\fIstruct sudo_plugin_event *\fR\fIpev\fR
+A pointer to the
+\fIstruct sudo_plugin_event\fR
+itself.
.TP 6n
\fIfd\fR
The file or socket descriptor for I/O-based events or the signal
@@ -4400,20 +4436,20 @@ The following values determine what will trigger the event callback:
.RS 6n
.PD 0
.TP 6n
-SUDO_PLUGIN_EV_TIMEOUT
+\fRSUDO_PLUGIN_EV_TIMEOUT\fR
callback is run after the specified timeout expires
.PD
.TP 6n
-SUDO_PLUGIN_EV_READ
+\fRSUDO_PLUGIN_EV_READ\fR
callback is run when the file descriptor is readable
.TP 6n
-SUDO_PLUGIN_EV_WRITE
+\fRSUDO_PLUGIN_EV_WRITE\fR
callback is run when the file descriptor is writable
.TP 6n
-SUDO_PLUGIN_EV_PERSIST
+\fRSUDO_PLUGIN_EV_PERSIST\fR
event is persistent and remains enabled until explicitly deleted
.TP 6n
-SUDO_PLUGIN_EV_SIGNAL
+\fRSUDO_PLUGIN_EV_SIGNAL\fR
callback is run when the specified signal is received
.PP
The
@@ -4428,7 +4464,7 @@ either read from or written to.
All other event values are mutually exclusive.
.RE
.TP 6n
-sudo_plugin_ev_callback_t \fIcallback\fR
+\fIsudo_plugin_ev_callback_t\fR \fIcallback\fR
.nf
.RS 6n
typedef void (*sudo_plugin_ev_callback_t)(int fd, int what,
@@ -4465,7 +4501,7 @@ function.
.RE
.PD
.TP 6n
-closure
+\fIclosure\fR
A generic pointer that will be passed to the callback function.
.PP
The
@@ -4473,8 +4509,7 @@ The
function returns 1 on success, and \-1 if a error occurred.
.RE
.TP 6n
-\fBadd\fR()
-.br
+\fIadd\fR
.nf
.RS 6n
int (*add)(struct sudo_plugin_event *pev, struct timespec *timeout);
@@ -4509,8 +4544,7 @@ The
function returns 1 on success, and \-1 if a error occurred.
.RE
.TP 6n
-\fBdel\fR()
-.br
+\fIdel\fR
.nf
.RS 6n
int (*del)(struct sudo_plugin_event *pev);
@@ -4534,7 +4568,7 @@ The
function returns 1 on success, and \-1 if a error occurred.
.RE
.TP 6n
-\fBpending\fR()
+\fIpending\fR
.nf
.RS 6n
int (*pending)(struct sudo_plugin_event *pev, int events,
@@ -4555,13 +4589,13 @@ function for a list of valid event types.
If
\fRSUDO_PLUGIN_EV_TIMEOUT\fR
is specified in
-\fRevents\fR,
+\fIevents\fR,
the event has an associated timeout and the
\fIts\fR
pointer is non-NULL, it will be filled in with the remaining time.
.RE
.TP 6n
-\fBfd\fR()
+\fIfd\fR
.nf
.RS 6n
int (*fd)(struct sudo_plugin_event *pev);
@@ -4576,7 +4610,7 @@ the event
\fIpev\fR.
.RE
.TP 6n
-\fBsetbase\fR()
+\fIsetbase\fR
.nf
.RS 6n
void (*setbase)(struct sudo_plugin_event *pev, void *base);
@@ -4609,7 +4643,7 @@ It is unlikely to be used outside of the
plugin.
.RE
.TP 6n
-\fBloopbreak\fR()
+\fIloopbreak\fR
.nf
.RS 6n
void (*loopbreak)(struct sudo_plugin_event *pev);
@@ -4624,7 +4658,7 @@ function causes
event loop to exit immediately and the running command to be terminated.
.RE
.TP 6n
-\fBfree\fR()
+\fIfree\fR
.nf
.RS 6n
void (*free)(struct sudo_plugin_event *pev);
@@ -4684,9 +4718,9 @@ If the plugin needs to interact with the user, it may do so via the
\fBconversation\fR()
function.
A plugin should not attempt to read directly from the standard input
-or the user's tty (neither of which are guaranteed to exist).
+or the user's terminal (neither of which are guaranteed to exist).
The caller must include a trailing newline in
-\fRmsg\fR
+\fImsg\fR
if one is to be printed.
.PP
A
@@ -4756,25 +4790,23 @@ typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
To use the
\fBconversation\fR()
function, the plugin must pass an array of
-\fRsudo_conv_message\fR
+\fIstruct sudo_conv_message\fR
and
-\fRsudo_conv_reply\fR
-structures.
+\fIstruct sudo_conv_reply\fR.
There must be a
-\fRstruct sudo_conv_message\fR
+\fIstruct sudo_conv_message\fR
and
-\fRstruct sudo_conv_reply\fR
-for
-each message in the conversation, that is, both arrays must have the same
-number of elements.
+\fIstruct sudo_conv_reply\fR
+for each message in the conversation, that is, both arrays must
+have the same number of elements.
Each
-\fRstruct sudo_conv_reply\fR
+\fIstruct sudo_conv_reply\fR
must have its
\fIreply\fR
member initialized to
\fRNULL\fR.
The
-\fRstruct sudo_conv_callback\fR
+\fIstruct sudo_conv_callback\fR
pointer, if not
\fRNULL\fR,
should contain function pointers to be called when the
@@ -4789,7 +4821,7 @@ functions are called with the signal that caused
to be suspended and the
\fIclosure\fR
pointer from the
-\fRstruct sudo_conv_callback\fR.
+\fIstruct sudo_conv_callback\fR.
These functions should return 0 on success and \-1 on error.
On error, the conversation will end and the conversation function
will return a value of \-1.
@@ -4802,7 +4834,7 @@ The
\fImsg_type\fR
must be set to one of the following values:
.TP 6n
-SUDO_CONV_PROMPT_ECHO_OFF
+\fRSUDO_CONV_PROMPT_ECHO_OFF\fR
Prompt the user for input with echo disabled;
this is generally used for passwords.
The reply will be stored in the
@@ -4810,26 +4842,26 @@ The reply will be stored in the
array, and it will never be
\fRNULL\fR.
.TP 6n
-SUDO_CONV_PROMPT_ECHO_ON
+\fRSUDO_CONV_PROMPT_ECHO_ON\fR
Prompt the user for input with echo enabled.
The reply will be stored in the
\fIreplies\fR
array, and it will never be
\fRNULL\fR.
.TP 6n
-SUDO_CONV_ERROR_MSG
+\fRSUDO_CONV_ERROR_MSG\fR
Display an error message.
The message is written to the standard error unless the
\fRSUDO_CONV_PREFER_TTY\fR
flag is set, in which case it is written to the user's terminal if possible.
.TP 6n
-SUDO_CONV_INFO_MSG
+\fRSUDO_CONV_INFO_MSG\fR
Display a message.
The message is written to the standard output unless the
\fRSUDO_CONV_PREFER_TTY\fR
flag is set, in which case it is written to the user's terminal if possible.
.TP 6n
-SUDO_CONV_PROMPT_MASK
+\fRSUDO_CONV_PROMPT_MASK\fR
Prompt the user for input but echo an asterisk character for each
character read.
The reply will be stored in the
@@ -4841,7 +4873,7 @@ sensitive information that should not be displayed.
.PP
In addition to the above values, the following flag bits may also be set:
.TP 6n
-SUDO_CONV_PROMPT_ECHO_OK
+\fRSUDO_CONV_PROMPT_ECHO_OK\fR
Allow input to be read when echo cannot be disabled
when the message type is
\fRSUDO_CONV_PROMPT_ECHO_OFF\fR
@@ -4852,7 +4884,7 @@ By default,
will refuse to read input if the echo cannot be disabled for those
message types.
.TP 6n
-SUDO_CONV_PREFER_TTY
+\fRSUDO_CONV_PREFER_TTY\fR
When displaying a message via
\fRSUDO_CONV_ERROR_MSG\fR
or
@@ -4873,7 +4905,7 @@ in seconds until the prompt will wait for no more input.
A zero value implies an infinite timeout.
.PP
The plugin is responsible for freeing the reply buffer located in each
-\fRstruct sudo_conv_reply\fR,
+\fIstruct sudo_conv_reply\fR,
if it is not
\fRNULL\fR.
\fRSUDO_CONV_REPL_MAX\fR
@@ -4972,8 +5004,8 @@ sudoers(@mansectform@).
Third party group plugins include a QAS AD plugin available from Quest Software.
.PP
A group plugin must declare and populate a
-\fRsudoers_group_plugin\fR
-struct in the global scope.
+\fIstruct sudoers_group_plugin\fR
+in the global scope.
This structure contains pointers to the functions that implement plugin
initialization, cleanup, and group lookup.
.nf
@@ -4981,7 +5013,7 @@ initialization, cleanup, and group lookup.
.RS 0n
struct sudoers_group_plugin {
unsigned int version;
- int (*init)(int version, sudo_printf_t sudo_printf,
+ int (*init)(int version, sudo_printf_t sudo_plugin_printf,
char *const argv[]);
void (*cleanup)(void);
int (*query)(const char *user, const char *group,
@@ -4990,13 +5022,13 @@ struct sudoers_group_plugin {
.RE
.fi
.PP
-The
-\fRsudoers_group_plugin\fR
-struct has the following fields:
+A
+\fIstruct sudoers_group_plugin\fR
+has the following fields:
.TP 6n
-version
+\fIversion\fR
The
-\fRversion\fR
+\fIversion\fR
field should be set to GROUP_API_VERSION.
.sp
This allows
@@ -5004,10 +5036,10 @@ This allows
to determine the API version the group plugin
was built against.
.TP 6n
-init
+\fIinit\fR
.nf
.RS 6n
-int (*init)(int version, sudo_printf_t plugin_printf,
+int (*init)(int version, sudo_printf_t sudo_plugin_printf,
char *const argv[]);
.RE
.fi
@@ -5029,20 +5061,20 @@ to present additional error information to the user.
.sp
The function arguments are as follows:
.TP 6n
-version
+\fIversion\fR
The version passed in by
\fBsudoers\fR
allows the plugin to determine the
major and minor version number of the group plugin API supported by
\fBsudoers\fR.
.TP 6n
-plugin_printf
+\fIplugin_printf\fR
A pointer to a
\fBprintf\fR()-style
function that may be used to display informational or error message to the user.
Returns the number of characters printed on success and \-1 on failure.
.TP 6n
-argv
+\fIargv\fR
A
\fRNULL\fR-terminated
array of arguments generated from the
@@ -5058,7 +5090,7 @@ will be
.RE
.PD
.TP 6n
-cleanup
+\fIcleanup\fR
.nf
.RS 6n
void (*cleanup)();
@@ -5075,7 +5107,7 @@ group checks.
The plugin should free any memory it has allocated and close open file handles.
.RE
.TP 6n
-query
+\fIquery\fR
.br
.nf
.RS 6n
@@ -5094,14 +5126,14 @@ is a member of
.sp
The function arguments are as follows:
.TP 6n
-user
+\fIuser\fR
The name of the user being looked up in the external group database.
.TP 6n
-group
+\fIgroup\fR
.br
The name of the group being queried.
.TP 6n
-pwd
+\fIpwd\fR
The password database entry for
\fIuser\fR,
if any.
@@ -5140,7 +5172,7 @@ Version 1.1 (sudo 1.8.0)
The I/O logging plugin's
\fBopen\fR()
function was modified to take the
-\fRcommand_info\fR
+\fIcommand_info\fR
list as an argument.
.TP 6n
Version 1.2 (sudo 1.8.5)
@@ -5154,7 +5186,7 @@ A simple hooks API has been introduced to allow plugins to hook in to the
system's environment handling functions.
.sp
The
-\fRinit_session\fR
+\fBinit_session\fR()
Policy plugin function is now passed a pointer
to the user environment which can be updated as needed.
This can be used to merge in environment variables stored in the PAM
@@ -5164,7 +5196,7 @@ Version 1.3 (sudo 1.8.7)
Support for the
\fIexec_background\fR
entry has been added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
.sp
The
@@ -5172,7 +5204,7 @@ The
and
\fIplugin_dir\fR
entries were added to the
-\fRsettings\fR
+\fIsettings\fR
list.
.sp
The
@@ -5203,14 +5235,14 @@ Version 1.4 (sudo 1.8.8)
The
\fIremote_host\fR
entry was added to the
-\fRsettings\fR
+\fIsettings\fR
list.
.TP 6n
Version 1.5 (sudo 1.8.9)
The
\fIpreserve_fds\fR
entry was added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
.TP 6n
Version 1.6 (sudo 1.8.11)
@@ -5236,7 +5268,7 @@ Version 1.7 (sudo 1.8.12)
The
\fIplugin_path\fR
entry was added to the
-\fRsettings\fR
+\fIsettings\fR
list.
.sp
The
@@ -5251,19 +5283,19 @@ The
and
\fIsudoedit_follow\fR
entries were added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
The default value of
\fIsudoedit_checkdir\fR
was changed to true in sudo 1.8.16.
.sp
The sudo
-\fIconversation\fR
+\fBconversation\fR()
function now takes a pointer to a
-\fRstruct sudo_conv_callback\fR
+\fIstruct sudo_conv_callback\fR
as its fourth argument.
The
-\fRsudo_conv_t\fR
+\fIsudo_conv_t\fR
definition has been updated to match.
The plugin must specify that it supports plugin API version 1.8 or higher
to receive a conversation function pointer that supports this argument.
@@ -5272,14 +5304,14 @@ Version 1.9 (sudo 1.8.16)
The
\fIexecfd\fR
entry was added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
.TP 6n
Version 1.10 (sudo 1.8.19)
The
\fIumask\fR
entry was added to the
-\fRuser_info\fR
+\fIuser_info\fR
list.
The
\fIiolog_group\fR,
@@ -5287,43 +5319,48 @@ The
and
\fIiolog_user\fR
entries were added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
.TP 6n
Version 1.11 (sudo 1.8.20)
The
\fItimeout\fR
entry was added to the
-\fRsettings\fR
+\fIsettings\fR
list.
.TP 6n
Version 1.12 (sudo 1.8.21)
The
-\fRchange_winsize\fR
-field was added to the io_plugin struct.
+\fBchange_winsize\fR()
+function was added to
+\fIstruct io_plugin\fR.
.TP 6n
Version 1.13 (sudo 1.8.26)
The
-\fRlog_suspend\fR
-field was added to the io_plugin struct.
+\fBlog_suspend\fR()
+function was added to
+\fIstruct io_plugin\fR.
.TP 6n
Version 1.14 (sudo 1.8.29)
The
\fIumask_override\fR
entry was added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
.TP 6n
Version 1.15 (sudo 1.9.0)
The
\fIcwd_optional\fR
entry was added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
.sp
The
-\fIevent_alloc\fR
-field was added to the policy_plugin and io_plugin structs.
+\fBevent_alloc\fR()
+function was added to
+\fIstruct policy_plugin\fR
+and
+\fIstruct io_plugin\fR.
.sp
The
\fIerrstr\fR
@@ -5346,7 +5383,7 @@ Support for audit and approval plugins was added.
.TP 6n
Version 1.16 (sudo 1.9.3)
Initial resource limit values were added to the
-\fRuser_info\fR
+\fIuser_info\fR
list.
.sp
The
@@ -5354,24 +5391,27 @@ The
and
\fIcmnd_cwd\fR
entries were added to the
-\fRsettings\fR
+\fIsettings\fR
list.
.TP 6n
Version 1.17 (sudo 1.9.4)
The
-\fIevent_alloc\fR
-field was added to the audit_plugin and approval_plugin structs.
+\fBevent_alloc\fR()
+function was added to
+\fIstruct audit_plugin\fR
+and
+\fIstruct approval_plugin\fR.
.TP 6n
Version 1.18 (sudo 1.9.9)
The policy may now set resource limit values in the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
The
\fIintercept\fR
and
\fIlog_subcmds\fR
entries were added to the
-\fRcommand_info\fR
+\fIcommand_info\fR
list.
.TP 6n
Version 1.19 (sudo 1.9.11)
@@ -5380,12 +5420,26 @@ The
and
\fIintercept_setid\fR
entries were added to the
-\fRsettings\fR
+\fIsettings\fR
+list.
+The
+\fIapparmor_profile\fR
+and
+\fIuse_ptrace\fR
+entries were added to the
+\fIcommand_info\fR
list.
+.TP 6n
+Version 1.20 (sudo 1.9.12)
The
-\fIuser_ptrace\fR
+\fIupdate_ticket\fR
entry was added to the
-\fRcommand_info\fR
+\fIsettings\fR
+list.
+The
+\fIintercept_verify\fR
+entry was added to the
+\fIcommand_info\fR
list.
.SH "SEE ALSO"
sudo.conf(@mansectform@),
diff --git a/docs/sudo_plugin.mdoc.in b/docs/sudo_plugin.mdoc.in
index 24f2f5976..bca8fcbae 100644
--- a/docs/sudo_plugin.mdoc.in
+++ b/docs/sudo_plugin.mdoc.in
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd May 26, 2022
+.Dd October 7, 2022
.Dt SUDO_PLUGIN @mansectform@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -47,12 +47,12 @@ A plugin should be check the version passed to it and make sure that the
major version matches.
.Pp
The plugin API is defined by the
-.Li sudo_plugin.h
+.In sudo_plugin.h
header file.
.Ss Policy plugin API
A policy plugin must declare and populate a
-.Li policy_plugin
-struct in the global scope.
+.Vt struct policy_plugin
+in the global scope.
This structure contains pointers to the functions that implement the
.Nm sudo
policy checks.
@@ -67,7 +67,7 @@ struct policy_plugin {
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 plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], char * const user_env[],
char * const plugin_options[], const char **errstr);
void (*close)(int exit_status, int error);
@@ -76,9 +76,9 @@ struct policy_plugin {
char *env_add[], char **command_info[],
char **argv_out[], char **user_env_out[], const char **errstr);
int (*list)(int argc, char * const argv[], int verbose,
- const char *list_user, const char **errstr);
+ const char *user, const char **errstr);
int (*validate)(const char **errstr);
- void (*invalidate)(int remove);
+ void (*invalidate)(int rmcred);
int (*init_session)(struct passwd *pwd, char **user_env[],
const char **errstr);
void (*register_hooks)(int version,
@@ -89,15 +89,17 @@ struct policy_plugin {
};
.Ed
.Pp
-The policy_plugin struct has the following fields:
+A
+.Vt struct policy_plugin
+has the following fields:
.Bl -tag -width 4n
-.It type
+.It Fa type
The
-.Li type
+.Fa type
field should always be set to SUDO_POLICY_PLUGIN.
-.It version
+.It Fa version
The
-.Li version
+.Fa version
field should be set to
.Dv SUDO_API_VERSION .
.Pp
@@ -105,10 +107,10 @@ This allows
.Nm sudo
to determine the API version the plugin was
built against.
-.It open
+.It Fa open
.Bd -literal -compact
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], char * const user_env[],
char * const plugin_options[], const char **errstr);
.Ed
@@ -121,34 +123,34 @@ will print a usage message before it exits.
If an error occurs, the plugin may optionally call the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function with
.Dv SUDO_CONF_ERROR_MSG
to present additional error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It version
+.It Fa version
The version passed in by
.Nm sudo
allows the plugin to determine the
major and minor version number of the plugin API supported by
.Nm sudo .
-.It conversation
+.It Fa conversation
A pointer to the
.Fn conversation
function that can be used by the plugin to interact with the user (see
.Sx Conversation API
for details).
Returns 0 on success and \-1 on failure.
-.It plugin_printf
+.It Fa sudo_plugin_printf
A pointer to a
.Fn printf Ns -style
function that may be used to display informational or error messages (see
.Sx Conversation API
for details).
Returns the number of characters printed on success and \-1 on failure.
-.It settings
+.It Fa settings
A vector of user-supplied
.Nm sudo
settings in the form of
@@ -163,15 +165,14 @@ As such, they will only be present when the corresponding option has
been specified on the command line.
.Pp
When parsing
-.Em settings ,
+.Fa settings ,
the plugin should split on the
.Sy first
equal sign
.Pq Ql =
since the
.Em name
-field will never include one
-itself but the
+field will never include one itself but the
.Em value
might.
.Pp
@@ -194,7 +195,7 @@ close all files descriptors with a value of
.Em number
or higher.
The plugin may optionally pass this, or another value, back in the
-.Em command_info
+.Fa command_info
list.
.It cmnd_chroot=string
The root directory (see
@@ -215,7 +216,7 @@ Only available starting with API version 1.16.
.It debug_flags=string
A debug file path name followed by a space and a comma-separated
list of debug flags that correspond to the plugin's
-.Li Debug
+.Em Debug
entry in
.Xr sudo.conf @mansectform@ ,
if there is one.
@@ -244,7 +245,7 @@ will only pass
if
.Xr sudo.conf @mansectform@
contains a plugin-specific
-.Li Debug
+.Em Debug
entry.
.It ignore_ticket=bool
Set to true if the user specified the
@@ -281,6 +282,7 @@ filtering and the
action.
Other systems will use a dynamic shared object to implement
intercept.
+Only available starting with API version 1.19.
.It intercept_setid=bool
Indicates whether or not the system supports running set-user-ID
and set-group-ID binaries in intercept mode.
@@ -297,6 +299,7 @@ This will disable intercept mode for that program and any other
programs that it executes.
The policy plugin may refuse to execute a set-user-ID or set-group-ID
binary in intercept mode to avoid this.
+Only available starting with API version 1.19.
.It login_class=string
.Bx
login class to use when setting resource limits and nice value,
@@ -405,7 +408,7 @@ Set to true if the user specified the
.Fl H
option.
If true, set the
-.Li HOME
+.Ev HOME
environment variable to the target user's home directory.
.It sudoedit=bool
Set to true when the
@@ -413,14 +416,14 @@ Set to true when the
option is specified or if invoked as
.Nm sudoedit .
The plugin shall substitute an editor into
-.Em argv
+.Fa argv
in the
.Fn check_policy
function or return \-2 with a usage error
if the plugin does not support
.Em sudoedit .
For more information, see the
-.Em check_policy
+.Fn check_policy
section.
.It timeout=string
Command timeout specified by the user via the
@@ -429,11 +432,17 @@ option.
Not all plugins support command timeouts and the ability of the
user to set a timeout may be restricted by policy.
The format of the timeout string is plugin-specific.
+.It update_ticket=bool
+Set to false if the user specified the
+.Fl N
+option, indicating that the user wishes to avoid updating any cached
+authentication credentials.
+Only available starting with API version 1.20.
.El
.Pp
Additional settings may be added in the future so the plugin should
silently ignore settings that it does not recognize.
-.It user_info
+.It Fa user_info
A vector of information about the user running the command in the form of
.Dq name=value
strings.
@@ -442,7 +451,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em user_info ,
+.Fa user_info ,
the plugin should split on the
.Sy first
equal sign
@@ -594,7 +603,7 @@ Only available starting with API version 1.2.
The path to the user's terminal device.
If the user has no terminal device associated with the session,
the value will be empty, as in
-.Dq Li tty= .
+.Ql tty= .
.It uid=uid_t
The real user-ID of the user invoking
.Nm sudo .
@@ -605,14 +614,14 @@ Only available starting with API version 1.10.
The name of the user invoking
.Nm sudo .
.El
-.It user_env
+.It Fa user_env
The user's environment in the form of a
.Dv NULL Ns -terminated vector of
.Dq name=value
strings.
.Pp
When parsing
-.Em user_env ,
+.Fa user_env ,
the plugin should split on the
.Sy first
equal sign
@@ -623,7 +632,7 @@ field will never include one
itself but the
.Em value
might.
-.It plugin_options
+.It Fa plugin_options
Any (non-comment) strings immediately after the plugin path are
passed as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -632,13 +641,13 @@ the plugin in the form of a
array of strings.
If no arguments were
specified,
-.Em plugin_options
+.Fa plugin_options
will be the
.Dv NULL
pointer.
.Pp
The
-.Em plugin_options
+.Fa plugin_options
parameter is only available starting with
API version 1.2.
A plugin
@@ -647,9 +656,9 @@ check the API version specified
by the
.Nm sudo
front-end before using
-.Em plugin_options .
+.Fa plugin_options .
Failure to do so may result in a crash.
-.It errstr
+.It Fa errstr
If the
.Fn open
function returns a value other than 1, the plugin may
@@ -676,7 +685,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It close
+.It Fa close
.Bd -literal -compact
void (*close)(int exit_status, int error);
.Ed
@@ -702,28 +711,28 @@ function returned successfully.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It exit_status
+.It Fa exit_status
The command's exit status, as returned by the
.Xr wait 2
system call, or zero if no command was run.
The value of
-.Li exit_status
+.Fa exit_status
is undefined if
-.Li error
+.Fa error
is non-zero.
-.It error
+.It Fa error
If the command could not be executed, this is set to the value of
-.Li errno
+.Va errno
set by the
.Xr execve 2
system call.
The plugin is responsible for displaying error information via the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function.
If the command was successfully executed, the value of
-.Li error
+.Fa error
is zero.
.El
.Pp
@@ -732,15 +741,15 @@ If no
function is defined, no I/O logging plugins are loaded,
and neither the
.Em timeout
-not
+nor
.Em use_pty
options are set in the
-.Li command_info
+.Fa command_info
list, the
.Nm sudo
front-end may execute the command directly instead of running
it as a child process.
-.It show_version
+.It Fa show_version
.Bd -literal -compact
int (*show_version)(int verbose);
.Ed
@@ -749,22 +758,23 @@ The
.Fn show_version
function is called by
.Nm sudo
-when the user specifies
-the
+when the user specifies the
.Fl V
option.
The plugin may display its version information to the user via the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function using
.Dv SUDO_CONV_INFO_MSG .
-If the user requests detailed version information, the verbose flag will be set.
+If the user requests detailed version information, the
+.Fa verbose
+flag will be non-zero.
.Pp
Returns 1 on success, 0 on failure, \-1 if a general error occurred,
or \-2 if there was a usage error, although the return value is currently
ignored.
-.It check_policy
+.It Fa check_policy
.Bd -literal -compact
int (*check_policy)(int argc, char * const argv[], char *env_add[],
char **command_info[], char **argv_out[], char **user_env_out[],
@@ -781,9 +791,8 @@ whether the user is allowed to run the specified commands.
If the
.Em sudoedit
option was enabled in the
-.Em settings
-array
-passed to the
+.Fa settings
+array passed to the
.Fn open
function, the user has requested
.Em sudoedit
@@ -800,28 +809,27 @@ If the plugin supports
.Em sudoedit ,
it should choose the editor to be used, potentially from a variable
in the user's environment, such as
-.Li EDITOR ,
+.Ev EDITOR ,
and include it in
-.Em argv_out
+.Fa argv_out
(environment variables may include command line options).
The files to be edited should be copied from
-.Em argv
+.Fa argv
into
-.Em argv_out ,
+.Fa argv_out ,
separated from the
editor and its arguments by a
-.Dq Li --
+.Ql --
element.
The
-.Dq Li --
-will
-be removed by
+.Ql --
+will be removed by
.Nm sudo
before the editor is executed.
The plugin should also set
.Em sudoedit=true
in the
-.Em command_info
+.Fa command_info
list.
.Pp
The
@@ -838,20 +846,20 @@ exits.
If an error occurs, the plugin may optionally call the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function with
.Dv SUDO_CONF_ERROR_MSG
to present additional error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It argc
+.It Fa argc
The number of elements in
-.Em argv ,
+.Fa argv ,
not counting the final
.Dv NULL
pointer.
-.It argv
+.It Fa argv
The argument vector describing the command the user wishes to run,
in the same form as what would be passed to the
.Xr execve 2
@@ -859,7 +867,7 @@ system call.
The vector is terminated by a
.Dv NULL
pointer.
-.It env_add
+.It Fa env_add
Additional environment variables specified by the user on the command
line in the form of a
.Dv NULL Ns -terminated
@@ -870,25 +878,23 @@ The plugin may reject the command if one or more variables
are not allowed to be set, or it may silently ignore such variables.
.Pp
When parsing
-.Em env_add ,
+.Fa env_add ,
the plugin should split on the
.Sy first
equal sign
.Pq Ql =
since the
.Em name
-field will never include one
-itself but the
+field will never include one itself but the
.Em value
might.
-.It command_info
+.It Fa command_info
Information about the command being run in the form of
.Dq name=value
strings.
These values are used by
.Nm sudo
-to set the execution
-environment when running a command.
+to set the execution environment when running a command.
The plugin is responsible for creating and populating the vector,
which must be terminated with a
.Dv NULL
@@ -896,6 +902,9 @@ pointer.
The following values are recognized by
.Nm sudo :
.Bl -tag -width 4n
+.It apparmor_profile=string
+AppArmor profile to transition to when executing the command.
+Only available starting with API version 1.19.
.It chroot=string
The root directory to use when running the command.
.It closefrom=number
@@ -916,7 +925,7 @@ not be run unless
.Em cwd_optional
is also set (see below).
.It cwd_optional=bool
-If enabled,
+If set,
.Nm sudo
will treat an inability to change to the new working directory as a
non-fatal error.
@@ -952,7 +961,7 @@ Otherwise, any terminal input must be passed to the command, whether it
has required it or not (the kernel buffers terminals so it is not possible
to tell whether the command really wants the input).
This is different from historic
-.Em sudo
+.Nm sudo
behavior or when the command is not being run in a pseudo-terminal.
.Pp
For this to work seamlessly, the operating system must support the
@@ -994,7 +1003,7 @@ The specified
.Em number
must refer to an open file descriptor.
.It intercept=bool
-If specified,
+If set,
.Nm sudo
will intercept attempts to execute a subsequent command and perform
a policy check via the policy plugin's
@@ -1007,6 +1016,16 @@ See
in
.Xr sudoers @mansectform@
for details.
+Only available starting with API version 1.18.
+.It intercept_verify=bool
+If set,
+.Nm sudo
+will attempt to verify that a command run in intercept mode has the
+expected path name, command line arguments and environment.
+This setting has no effect unless
+.Em use_ptrace
+is also enabled.
+Only available starting with API version 1.20.
.It iolog_compress=bool
Set to true if the I/O logging plugins, if any, should compress the
log data.
@@ -1060,7 +1079,7 @@ on
.Bx
systems.
.It log_subcmds=bool
-If specified,
+If set,
.Nm sudo
will call the audit plugin's
.Fn accept
@@ -1076,6 +1095,7 @@ See
in
.Xr sudoers @mansectform@
for more information.
+Only available starting with API version 1.18.
.It noexec=bool
If set, prevent the command from executing other programs.
.It preserve_fds=list
@@ -1089,7 +1109,7 @@ If set,
.Nm sudo
will preserve the user's group vector instead of
initializing the group vector based on
-.Li runas_user .
+.Em runas_user .
.It rlimit_as=soft,hard
The maximum size to which the process's address space may grow (in bytes),
if supported by the operating system.
@@ -1105,7 +1125,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_core=soft,hard
The largest size core dump file that may be created (in bytes).
The soft and hard limits are separated by a comma.
@@ -1120,7 +1140,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_cpu=soft,hard
The maximum amount of CPU time that the process may use (in seconds).
The soft and hard limits are separated by a comma.
@@ -1135,7 +1155,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_data=soft,hard
The maximum size of the data segment for the process (in bytes).
The soft and hard limits are separated by a comma.
@@ -1150,7 +1170,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_fsize=soft,hard
The largest size file that the process may create (in bytes).
The soft and hard limits are separated by a comma.
@@ -1165,7 +1185,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_locks=soft,hard
The maximum number of locks that the process may establish,
if supported by the operating system.
@@ -1181,7 +1201,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_memlock=soft,hard
The maximum size that the process may lock in memory (in bytes),
if supported by the operating system.
@@ -1197,7 +1217,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_nofile=soft,hard
The maximum number of files that the process may have open.
The soft and hard limits are separated by a comma.
@@ -1212,7 +1232,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_nproc=soft,hard
The maximum number of processes that the user may run simultaneously.
The soft and hard limits are separated by a comma.
@@ -1227,7 +1247,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_rss=soft,hard
The maximum size to which the process's resident set size may grow (in bytes).
The soft and hard limits are separated by a comma.
@@ -1242,7 +1262,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It rlimit_stack=soft,hard
The maximum size to which the process's stack may grow (in bytes).
The soft and hard limits are separated by a comma.
@@ -1257,7 +1277,7 @@ A value of
.Dq default
will cause the target user's default resource limit to be used
on systems that allow per-user resource limits to be configured.
-Only available starting with API version 1.17.
+Only available starting with API version 1.18.
.It runas_egid=gid
Effective group-ID to run the command as.
If not specified, the value of
@@ -1341,7 +1361,7 @@ These restrictions are not enforced when
.Nm sudoedit
is run by root.
The
-.Em sudoedit_follow
+.Em sudoedit_checkdir
option can be set to false to disable this check.
Only available starting with API version 1.8.
.It sudoedit_follow=bool
@@ -1371,7 +1391,7 @@ Force the value specified by the
.Em umask
option to override any umask set by PAM or login.conf.
.It use_ptrace=bool
-If specified,
+If set,
.Nm sudo
will use
.Xr ptrace 2
@@ -1379,6 +1399,7 @@ to implement intercept mode if supported by the system.
This setting has no effect unless
.Em intercept
is also set.
+Only available starting with API version 1.19.
.It use_pty=bool
Allocate a pseudo-terminal to run the command in, regardless of whether
or not I/O logging is in use.
@@ -1399,19 +1420,19 @@ the invoking user's existing entry.
.El
.Pp
Unsupported values will be ignored.
-.It argv_out
+.It Fa argv_out
The
.Dv NULL Ns -terminated
argument vector to pass to the
.Xr execve 2
system call when executing the command.
The plugin is responsible for allocating and populating the vector.
-.It user_env_out
+.It Fa user_env_out
The
.Dv NULL Ns -terminated
environment vector to use when executing the command.
The plugin is responsible for allocating and populating the vector.
-.It errstr
+.It Fa errstr
If the
.Fn check_policy
function returns a value other than 1, the plugin may
@@ -1438,10 +1459,10 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It list
+.It Fa list
.Bd -literal -compact
int (*list)(int argc, char * const argv[], int verbose,
- const char *list_user, const char **errstr);
+ const char *user, const char **errstr);
.Ed
.Pp
List available privileges for the invoking user.
@@ -1449,7 +1470,7 @@ Returns 1 on success, 0 on failure, and \-1 on error.
On error, the plugin may optionally call the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function with
.Dv SUDO_CONF_ERROR_MSG
to present additional error information to
@@ -1458,19 +1479,19 @@ the user.
Privileges should be output via the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function using
.Dv SUDO_CONV_INFO_MSG .
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It argc
+.It Fa argc
The number of elements in
-.Em argv ,
+.Fa argv ,
not counting the final
.Dv NULL
pointer.
-.It argv
+.It Fa argv
If
.No non- Ns Dv NULL ,
an argument vector describing a command the user
@@ -1480,15 +1501,15 @@ be passed to the
system call.
If the command is permitted by the policy, the fully-qualified path
to the command should be displayed along with any command line arguments.
-.It verbose
+.It Fa verbose
Flag indicating whether to list in verbose mode or not.
-.It list_user
+.It Fa user
The name of a different user to list privileges for if the policy
allows it.
If
.Dv NULL ,
the plugin should list the privileges of the invoking user.
-.It errstr
+.It Fa errstr
If the
.Fn list
function returns a value other than 1, the plugin may
@@ -1515,7 +1536,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It validate
+.It Fa validate
.Bd -literal -compact
int (*validate)(const char **errstr);
.Ed
@@ -1543,7 +1564,7 @@ Returns 1 on success, 0 on failure, and \-1 on error.
On error, the plugin may optionally call the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function with
.Dv SUDO_CONF_ERROR_MSG
to present additional
@@ -1551,7 +1572,7 @@ error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It errstr
+.It Va errstr
If the
.Fn validate
function returns a value other than 1, the plugin may
@@ -1578,9 +1599,9 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It invalidate
+.It Fa invalidate
.Bd -literal -compact
-void (*invalidate)(int remove);
+void (*invalidate)(int rmcred);
.Ed
.Pp
The
@@ -1598,8 +1619,8 @@ that
cache authentication credentials, this function will invalidate the
credentials.
If the
-.Em remove
-flag is set, the plugin may remove
+.Fa rmcred
+flag is non-zero, the plugin may remove
the credentials instead of simply invalidating them.
.Pp
The
@@ -1607,9 +1628,10 @@ The
function should be
.Dv NULL
if the plugin does not support credential caching.
-.It init_session
+.It Fa init_session
.Bd -literal -compact
-int (*init_session)(struct passwd *pwd, char **user_env_out[]);
+int (*init_session)(struct passwd *pwd, char **user_env[],
+ const char **errstr);
.Ed
.Pp
The
@@ -1620,45 +1642,50 @@ sets up the
execution environment for the command.
It is run in the parent
.Nm sudo
-process and before any user-ID or group-ID changes.
+process before any user-ID or group-ID changes.
This can be used to perform session setup that is not supported by
-.Em command_info ,
+.Fa command_info ,
such as opening the PAM session.
The
.Fn close
function can be
used to tear down the session that was opened by
-.Li init_session .
+.Fn init_session .
.Pp
-The
-.Em pwd
-argument points to a passwd struct for the user the
-command will be run as if the user-ID the command will run as was found
-in the password database, otherwise it will be
-.Dv NULL .
+Returns 1 on success, 0 on failure, and \-1 on error.
+On error, the plugin may optionally call the
+.Fn conversation
+or
+.Fn sudo_plugin_printf
+function with
+.Dv SUDO_CONF_ERROR_MSG
+to present additional
+error information to the user.
.Pp
+The function arguments are as follows:
+.Bl -tag -width 4n
+.It Fa pwd
+If the user-ID the command will run as was found in the password database,
+.Fa pwd
+will describe that user, otherwise it will be
+.Dv NULL .
+.It Fa user_env_out
The
-.Em user_env_out
-argument points to the environment the command will
-run in, in the form of a
.Dv NULL Ns -terminated
-vector of
-.Dq name=value
-strings.
-This is the same string passed back to the front-end via
-the Policy Plugin's
-.Em user_env_out
+environment vector to use when executing the command.
+This is the same string passed back to the front-end via the Policy Plugin's
+.Fa user_env_out
parameter.
If the
.Fn init_session
function needs to modify the user environment, it should update the
pointer stored in
-.Em user_env_out .
+.Fa user_env_out .
The expected use case is to merge the contents of the PAM environment
(if any) with the contents of
-.Em user_env_out .
+.Fa user_env_out .
The
-.Em user_env_out
+.Fa user_env_out
parameter is only available
starting with API version 1.2.
A plugin
@@ -1667,19 +1694,36 @@ check the API
version specified by the
.Nm sudo
front-end before using
-.Em user_env_out .
+.Fa user_env_out .
Failure to do so may result in a crash.
+.It Fa errstr
+If the
+.Fn init_session
+function returns a value other than 1, the plugin may
+store a message describing the failure or error in
+.Fa errstr .
+The
+.Nm sudo
+front-end will then pass this value to any registered audit plugins.
+The string stored in
+.Fa errstr
+must remain valid until the plugin's
+.Fn close
+function is called.
.Pp
-Returns 1 on success, 0 on failure, and \-1 on error.
-On error, the plugin may optionally call the
-.Fn conversation
-or
-.Fn plugin_printf
-function with
-.Dv SUDO_CONF_ERROR_MSG
-to present additional
-error information to the user.
-.It register_hooks
+The
+.Fa errstr
+parameter is only available starting with
+API version 1.15.
+A plugin
+.Sy must
+check the API version specified by the
+.Nm sudo
+front-end before using
+.Fa errstr .
+Failure to do so may result in a crash.
+.El
+.It Fa register_hooks
.Bd -literal -compact
void (*register_hooks)(int version,
int (*register_hook)(struct sudo_hook *hook));
@@ -1690,13 +1734,13 @@ The
function is called by the sudo front-end to
register any hooks the plugin needs.
If the plugin does not support hooks,
-.Li register_hooks
+.Fa register_hooks
should be set to the
.Dv NULL
pointer.
.Pp
The
-.Em version
+.Fa version
argument describes the version of the hooks API
supported by the
.Nm sudo
@@ -1708,13 +1752,12 @@ function should be used to register any supported
hooks the plugin needs.
It returns 0 on success, 1 if the hook type is not supported, and \-1
if the major version in
-.Li struct hook
+.Vt struct sudo_hook
does not match the front-end's major hook API version.
.Pp
See the
.Sx Hook function API
-section below for more information
-about hooks.
+section below for more information about hooks.
.Pp
The
.Fn register_hooks
@@ -1724,9 +1767,9 @@ If the
.Nm sudo
front-end doesn't support API
version 1.2 or higher,
-.Li register_hooks
+.Fn register_hooks
will not be called.
-.It deregister_hooks
+.It Fa deregister_hooks
.Bd -literal -compact
void (*deregister_hooks)(int version,
int (*deregister_hook)(struct sudo_hook *hook));
@@ -1737,13 +1780,13 @@ The
function is called by the sudo front-end
to deregister any hooks the plugin has registered.
If the plugin does not support hooks,
-.Li deregister_hooks
+.Fa deregister_hooks
should be set to the
.Dv NULL
pointer.
.Pp
The
-.Em version
+.Fa version
argument describes the version of the hooks API
supported by the
.Nm sudo
@@ -1756,13 +1799,12 @@ hooks that were put in place by the
.Fn register_hook
function.
If the plugin tries to deregister a hook that the front-end does not support,
-.Li deregister_hook
+.Fn deregister_hook
will return an error.
.Pp
See the
.Sx Hook function API
-section below for more information
-about hooks.
+section below for more information about hooks.
.Pp
The
.Fn deregister_hooks
@@ -1772,9 +1814,9 @@ If the
.Nm sudo
front-end doesn't support API
version 1.2 or higher,
-.Li deregister_hooks
+.Fn deregister_hooks
will not be called.
-.It event_alloc
+.It Fa event_alloc
.Bd -literal -compact
struct sudo_plugin_event * (*event_alloc)(void);
.Ed
@@ -1782,12 +1824,12 @@ struct sudo_plugin_event * (*event_alloc)(void);
The
.Fn event_alloc
function is used to allocate a
-.Li struct sudo_plugin_event
+.Vt struct sudo_plugin_event
which provides access to the main
.Nm sudo
event loop.
Unlike the other fields, the
-.Fn event_alloc
+.Fa event_alloc
pointer is filled in by the
.Nm sudo
front-end, not by the plugin.
@@ -1805,34 +1847,8 @@ If the
.Nm sudo
front-end doesn't support API
version 1.15 or higher,
-.Fn event_alloc
+.Fa event_alloc
will not be set.
-.It errstr
-If the
-.Fn init_session
-function returns a value other than 1, the plugin may
-store a message describing the failure or error in
-.Fa errstr .
-The
-.Nm sudo
-front-end will then pass this value to any registered audit plugins.
-The string stored in
-.Fa errstr
-must remain valid until the plugin's
-.Fn close
-function is called.
-.Pp
-The
-.Fa errstr
-parameter is only available starting with
-API version 1.15.
-A plugin
-.Sy must
-check the API version specified by the
-.Nm sudo
-front-end before using
-.Fa errstr .
-Failure to do so may result in a crash.
.El
.Pp
.Em Policy Plugin Version Macros
@@ -1861,7 +1877,7 @@ struct io_plugin {
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 plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_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[], const char **errstr);
@@ -1896,13 +1912,16 @@ session.
If any of the standard input, standard output, or standard error do not
correspond to a tty,
.Nm sudo
-will open a pipe to capture
-the I/O for logging before passing it on.
+will open a pipe to capture the I/O for logging before passing it on.
.Pp
-The log_ttyin function receives the raw user input from the terminal
+The
+.Fn log_ttyin
+function receives the raw user input from the terminal
device (this will include input even when echo is disabled,
such as when a password is read).
-The log_ttyout function receives output from the pseudo-terminal that is
+The
+.Fn log_ttyout
+function receives output from the pseudo-terminal that is
suitable for replaying the user's session at a later time.
The
.Fn log_stdin ,
@@ -1932,16 +1951,18 @@ If an output logging function rejects the data by returning 0, the
command will be terminated and the data will not be written to the
terminal, though it will still be sent to any other I/O logging plugins.
.Pp
-The audit_plugin struct has the following fields:
+A
+.Vt struct audit_plugin
+has the following fields:
.Bl -tag -width 4n
-.It type
+.It Fa type
The
-.Li type
+.Fa type
field should always be set to
.Dv SUDO_IO_PLUGIN .
-.It version
+.It Fa version
The
-.Li version
+.Fa version
field should be set to
.Dv SUDO_API_VERSION .
.Pp
@@ -1949,10 +1970,10 @@ This allows
.Nm sudo
to determine the API version the plugin was
built against.
-.It open
+.It Fa open
.Bd -literal -compact
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t plugin_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_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[]);
@@ -1983,24 +2004,24 @@ will print a usage message before it exits.
If an error occurs, the plugin may optionally call the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function with
.Dv SUDO_CONF_ERROR_MSG
to present additional error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It version
+.It Fa version
The version passed in by
.Nm sudo
allows the plugin to determine the
major and minor version number of the plugin API supported by
.Nm sudo .
-.It conversation
+.It Fa conversation
A pointer to the
.Fn conversation
function that may be used by the
-.Fn show_version
+.Fn Fa show_version
function to display version information (see
.Fn show_version
below).
@@ -2010,7 +2031,7 @@ function may also be used to display additional error message to the user.
The
.Fn conversation
function returns 0 on success and \-1 on failure.
-.It plugin_printf
+.It Fa sudo_plugin_printf
A pointer to a
.Fn printf Ns -style
function that may be used by the
@@ -2018,12 +2039,12 @@ function that may be used by the
function to display version information (see
show_version below).
The
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function may also be used to display additional error message to the user.
The
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function returns number of characters printed on success and \-1 on failure.
-.It settings
+.It Fa settings
A vector of user-supplied
.Nm sudo
settings in the form of
@@ -2038,7 +2059,7 @@ As such, they will only be present when the corresponding option has
been specified on the command line.
.Pp
When parsing
-.Em settings ,
+.Fa settings ,
the plugin should split on the
.Sy first
equal sign
@@ -2053,7 +2074,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible settings.
-.It user_info
+.It Fa user_info
A vector of information about the user running the command in the form of
.Dq name=value
strings.
@@ -2062,7 +2083,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em user_info ,
+.Fa user_info ,
the plugin should split on the
.Sy first
equal sign
@@ -2077,7 +2098,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It command_info
+.It Fa command_info
A vector of information describing the command being run in the form of
.Dq name=value
strings.
@@ -2086,7 +2107,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em command_info ,
+.Fa command_info ,
the plugin should split on the
.Sy first
equal sign
@@ -2101,24 +2122,25 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It argc
+.It Fa argc
The number of elements in
-.Em argv ,
+.Fa argv ,
not counting the final
.Dv NULL
pointer.
-It can be zero, when
+It can be zero, such as when
.Nm sudo
-is called with
-.Fl V .
-.It argv
+is called with the
+.Fl V
+option.
+.It Fa argv
If
.No non- Ns Dv NULL ,
an argument vector describing a command the user
wishes to run in the same form as what would be passed to the
.Xr execve 2
system call.
-.It user_env
+.It Fa user_env
The user's environment in the form of a
.Dv NULL Ns -terminated
vector of
@@ -2126,7 +2148,7 @@ vector of
strings.
.Pp
When parsing
-.Em user_env ,
+.Fa user_env ,
the plugin should split on the
.Sy first
equal sign
@@ -2137,7 +2159,7 @@ field will never include one
itself but the
.Em value
might.
-.It plugin_options
+.It Fa plugin_options
Any (non-comment) strings immediately after the plugin path are
treated as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -2145,13 +2167,13 @@ the plugin in the form of a
.Dv NULL Ns -terminated
array of strings.
If no arguments were specified,
-.Em plugin_options
+.Fa plugin_options
will be the
.Dv NULL
pointer.
.Pp
The
-.Em plugin_options
+.Fa plugin_options
parameter is only available starting with
API version 1.2.
A plugin
@@ -2160,9 +2182,9 @@ check the API version specified
by the
.Nm sudo
front-end before using
-.Em plugin_options .
+.Fa plugin_options .
Failure to do so may result in a crash.
-.It errstr
+.It Fa errstr
If the
.Fn open
function returns a value other than 1, the plugin may
@@ -2189,7 +2211,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It close
+.It Fa close
.Bd -literal -compact
void (*close)(int exit_status, int error);
.Ed
@@ -2202,26 +2224,26 @@ is finished, shortly before it exits.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It exit_status
+.It Fa exit_status
The command's exit status, as returned by the
.Xr wait 2
system call, or zero if no command was run.
The value of
-.Li exit_status
+.Fa exit_status
is undefined if
-.Li error
+.Fa error
is non-zero.
-.It error
+.It Fa error
If the command could not be executed, this is set to the value of
-.Li errno
+.Va errno
set by the
.Xr execve 2
system call.
If the command was successfully executed, the value of
-.Li error
+.Fa error
is zero.
.El
-.It show_version
+.It Fa show_version
.Bd -literal -compact
int (*show_version)(int verbose);
.Ed
@@ -2230,21 +2252,23 @@ The
.Fn show_version
function is called by
.Nm sudo
-when the user specifies
-the
+when the user specifies the
.Fl V
option.
The plugin may display its version information to the user via the
.Fn conversation
or
-.Fn plugin_printf
+.Fn sudo_plugin_printf
function using
.Dv SUDO_CONV_INFO_MSG .
+If the user requests detailed version information, the
+.Fa verbose
+flag will be non-zero.
.Pp
Returns 1 on success, 0 on failure, \-1 if a general error occurred,
or \-2 if there was a usage error, although the return value is currently
ignored.
-.It log_ttyin
+.It Fa log_ttyin
.Bd -literal -compact
int (*log_ttyin)(const char *buf, unsigned int len,
const char **errstr);
@@ -2262,13 +2286,13 @@ error occurred.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It buf
+.It Fa buf
The buffer containing user input.
-.It len
+.It Fa len
The length of
-.Em buf
+.Fa buf
in bytes.
-.It errstr
+.It Fa errstr
If the
.Fn log_ttyin
function returns a value other than 1, the plugin may
@@ -2295,7 +2319,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It log_ttyout
+.It Fa log_ttyout
.Bd -literal -compact
int (*log_ttyout)(const char *buf, unsigned int len,
const char **errstr);
@@ -2312,13 +2336,13 @@ Returns 1 if the data should be passed to the user, 0 if the data is rejected
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It buf
+.It Fa buf
The buffer containing command output.
-.It len
+.It Fa len
The length of
-.Em buf
+.Fa buf
in bytes.
-.It errstr
+.It Fa errstr
If the
.Fn log_ttyout
function returns a value other than 1, the plugin may
@@ -2345,7 +2369,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It log_stdin
+.It Fa log_stdin
.Bd -literal -compact
int (*log_stdin)(const char *buf, unsigned int len,
const char **errstr);
@@ -2365,13 +2389,13 @@ if an error occurred.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It buf
+.It Fa buf
The buffer containing user input.
-.It len
+.It Fa len
The length of
-.Em buf
+.Fa buf
in bytes.
-.It errstr
+.It Fa errstr
If the
.Fn log_stdin
function returns a value other than 1, the plugin may
@@ -2398,7 +2422,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It log_stdout
+.It Fa log_stdout
.Bd -literal -compact
int (*log_stdout)(const char *buf, unsigned int len,
const char **errstr);
@@ -2418,13 +2442,13 @@ an error occurred.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It buf
+.It Fa buf
The buffer containing command output.
-.It len
+.It Fa len
The length of
-.Em buf
+.Fa buf
in bytes.
-.It errstr
+.It Fa errstr
If the
.Fn log_stdout
function returns a value other than 1, the plugin may
@@ -2451,7 +2475,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It log_stderr
+.It Fa log_stderr
.Bd -literal -compact
int (*log_stderr)(const char *buf, unsigned int len,
const char **errstr);
@@ -2471,13 +2495,13 @@ an error occurred.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It buf
+.It Fa buf
The buffer containing command output.
-.It len
+.It Fa len
The length of
-.Em buf
+.Fa buf
in bytes.
-.It errstr
+.It Fa errstr
If the
.Fn log_stderr
function returns a value other than 1, the plugin may
@@ -2504,17 +2528,17 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It register_hooks
+.It Fa register_hooks
See the
.Sx Policy plugin API
section for a description of
-.Li register_hooks .
-.It deregister_hooks
+.Fn register_hooks .
+.It Fa deregister_hooks
See the
.Sx Policy plugin API
section for a description of
-.Li deregister_hooks .
-.It change_winsize
+.Fn deregister_hooks .
+.It Fa change_winsize
.Bd -literal -compact
int (*change_winsize)(unsigned int lines, unsigned int cols,
const char **errstr);
@@ -2524,7 +2548,7 @@ The
.Fn change_winsize
function is called whenever the window size of the terminal changes from
the initial values specified in the
-.Li user_info
+.Fa user_info
list.
Returns \-1 if an error occurred, in which case no further calls to
.Fn change_winsize
@@ -2532,11 +2556,11 @@ will be made,
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It lines
+.It Fa lines
The number of lines (rows) in the re-sized terminal.
-.It cols
+.It Fa cols
The number of columns in the re-sized terminal.
-.It errstr
+.It Fa errstr
If the
.Fn change_winsize
function returns a value other than 1, the plugin may
@@ -2563,7 +2587,7 @@ front-end before using
.Fa errstr .
Failure to do so may result in a crash.
.El
-.It log_suspend
+.It Fa log_suspend
.Bd -literal -compact
int (*log_suspend)(int signo, const char **errstr);
.Ed
@@ -2579,11 +2603,11 @@ will be made,
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It signo
+.It Fa signo
The signal that caused the command to be suspended, or
.Dv SIGCONT
if the command was resumed.
-.It errstr
+.It Fa errstr
If the
.Fn log_suspend
function returns a value other than 1, the plugin may
@@ -2609,7 +2633,7 @@ check the API version specified by the
front-end before using
.Fa errstr .
Failure to do so may result in a crash.
-.It event_alloc
+.It Fa event_alloc
.Bd -literal -compact
struct sudo_plugin_event * (*event_alloc)(void);
.Ed
@@ -2617,7 +2641,7 @@ struct sudo_plugin_event * (*event_alloc)(void);
The
.Fn event_alloc
function is used to allocate a
-.Li struct sudo_plugin_event
+.Vt struct sudo_plugin_event
which provides access to the main
.Nm sudo
event loop.
@@ -2662,7 +2686,7 @@ struct audit_plugin {
unsigned int type; /* always SUDO_AUDIT_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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -2693,16 +2717,18 @@ independent of the policy or any I/O plugins.
Multiple audit plugins may be specified in
.Xr sudo.conf @mansectform@ .
.Pp
-The audit_plugin struct has the following fields:
+A
+.Vt struct audit_plugin
+has the following fields:
.Bl -tag -width 4n
-.It type
+.It Fa type
The
-.Li type
+.Fa type
field should always be set to
.Dv SUDO_AUDIT_PLUGIN .
-.It version
+.It Fa version
The
-.Li version
+.Fa version
field should be set to
.Dv SUDO_API_VERSION .
.Pp
@@ -2710,10 +2736,10 @@ This allows
.Nm sudo
to determine the API version the plugin was
built against.
-.It open
+.It Fa open
.Bd -literal -compact
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t sudo_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -2740,13 +2766,13 @@ to present additional error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It version
+.It Fa version
The version passed in by
.Nm sudo
allows the plugin to determine the
major and minor version number of the plugin API supported by
.Nm sudo .
-.It conversation
+.It Fa conversation
A pointer to the
.Fn conversation
function that may be used by the
@@ -2760,7 +2786,7 @@ function may also be used to display additional error message to the user.
The
.Fn conversation
function returns 0 on success, and \-1 on failure.
-.It plugin_printf
+.It Fa plugin_printf
A pointer to a
.Fn printf Ns -style
function that may be used by the
@@ -2773,7 +2799,7 @@ function may also be used to display additional error message to the user.
The
.Fn plugin_printf
function returns number of characters printed on success and \-1 on failure.
-.It settings
+.It Fa settings
A vector of user-supplied
.Nm sudo
settings in the form of
@@ -2788,7 +2814,7 @@ As such, they will only be present when the corresponding option has
been specified on the command line.
.Pp
When parsing
-.Em settings ,
+.Fa settings ,
the plugin should split on the
.Sy first
equal sign
@@ -2803,7 +2829,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible settings.
-.It user_info
+.It Fa user_info
A vector of information about the user running the command in the form of
.Dq name=value
strings.
@@ -2812,7 +2838,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em user_info ,
+.Fa user_info ,
the plugin should split on the
.Sy first
equal sign
@@ -2827,7 +2853,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It submit_optind
+.It Fa submit_optind
The index into
.Fa submit_argv
that corresponds to the first entry that is not a command line option.
@@ -2838,16 +2864,16 @@ only consists of options, which may be the case with the
or
.Fl v
options,
-.Li submit_argv[submit_optind]
+.Fa submit_argv Ns [ Fa submit_optind ]
will evaluate to the NULL pointer.
-.It submit_argv
+.It Fa submit_argv
The argument vector
.Nm sudo
was invoked with, including all command line options.
The
.Fa submit_optind
argument can be used to determine the end of the command line options.
-.It submit_envp
+.It Fa submit_envp
The invoking user's environment in the form of a
.Dv NULL Ns -terminated
vector of
@@ -2855,7 +2881,7 @@ vector of
strings.
.Pp
When parsing
-.Em submit_envp ,
+.Fa submit_envp ,
the plugin should split on the
.Sy first
equal sign
@@ -2866,7 +2892,7 @@ field will never include one
itself but the
.Em value
might.
-.It plugin_options
+.It Fa plugin_options
Any (non-comment) strings immediately after the plugin path are
treated as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -2874,11 +2900,11 @@ the plugin in the form of a
.Dv NULL Ns -terminated
array of strings.
If no arguments were specified,
-.Em plugin_options
+.Fa plugin_options
will be the
.Dv NULL
pointer.
-.It errstr
+.It Fa errstr
If the
.Fn open
function returns a value other than 1, the plugin may
@@ -2893,7 +2919,7 @@ must remain valid until the plugin's
.Fn close
function is called.
.El
-.It close
+.It Fa close
.Bd -literal -compact
void (*close)(int status_type, int status);
.Ed
@@ -2906,7 +2932,7 @@ is finished, shortly before it exits.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It status_type
+.It Fa status_type
The type of status being passed.
One of
.Dv SUDO_PLUGIN_NO_STATUS ,
@@ -2914,23 +2940,23 @@ One of
.Dv SUDO_PLUGIN_EXEC_ERROR
or
.Dv SUDO_PLUGIN_SUDO_ERROR .
-.It status
+.It Fa status
Depending on the value of
.Fa status_type ,
this value is either
ignored, the command's exit status as returned by the
.Xr wait 2
system call, the value of
-.Li errno
+.Va errno
set by the
.Xr execve 2
system call, or the value of
-.Li errno
+.Va errno
resulting from an error in the
.Nm sudo
front-end.
.El
-.It accept
+.It Fa accept
.Bd -literal -compact
int (*accept)(const char *plugin_name, unsigned int plugin_type,
char * const command_info[], char * const run_argv[],
@@ -2943,13 +2969,13 @@ function is called when a command or action is accepted by a policy
or approval plugin.
The function arguments are as follows:
.Bl -tag -width 4n
-.It plugin_name
+.It Fa plugin_name
The name of the plugin that accepted the command or
.Dq sudo
for the
.Nm sudo
front-end.
-.It plugin_type
+.It Fa plugin_type
The type of plugin that accepted the command, currently either
.Dv SUDO_POLICY_PLUGIN ,
.Dv SUDO_POLICY_APPROVAL ,
@@ -2976,7 +3002,7 @@ and
functions will
.Em both
be called.
-.It command_info
+.It Fa command_info
An optional
vector of information describing the command being run in the form of
.Dq name=value
@@ -2986,7 +3012,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em command_info ,
+.Fa command_info ,
the plugin should split on the
.Sy first
equal sign
@@ -3001,14 +3027,14 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It run_argv
+.It Fa run_argv
A
.Dv NULL Ns -terminated
argument vector describing a command that will be run in the
same form as what would be passed to the
.Xr execve 2
system call.
-.It run_envp
+.It Fa run_envp
The environment the command will be run with in the form of a
.Dv NULL Ns -terminated
vector of
@@ -3016,7 +3042,7 @@ vector of
strings.
.Pp
When parsing
-.Em run_envp ,
+.Fa run_envp ,
the plugin should split on the
.Sy first
equal sign
@@ -3027,7 +3053,7 @@ field will never include one
itself but the
.Em value
might.
-.It errstr
+.It Fa errstr
If the
.Fn accept
function returns a value other than 1, the plugin may
@@ -3042,7 +3068,7 @@ must remain valid until the plugin's
.Fn close
function is called.
.El
-.It reject
+.It Fa reject
.Bd -literal -compact
int (*reject)(const char *plugin_name, unsigned int plugin_type,
const char *audit_msg, char * const command_info[],
@@ -3054,9 +3080,9 @@ The
function is called when a command or action is rejected by a plugin.
The function arguments are as follows:
.Bl -tag -width 4n
-.It plugin_name
+.It Fa plugin_name
The name of the plugin that rejected the command.
-.It plugin_type
+.It Fa plugin_type
The type of plugin that rejected the command, currently either
.Dv SUDO_POLICY_PLUGIN ,
.Dv SUDO_APPROVAL_PLUGIN ,
@@ -3070,7 +3096,7 @@ function, the
function is not called on behalf of the
.Nm sudo
front-end.
-.It audit_msg
+.It Fa audit_msg
An optional string describing the reason the command was rejected
by the plugin.
If the plugin did not provide a reason,
@@ -3078,7 +3104,7 @@ If the plugin did not provide a reason,
will be the
.Dv NULL
pointer.
-.It command_info
+.It Fa command_info
An optional
vector of information describing the command being run in the form of
.Dq name=value
@@ -3088,7 +3114,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em command_info ,
+.Fa command_info ,
the plugin should split on the
.Sy first
equal sign
@@ -3103,7 +3129,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It errstr
+.It Fa errstr
If the
.Fn reject
function returns a value other than 1, the plugin may
@@ -3118,7 +3144,7 @@ must remain valid until the plugin's
.Fn close
function is called.
.El
-.It error
+.It Fa error
.Bd -literal -compact
int (*error)(const char *plugin_name, unsigned int plugin_type,
const char *audit_msg, char * const command_info[],
@@ -3132,26 +3158,26 @@ function is called when a plugin or the
front-end returns an error.
The function arguments are as follows:
.Bl -tag -width 4n
-.It plugin_name
+.It Fa plugin_name
The name of the plugin that generated the error or
.Dq sudo
for the
.Nm sudo
front-end.
-.It plugin_type
+.It Fa plugin_type
The type of plugin that generated the error, or
.Dv SUDO_FRONT_END
for the
.Nm sudo
front-end.
-.It audit_msg
+.It Fa audit_msg
An optional string describing the plugin error.
If the plugin did not provide a description,
.Fa audit_msg
will be the
.Dv NULL
pointer.
-.It command_info
+.It Fa command_info
An optional
vector of information describing the command being run in the form of
.Dq name=value
@@ -3161,7 +3187,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em command_info ,
+.Fa command_info ,
the plugin should split on the
.Sy first
equal sign
@@ -3176,7 +3202,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It errstr
+.It Fa errstr
If the
.Fn error
function returns a value other than 1, the plugin may
@@ -3191,7 +3217,7 @@ must remain valid until the plugin's
.Fn close
function is called.
.El
-.It show_version
+.It Fa show_version
.Bd -literal -compact
int (*show_version)(int verbose);
.Ed
@@ -3200,8 +3226,7 @@ The
.Fn show_version
function is called by
.Nm sudo
-when the user specifies
-the
+when the user specifies the
.Fl V
option.
The plugin may display its version information to the user via the
@@ -3215,17 +3240,17 @@ If the user requests detailed version information, the verbose flag will be set.
Returns 1 on success, 0 on failure, \-1 if a general error occurred,
or \-2 if there was a usage error, although the return value is currently
ignored.
-.It register_hooks
+.It Fa register_hooks
See the
.Sx Policy plugin API
section for a description of
-.Li register_hooks .
-.It deregister_hooks
+.Fn register_hooks .
+.It Fa deregister_hooks
See the
.Sx Policy plugin API
section for a description of
-.Li deregister_hooks .
-.It event_alloc
+.Fn deregister_hooks .
+.It Fa event_alloc
.Bd -literal -compact
struct sudo_plugin_event * (*event_alloc)(void);
.Ed
@@ -3233,12 +3258,12 @@ struct sudo_plugin_event * (*event_alloc)(void);
The
.Fn event_alloc
function is used to allocate a
-.Li struct sudo_plugin_event
+.Vt struct sudo_plugin_event
which provides access to the main
.Nm sudo
event loop.
Unlike the other fields, the
-.Fn event_alloc
+.Fa event_alloc
pointer is filled in by the
.Nm sudo
front-end, not by the plugin.
@@ -3266,7 +3291,7 @@ struct approval_plugin {
unsigned int type; /* always SUDO_APPROVAL_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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -3290,16 +3315,18 @@ before the plugin is closed).
Multiple approval plugins may be specified in
.Xr sudo.conf @mansectform@ .
.Pp
-The approval_plugin struct has the following fields:
+A
+.Vt struct approval_plugin
+has the following fields:
.Bl -tag -width 4n
-.It type
+.It Fa type
The
-.Li type
+.Fa type
field should always be set to
.Dv SUDO_APPROVAL_PLUGIN .
-.It version
+.It Fa version
The
-.Li version
+.Fa version
field should be set to
.Dv SUDO_API_VERSION .
.Pp
@@ -3307,10 +3334,10 @@ This allows
.Nm sudo
to determine the API version the plugin was
built against.
-.It open
+.It Fa open
.Bd -literal -compact
int (*open)(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t sudo_printf, char * const settings[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -3342,27 +3369,27 @@ to present additional error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It version
+.It Fa version
The version passed in by
.Nm sudo
allows the plugin to determine the
major and minor version number of the plugin API supported by
.Nm sudo .
-.It conversation
+.It Fa conversation
A pointer to the
.Fn conversation
function that can be used by the plugin to interact with the user (see
.Sx Conversation API
for details).
Returns 0 on success and \-1 on failure.
-.It plugin_printf
+.It Fa plugin_printf
A pointer to a
.Fn printf Ns -style
function that may be used to display informational or error messages (see
.Sx Conversation API
for details).
Returns the number of characters printed on success and \-1 on failure.
-.It settings
+.It Fa settings
A vector of user-supplied
.Nm sudo
settings in the form of
@@ -3377,7 +3404,7 @@ As such, they will only be present when the corresponding option has
been specified on the command line.
.Pp
When parsing
-.Em settings ,
+.Fa settings ,
the plugin should split on the
.Sy first
equal sign
@@ -3392,7 +3419,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible settings.
-.It user_info
+.It Fa user_info
A vector of information about the user running the command in the form of
.Dq name=value
strings.
@@ -3401,7 +3428,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em user_info ,
+.Fa user_info ,
the plugin should split on the
.Sy first
equal sign
@@ -3416,7 +3443,7 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It submit_optind
+.It Fa submit_optind
The index into
.Fa submit_argv
that corresponds to the first entry that is not a command line option.
@@ -3427,16 +3454,16 @@ only consists of options, which may be the case with the
or
.Fl v
options,
-.Li submit_argv[submit_optind]
+.Fa submit_argv Ns [ Fa submit_optind ]
will evaluate to the NULL pointer.
-.It submit_argv
+.It Fa submit_argv
The argument vector
.Nm sudo
was invoked with, including all command line options.
The
.Fa submit_optind
argument can be used to determine the end of the command line options.
-.It submit_envp
+.It Fa submit_envp
The invoking user's environment in the form of a
.Dv NULL Ns -terminated
vector of
@@ -3444,7 +3471,7 @@ vector of
strings.
.Pp
When parsing
-.Em submit_envp ,
+.Fa submit_envp ,
the plugin should split on the
.Sy first
equal sign
@@ -3455,7 +3482,7 @@ field will never include one
itself but the
.Em value
might.
-.It plugin_options
+.It Fa plugin_options
Any (non-comment) strings immediately after the plugin path are
treated as arguments to the plugin.
These arguments are split on a white space boundary and are passed to
@@ -3463,11 +3490,11 @@ the plugin in the form of a
.Dv NULL Ns -terminated
array of strings.
If no arguments were specified,
-.Em plugin_options
+.Fa plugin_options
will be the
.Dv NULL
pointer.
-.It errstr
+.It Fa errstr
If the
.Fn open
function returns a value other than 1, the plugin may
@@ -3482,7 +3509,7 @@ must remain valid until the plugin's
.Fn close
function is called.
.El
-.It close
+.It Fa close
.Bd -literal -compact
void (*close)(void);
.Ed
@@ -3504,7 +3531,7 @@ If the plugin does not need to perform any cleanup,
may be set to the
.Dv NULL
pointer.
-.It check
+.It Fa check
.Bd -literal -compact
int (*check)(char * const command_info[], char * const run_argv[],
char * const run_envp[], const char **errstr);
@@ -3532,7 +3559,7 @@ to present additional error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It command_info
+.It Fa command_info
A vector of information describing the command being run in the form of
.Dq name=value
strings.
@@ -3541,7 +3568,7 @@ The vector is terminated by a
pointer.
.Pp
When parsing
-.Em command_info ,
+.Fa command_info ,
the plugin should split on the
.Sy first
equal sign
@@ -3556,14 +3583,14 @@ might.
See the
.Sx Policy plugin API
section for a list of all possible strings.
-.It run_argv
+.It Fa run_argv
A
.Dv NULL Ns -terminated
argument vector describing a command that will be run in the
same form as what would be passed to the
.Xr execve 2
system call.
-.It run_envp
+.It Fa run_envp
The environment the command will be run with in the form of a
.Dv NULL Ns -terminated
vector of
@@ -3571,7 +3598,7 @@ vector of
strings.
.Pp
When parsing
-.Em run_envp ,
+.Fa run_envp ,
the plugin should split on the
.Sy first
equal sign
@@ -3582,7 +3609,7 @@ field will never include one
itself but the
.Em value
might.
-.It errstr
+.It Fa errstr
If the
.Fn open
function returns a value other than 1, the plugin may
@@ -3597,7 +3624,7 @@ must remain valid until the plugin's
.Fn close
function is called.
.El
-.It show_version
+.It Fa show_version
.Bd -literal -compact
int (*show_version)(int verbose);
.Ed
@@ -3606,8 +3633,7 @@ The
.Fn show_version
function is called by
.Nm sudo
-when the user specifies
-the
+when the user specifies the
.Fl V
option.
The plugin may display its version information to the user via the
@@ -3662,7 +3688,7 @@ for plugins that log such information in their
.Fn close
function.
An exception to this is
-.Ev SIGPIPE ,
+.Dv SIGPIPE ,
which is ignored until the command is executed.
.Pp
A plugin may temporarily install its own signal handlers but must
@@ -3698,18 +3724,18 @@ struct sudo_hook {
};
.Ed
.Pp
-The
-.Li sudo_hook
-structure has the following fields:
+A
+.Vt struct sudo_hook
+has the following fields:
.Bl -tag -width 4n
-.It hook_version
+.It Fa hook_version
The
-.Li hook_version
+.Fa hook_version
field should be set to
.Dv SUDO_HOOK_VERSION .
-.It hook_type
+.It Fa hook_type
The
-.Li hook_type
+.Fa hook_type
field may be one of the following supported hook types:
.Bl -tag -width 4n
.It Dv SUDO_HOOK_SETENV
@@ -3718,7 +3744,7 @@ The C library
function.
Any registered hooks will run before the C library implementation.
The
-.Li hook_fn
+.Fa hook_fn
field should
be a function that matches the following typedef:
.Bd -literal
@@ -3734,7 +3760,7 @@ The C library
function.
Any registered hooks will run before the C library implementation.
The
-.Li hook_fn
+.Fa hook_fn
field should
be a function that matches the following typedef:
.Bd -literal
@@ -3747,7 +3773,7 @@ The C library
function.
Any registered hooks will run before the C library implementation.
The
-.Li hook_fn
+.Fa hook_fn
field should
be a function that matches the following typedef:
.Bd -literal
@@ -3763,7 +3789,7 @@ The C library
function.
Any registered hooks will run before the C library implementation.
The
-.Li hook_fn
+.Fa hook_fn
field should
be a function that matches the following typedef:
.Bd -literal
@@ -3774,21 +3800,23 @@ typedef int (*sudo_hook_fn_putenv_t)(char *string,
If the registered hook does not match the typedef the results are
unspecified.
.El
-.It hook_fn
+.It Fa hook_fn
+.Bd -literal -compact
sudo_hook_fn_t hook_fn;
+.Ed
.Pp
The
-.Li hook_fn
+.Fa hook_fn
field should be set to the plugin's hook implementation.
The actual function arguments will vary depending on the
-.Li hook_type
+.Fa hook_type
(see
-.Li hook_type
+.Fa hook_type
above).
In all cases, the
-.Li closure
+.Fa closure
field of
-.Li struct sudo_hook
+.Vt struct sudo_hook
is passed as the last function parameter.
This can be used to pass arbitrary data to the plugin's hook implementation.
.Pp
@@ -3808,10 +3836,10 @@ if the specified variable was not found in the private copy of the environment.
The hook completed without error, stop processing hooks for this invocation.
This can be used to replace the system implementation.
For example, a
-.Li setenv
+.Fa setenv
hook that operates on a private copy of
the environment but leaves
-.Li environ
+.Va environ
unchanged.
.El
.El
@@ -3830,7 +3858,7 @@ to check the locale.
To prevent this, you may wish to use a static variable in the hook
function to guard against nested calls.
For example:
-.Bd -literal
+.Bd -literal -offset indent
static int in_progress = 0; /* avoid recursion */
if (in_progress)
return SUDO_HOOK_RET_NEXT;
@@ -3883,9 +3911,11 @@ struct sudo_plugin_event {
};
.Ed
.Pp
-The sudo_plugin_event struct contains the following function pointers:
+A
+.Vt struct sudo_plugin_event
+contains the following function pointers:
.Bl -tag -width 4n
-.It Fn set
+.It Fa set
.Bd -literal -compact
int (*set)(struct sudo_plugin_event *pev, int fd, int events,
sudo_plugin_ev_callback_t callback, void *closure);
@@ -3895,8 +3925,10 @@ The
.Fn set
function takes the following arguments:
.Bl -tag -width 4n
-.It struct sudo_plugin_event * Ns Fa pev
-A pointer to the struct sudo_plugin_event itself.
+.It Vt struct sudo_plugin_event * Ns Fa pev
+A pointer to the
+.Vt struct sudo_plugin_event
+itself.
.It Fa fd
The file or socket descriptor for I/O-based events or the signal
number for signal events.
@@ -3906,29 +3938,29 @@ must be \-1.
.It Fa events
The following values determine what will trigger the event callback:
.Bl -tag -width 4n
-.It SUDO_PLUGIN_EV_TIMEOUT
+.It Dv SUDO_PLUGIN_EV_TIMEOUT
callback is run after the specified timeout expires
-.It SUDO_PLUGIN_EV_READ
+.It Dv SUDO_PLUGIN_EV_READ
callback is run when the file descriptor is readable
-.It SUDO_PLUGIN_EV_WRITE
+.It Dv SUDO_PLUGIN_EV_WRITE
callback is run when the file descriptor is writable
-.It SUDO_PLUGIN_EV_PERSIST
+.It Dv SUDO_PLUGIN_EV_PERSIST
event is persistent and remains enabled until explicitly deleted
-.It SUDO_PLUGIN_EV_SIGNAL
+.It Dv SUDO_PLUGIN_EV_SIGNAL
callback is run when the specified signal is received
.El
.Pp
The
-.Ev SUDO_PLUGIN_EV_PERSIST
+.Dv SUDO_PLUGIN_EV_PERSIST
flag may be ORed with any of the event types.
It is also possible to OR
-.Ev SUDO_PLUGIN_EV_READ
+.Dv SUDO_PLUGIN_EV_READ
and
-.Ev SUDO_PLUGIN_EV_WRITE
+.Dv SUDO_PLUGIN_EV_WRITE
together to run the callback when a descriptor is ready to be
either read from or written to.
All other event values are mutually exclusive.
-.It sudo_plugin_ev_callback_t Fa callback
+.It Vt sudo_plugin_ev_callback_t Fa callback
.Bd -literal -compact
typedef void (*sudo_plugin_ev_callback_t)(int fd, int what,
void *closure);
@@ -3945,9 +3977,9 @@ number for signal events.
.It Fa what
The event type that triggered that callback.
For events that have multiple event types (for example
-.Ev SUDO_PLUGIN_EV_READ
+.Dv SUDO_PLUGIN_EV_READ
and
-.Ev SUDO_PLUGIN_EV_WRITE )
+.Dv SUDO_PLUGIN_EV_WRITE )
or have an associated timeout,
.Fa what
can be used to determine why the callback was run.
@@ -3956,14 +3988,14 @@ The generic pointer that was specified in the
.Fn set
function.
.El
-.It closure
+.It Fa closure
A generic pointer that will be passed to the callback function.
.El
.Pp
The
.Fn set
function returns 1 on success, and \-1 if a error occurred.
-.It Fn add
+.It Fa add
.Bd -literal -compact
int (*add)(struct sudo_plugin_event *pev, struct timespec *timeout);
.Ed
@@ -3993,7 +4025,7 @@ will be adjusted to match the new value, if any.
The
.Fn add
function returns 1 on success, and \-1 if a error occurred.
-.It Fn del
+.It Fa del
.Bd -literal -compact
int (*del)(struct sudo_plugin_event *pev);
.Ed
@@ -4012,7 +4044,7 @@ function.
The
.Fn del
function returns 1 on success, and \-1 if a error occurred.
-.It Fn pending
+.It Fa pending
.Bd -literal -compact
int (*pending)(struct sudo_plugin_event *pev, int events,
struct timespec *ts);
@@ -4030,11 +4062,11 @@ function for a list of valid event types.
If
.Dv SUDO_PLUGIN_EV_TIMEOUT
is specified in
-.Dv events ,
+.Fa events ,
the event has an associated timeout and the
.Fa ts
pointer is non-NULL, it will be filled in with the remaining time.
-.It Fn fd
+.It Fa fd
.Bd -literal -compact
int (*fd)(struct sudo_plugin_event *pev);
.Ed
@@ -4044,7 +4076,7 @@ The
function returns the descriptor or signal number associated with
the event
.Fa pev .
-.It Fn setbase
+.It Fa setbase
.Bd -literal -compact
void (*setbase)(struct sudo_plugin_event *pev, void *base);
.Ed
@@ -4072,7 +4104,7 @@ library.
It is unlikely to be used outside of the
.Nm sudoers
plugin.
-.It Fn loopbreak
+.It Fa loopbreak
.Bd -literal -compact
void (*loopbreak)(struct sudo_plugin_event *pev);
.Ed
@@ -4082,7 +4114,7 @@ The
function causes
.Nm sudo Ns No 's
event loop to exit immediately and the running command to be terminated.
-.It Fn free
+.It Fa free
.Bd -literal -compact
void (*free)(struct sudo_plugin_event *pev);
.Ed
@@ -4139,9 +4171,9 @@ If the plugin needs to interact with the user, it may do so via the
.Fn conversation
function.
A plugin should not attempt to read directly from the standard input
-or the user's tty (neither of which are guaranteed to exist).
+or the user's terminal (neither of which are guaranteed to exist).
The caller must include a trailing newline in
-.Li msg
+.Fa msg
if one is to be printed.
.Pp
A
@@ -4205,25 +4237,23 @@ typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
To use the
.Fn conversation
function, the plugin must pass an array of
-.Li sudo_conv_message
+.Vt struct sudo_conv_message
and
-.Li sudo_conv_reply
-structures.
+.Vt struct sudo_conv_reply .
There must be a
-.Li struct sudo_conv_message
+.Vt struct sudo_conv_message
and
-.Li struct sudo_conv_reply
-for
-each message in the conversation, that is, both arrays must have the same
-number of elements.
+.Vt struct sudo_conv_reply
+for each message in the conversation, that is, both arrays must
+have the same number of elements.
Each
-.Li struct sudo_conv_reply
+.Vt struct sudo_conv_reply
must have its
-.Em reply
+.Fa reply
member initialized to
.Dv NULL .
The
-.Li struct sudo_conv_callback
+.Vt struct sudo_conv_callback
pointer, if not
.Dv NULL ,
should contain function pointers to be called when the
@@ -4238,7 +4268,7 @@ functions are called with the signal that caused
to be suspended and the
.Fa closure
pointer from the
-.Li struct sudo_conv_callback .
+.Vt struct sudo_conv_callback .
These functions should return 0 on success and \-1 on error.
On error, the conversation will end and the conversation function
will return a value of \-1.
@@ -4248,37 +4278,37 @@ when the process is resumed.
The functions are not actually invoked from within a signal handler.
.Pp
The
-.Em msg_type
+.Fa msg_type
must be set to one of the following values:
.Bl -tag -width 4n
-.It SUDO_CONV_PROMPT_ECHO_OFF
+.It Dv SUDO_CONV_PROMPT_ECHO_OFF
Prompt the user for input with echo disabled;
this is generally used for passwords.
The reply will be stored in the
-.Em replies
+.Fa replies
array, and it will never be
.Dv NULL .
-.It SUDO_CONV_PROMPT_ECHO_ON
+.It Dv SUDO_CONV_PROMPT_ECHO_ON
Prompt the user for input with echo enabled.
The reply will be stored in the
-.Em replies
+.Fa replies
array, and it will never be
.Dv NULL .
-.It SUDO_CONV_ERROR_MSG
+.It Dv SUDO_CONV_ERROR_MSG
Display an error message.
The message is written to the standard error unless the
.Dv SUDO_CONV_PREFER_TTY
flag is set, in which case it is written to the user's terminal if possible.
-.It SUDO_CONV_INFO_MSG
+.It Dv SUDO_CONV_INFO_MSG
Display a message.
The message is written to the standard output unless the
.Dv SUDO_CONV_PREFER_TTY
flag is set, in which case it is written to the user's terminal if possible.
-.It SUDO_CONV_PROMPT_MASK
+.It Dv SUDO_CONV_PROMPT_MASK
Prompt the user for input but echo an asterisk character for each
character read.
The reply will be stored in the
-.Em replies
+.Fa replies
array, and it will never be
.Dv NULL .
This can be used to provide visual feedback to the user while reading
@@ -4287,7 +4317,7 @@ sensitive information that should not be displayed.
.Pp
In addition to the above values, the following flag bits may also be set:
.Bl -tag -width 4n
-.It SUDO_CONV_PROMPT_ECHO_OK
+.It Dv SUDO_CONV_PROMPT_ECHO_OK
Allow input to be read when echo cannot be disabled
when the message type is
.Dv SUDO_CONV_PROMPT_ECHO_OFF
@@ -4297,7 +4327,7 @@ By default,
.Nm sudo
will refuse to read input if the echo cannot be disabled for those
message types.
-.It SUDO_CONV_PREFER_TTY
+.It Dv SUDO_CONV_PREFER_TTY
When displaying a message via
.Dv SUDO_CONV_ERROR_MSG
or
@@ -4314,12 +4344,12 @@ this flag is only used for output.
.El
.Pp
The
-.Em timeout
+.Fa timeout
in seconds until the prompt will wait for no more input.
A zero value implies an infinite timeout.
.Pp
The plugin is responsible for freeing the reply buffer located in each
-.Li struct sudo_conv_reply ,
+.Vt struct sudo_conv_reply ,
if it is not
.Dv NULL .
.Dv SUDO_CONV_REPL_MAX
@@ -4338,7 +4368,7 @@ function but only supports
and
.Dv SUDO_CONV_ERROR_MSG
for the
-.Em msg_type
+.Fa msg_type
parameter.
It can be more convenient than using the
.Fn conversation
@@ -4409,14 +4439,14 @@ are detailed in
Third party group plugins include a QAS AD plugin available from Quest Software.
.Pp
A group plugin must declare and populate a
-.Li sudoers_group_plugin
-struct in the global scope.
+.Vt struct sudoers_group_plugin
+in the global scope.
This structure contains pointers to the functions that implement plugin
initialization, cleanup, and group lookup.
.Bd -literal
struct sudoers_group_plugin {
unsigned int version;
- int (*init)(int version, sudo_printf_t sudo_printf,
+ int (*init)(int version, sudo_printf_t sudo_plugin_printf,
char *const argv[]);
void (*cleanup)(void);
int (*query)(const char *user, const char *group,
@@ -4424,22 +4454,22 @@ struct sudoers_group_plugin {
};
.Ed
.Pp
-The
-.Li sudoers_group_plugin
-struct has the following fields:
+A
+.Vt struct sudoers_group_plugin
+has the following fields:
.Bl -tag -width 4n
-.It version
+.It Fa version
The
-.Li version
+.Fa version
field should be set to GROUP_API_VERSION.
.Pp
This allows
.Nm sudoers
to determine the API version the group plugin
was built against.
-.It init
+.It Fa init
.Bd -literal -compact
-int (*init)(int version, sudo_printf_t plugin_printf,
+int (*init)(int version, sudo_printf_t sudo_plugin_printf,
char *const argv[]);
.Ed
.Pp
@@ -4459,18 +4489,18 @@ to present additional error information to the user.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It version
+.It Fa version
The version passed in by
.Nm sudoers
allows the plugin to determine the
major and minor version number of the group plugin API supported by
.Nm sudoers .
-.It plugin_printf
+.It Fa plugin_printf
A pointer to a
.Fn printf Ns -style
function that may be used to display informational or error message to the user.
Returns the number of characters printed on success and \-1 on failure.
-.It argv
+.It Fa argv
A
.Dv NULL Ns -terminated
array of arguments generated from the
@@ -4478,11 +4508,11 @@ array of arguments generated from the
option in
.Em sudoers .
If no arguments were given,
-.Em argv
+.Fa argv
will be
.Dv NULL .
.El
-.It cleanup
+.It Fa cleanup
.Bd -literal -compact
void (*cleanup)();
.Ed
@@ -4494,7 +4524,7 @@ function is called when
has finished its
group checks.
The plugin should free any memory it has allocated and close open file handles.
-.It query
+.It Fa query
.Bd -literal -compact
int (*query)(const char *user, const char *group,
const struct passwd *pwd);
@@ -4503,25 +4533,25 @@ int (*query)(const char *user, const char *group,
The
.Fn query
function is used to ask the group plugin whether
-.Em user
+.Fa user
is a member of
-.Em group .
+.Fa group .
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
-.It user
+.It Fa user
The name of the user being looked up in the external group database.
-.It group
+.It Fa group
The name of the group being queried.
-.It pwd
+.It Fa pwd
The password database entry for
-.Em user ,
+.Fa user ,
if any.
If
-.Em user
+.Fa user
is not
present in the password database,
-.Em pwd
+.Fa pwd
will be
.Dv NULL .
.El
@@ -4546,7 +4576,7 @@ Initial API version.
The I/O logging plugin's
.Fn open
function was modified to take the
-.Li command_info
+.Fa command_info
list as an argument.
.It Version 1.2 (sudo 1.8.5)
The Policy and I/O logging plugins'
@@ -4559,7 +4589,7 @@ A simple hooks API has been introduced to allow plugins to hook in to the
system's environment handling functions.
.Pp
The
-.Li init_session
+.Fn init_session
Policy plugin function is now passed a pointer
to the user environment which can be updated as needed.
This can be used to merge in environment variables stored in the PAM
@@ -4568,7 +4598,7 @@ handle before a command is run.
Support for the
.Em exec_background
entry has been added to the
-.Li command_info
+.Fa command_info
list.
.Pp
The
@@ -4576,7 +4606,7 @@ The
and
.Em plugin_dir
entries were added to the
-.Li settings
+.Fa settings
list.
.Pp
The
@@ -4606,13 +4636,13 @@ while the plugin functions are run.
The
.Em remote_host
entry was added to the
-.Li settings
+.Fa settings
list.
.It Version 1.5 (sudo 1.8.9)
The
.Em preserve_fds
entry was added to the
-.Li command_info
+.Fa command_info
list.
.It Version 1.6 (sudo 1.8.11)
The behavior when an I/O logging plugin returns an error
@@ -4636,7 +4666,7 @@ terminal even if an output logging function returned 0.
The
.Em plugin_path
entry was added to the
-.Li settings
+.Fa settings
list.
.Pp
The
@@ -4650,19 +4680,19 @@ The
and
.Em sudoedit_follow
entries were added to the
-.Li command_info
+.Fa command_info
list.
The default value of
.Em sudoedit_checkdir
was changed to true in sudo 1.8.16.
.Pp
The sudo
-.Em conversation
+.Fn conversation
function now takes a pointer to a
-.Li struct sudo_conv_callback
+.Vt struct sudo_conv_callback
as its fourth argument.
The
-.Li sudo_conv_t
+.Vt sudo_conv_t
definition has been updated to match.
The plugin must specify that it supports plugin API version 1.8 or higher
to receive a conversation function pointer that supports this argument.
@@ -4670,13 +4700,13 @@ to receive a conversation function pointer that supports this argument.
The
.Em execfd
entry was added to the
-.Li command_info
+.Fa command_info
list.
.It Version 1.10 (sudo 1.8.19)
The
.Em umask
entry was added to the
-.Li user_info
+.Fa user_info
list.
The
.Em iolog_group ,
@@ -4684,38 +4714,43 @@ The
and
.Em iolog_user
entries were added to the
-.Li command_info
+.Fa command_info
list.
.It Version 1.11 (sudo 1.8.20)
The
.Em timeout
entry was added to the
-.Li settings
+.Fa settings
list.
.It Version 1.12 (sudo 1.8.21)
The
-.Li change_winsize
-field was added to the io_plugin struct.
+.Fn change_winsize
+function was added to
+.Vt struct io_plugin .
.It Version 1.13 (sudo 1.8.26)
The
-.Li log_suspend
-field was added to the io_plugin struct.
+.Fn log_suspend
+function was added to
+.Vt struct io_plugin .
.It Version 1.14 (sudo 1.8.29)
The
.Em umask_override
entry was added to the
-.Li command_info
+.Fa command_info
list.
.It Version 1.15 (sudo 1.9.0)
The
.Em cwd_optional
entry was added to the
-.Li command_info
+.Fa command_info
list.
.Pp
The
-.Em event_alloc
-field was added to the policy_plugin and io_plugin structs.
+.Fn event_alloc
+function was added to
+.Vt struct policy_plugin
+and
+.Vt struct io_plugin .
.Pp
The
.Fa errstr
@@ -4737,7 +4772,7 @@ has increased from 255 to 1023 bytes.
Support for audit and approval plugins was added.
.It Version 1.16 (sudo 1.9.3)
Initial resource limit values were added to the
-.Li user_info
+.Fa user_info
list.
.Pp
The
@@ -4745,22 +4780,25 @@ The
and
.Em cmnd_cwd
entries were added to the
-.Li settings
+.Fa settings
list.
.It Version 1.17 (sudo 1.9.4)
The
-.Em event_alloc
-field was added to the audit_plugin and approval_plugin structs.
+.Fn event_alloc
+function was added to
+.Vt struct audit_plugin
+and
+.Vt struct approval_plugin .
.It Version 1.18 (sudo 1.9.9)
The policy may now set resource limit values in the
-.Li command_info
+.Fa command_info
list.
The
.Em intercept
and
.Em log_subcmds
entries were added to the
-.Li command_info
+.Fa command_info
list.
.It Version 1.19 (sudo 1.9.11)
The
@@ -4768,12 +4806,25 @@ The
and
.Em intercept_setid
entries were added to the
-.Li settings
+.Fa settings
list.
The
-.Em user_ptrace
+.Em apparmor_profile
+and
+.Em use_ptrace
+entries were added to the
+.Fa command_info
+list.
+.It Version 1.20 (sudo 1.9.12)
+The
+.Em update_ticket
entry was added to the
-.Li command_info
+.Fa settings
+list.
+The
+.Em intercept_verify
+entry was added to the
+.Fa command_info
list.
.El
.Sh SEE ALSO
diff --git a/docs/sudo_plugin_python.man.in b/docs/sudo_plugin_python.man.in
index 98c0abbfc..e67f55982 100644
--- a/docs/sudo_plugin_python.man.in
+++ b/docs/sudo_plugin_python.man.in
@@ -17,7 +17,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "SUDO_PLUGIN_PYTHON" "5" "June 6, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDO_PLUGIN_PYTHON" "5" "September 11, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -96,9 +96,9 @@ When the plugin loads,
will create an instance of this class and call the methods.
The actual methods required depent on the type of the plugin,
but most return an
-\(lqint\(rq
+\fIint\fR
result code, as documented in
-sudo_plugin(@mansectsu@),
+sudo_plugin(@mansectform@),
that indicates whether or not the method was successful.
The Python sudo module defines the following constants to improve readability:
.RS 4n
@@ -120,12 +120,12 @@ l l.
.RE
.PP
If a function returns
-\fINone\fR
+\fRNone\fR
(for example, if it does not call return),
it will be considered to have returned
\fRsudo.RC.OK\fR.
-If an exception is raised (other than sudo.PluginException), the backtrace will be
-shown to the user and the plugin function will return
+If an exception is raised (other than sudo.PluginException), the
+backtrace will be shown to the user and the plugin function will return
\fRsudo.RC.ERROR\fR.
If that is not acceptable, you must catch the exception and handle it yourself.
.PP
@@ -151,7 +151,7 @@ Running the Python interpreter and bridging between C and Python is
handled by the
\fBsudo\fR
plugin
-\fRpython_plugin.so\fR.
+\fIpython_plugin.so\fR.
This shared object can be loaded like any other dynamic
\fBsudo\fR
plugin and should receive the path and the class name of the Python
@@ -219,7 +219,7 @@ sudo.conf(@mansectform@).
.PP
A policy plugin may have the following member functions:
.TP 6n
-\fBconstructor\fR
+\fIconstructor\fR
.nf
.RS 6n
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
@@ -235,7 +235,9 @@ as member variables in the object.
.sp
The constructor matches the
\fBopen\fR()
-function in the C sudo plugin API.
+function in the C
+\fBsudo\fR
+plugin API.
.sp
The function arguments are as follows:
.TP 6n
@@ -279,7 +281,7 @@ documentation in
sudo_plugin(@mansectform@).
.RE
.TP 6n
-\fBcheck_policy\fR
+\fIcheck_policy\fR
.nf
.RS 6n
check_policy(self, argv: Tuple[str, ...], env_add: Tuple[str, ...])
@@ -367,7 +369,7 @@ format.
.RE
.PD
.TP 6n
-\fBinit_session\fR
+\fIinit_session\fR
.nf
.RS 6n
init_session(self, user_pwd: Tuple, user_env: Tuple[str, ...])
@@ -387,8 +389,9 @@ The function arguments are as follows:
.TP 6n
\fIuser_pwd\fR
A tuple describing the user's passwd entry.
-Convertible to pwd.struct_passwd or
-\fINone\fR
+Convertible to
+\fIpwd.struct_passwd or\fR
+\fRNone\fR
if the user is not present in the password database.
.sp
Example conversion:
@@ -437,7 +440,7 @@ If this is omitted, no changes will be made to
.RE
.PD
.TP 6n
-\fBlist\fR
+\fIlist\fR
.nf
.RS 6n
list(self, argv: Tuple[str, ...], is_verbose: int, user: str)
@@ -451,7 +454,7 @@ The function arguments are as follows:
.TP 6n
\fIargv\fR
If not set to
-\fINone\fR,
+\fRNone\fR,
an argument vector describing a command the user wishes to check
against the policy.
.TP 6n
@@ -461,14 +464,14 @@ Flag indicating whether to list in verbose mode or not.
\fIuser\fR
The name of a different user to list privileges for if the policy allows it.
If
-\fINone\fR,
+\fRNone\fR,
the plugin should list the privileges of the invoking user.
.PD 0
.PP
.RE
.PD
.TP 6n
-\fBvalidate\fR
+\fIvalidate\fR
.nf
.RS 6n
validate(self)
@@ -479,7 +482,7 @@ validate(self)
For policy plugins that cache authentication credentials, this function is used to validate and cache the credentials (optional).
.RE
.TP 6n
-\fBinvalidate\fR
+\fIinvalidate\fR
.nf
.RS 6n
invalidate(self, remove: int)
@@ -499,7 +502,7 @@ invalidating them.
.RE
.PD
.TP 6n
-\fBshow_version\fR
+\fIshow_version\fR
.nf
.RS 6n
show_version(self, is_verbose: int)
@@ -524,7 +527,7 @@ is run as the root user.
.RE
.PD
.TP 6n
-\fBclose\fR
+\fIclose\fR
.br
.nf
.RS 6n
@@ -537,7 +540,9 @@ Called when a command finishes executing.
.sp
Works the same as the
\fBclose\fR()
-function in the C sudo plugin API, except that it only gets called if
+function in the C
+\fBsudo\fR
+plugin API, except that it only gets called if
\fBsudo\fR
attempts to execute the command.
.sp
@@ -569,8 +574,10 @@ Plugin python_policy python_plugin.so \e
.RE
.fi
.PP
-Be aware, however, that you cannot enable the Python policy plugin
-in addition to another policy plugin, such as
+Only one policy plugin can be enabled at a time so you must disable
+any other policy plugin listed in
+\fI@sysconfdir@/sudo.conf\fR,
+such as
sudoers(@mansectform@).
.SS "I/O plugin API"
I/O plugins must be registered in
@@ -588,7 +595,7 @@ Currently only 8 python I/O plugins can be loaded at once.
.PP
An I/O plugin may have the following member functions:
.TP 6n
-\fBconstructor\fR
+\fIconstructor\fR
.nf
.RS 6n
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
@@ -604,7 +611,9 @@ as member variables in the object.
.sp
The constructor matches the
\fBopen\fR()
-function in the C sudo plugin API.
+function in the C
+\fBsudo\fR
+plugin API.
.sp
The function arguments are as follows:
.TP 6n
@@ -648,7 +657,7 @@ documentation in
sudo_plugin(@mansectform@).
.RE
.TP 6n
-\fBopen\fR
+\fIopen\fR
.nf
.RS 6n
open(self, argv: Tuple[str, ...],
@@ -661,13 +670,15 @@ Receives the command the user wishes to run.
.sp
Works the same as the
\fBopen\fR()
-function in the C sudo plugin API except that:
+function in the C
+\fBsudo\fR
+plugin API except that:
.sp
.RS 10n
.PD 0
.TP 3n
\fB\(bu\fR
-It only gets called before the user would execute some command
+It only gets called when there is a command to be executed
(and not for a version query for example).
.TP 3n
\fB\(bu\fR
@@ -708,7 +719,7 @@ If the function returns
no I/O will be sent to the plugin.
.RE
.TP 6n
-\fBlog_ttyin\fR, \fBlog_ttyout\fR, \fBlog_stdin\fR, \fBlog_stdout\fR, \fBlog_stderr\fR
+\fIlog_ttyin\fR, \fIlog_ttyout\fR, \fIlog_stdin\fR, \fIlog_stdout\fR, \fIlog_stderr\fR
.nf
.RS 6n
log_ttyin(self, buf: str) -> int
@@ -736,8 +747,8 @@ constants.
.sp
If
\fRsudo.RC.ERROR\fR
-is returned, the running command will be terminated and all of the plugin's logging
-functions will be disabled.
+is returned, the running command will be terminated and all of the
+plugin's logging functions will be disabled.
Other I/O logging plugins will still receive any remaining
input or output that has not yet been processed.
.sp
@@ -751,7 +762,7 @@ the command will be terminated and the data will not be written to the
terminal, though it will still be sent to any other I/O logging plugins.
.RE
.TP 6n
-\fBchange_winsize\fR
+\fIchange_winsize\fR
.nf
.RS 6n
change_winsize(self, line: int, cols: int) -> int
@@ -772,7 +783,7 @@ The number of columns of the terminal.
.RE
.PD
.TP 6n
-\fBlog_suspend\fR
+\fIlog_suspend\fR
.nf
.RS 6n
log_suspend(self, signo: int) -> int
@@ -793,7 +804,7 @@ if the command was resumed.
.RE
.PD
.TP 6n
-\fBshow_version\fR
+\fIshow_version\fR
.nf
.RS 6n
show_version(self, is_verbose: int)
@@ -817,7 +828,7 @@ is run as the root user.
.RE
.PD
.TP 6n
-\fBclose\fR
+\fIclose\fR
.br
.nf
.RS 6n
@@ -825,11 +836,13 @@ close(self, exit_status: int, error: int) -> None
.RE
.fi
.RS 6n
-Called when a command execution finished.
+Called when a command finishes execution.
.sp
Works the same as the
\fBclose\fR()
-function in the C sudo plugin API, except that it only gets called if
+function in the C
+\fBsudo\fR
+plugin API, except that it only gets called if
\fBsudo\fR
attempts to execute the command.
.sp
@@ -849,7 +862,7 @@ system call, otherwise 0.
.RE
.PD
.SS "I/O plugin example"
-Sudo ships a Python I/O plugin example.
+Sudo ships with a Python I/O plugin example.
To try it, register it by adding the following lines to
\fI@sysconfdir@/sudo.conf\fR:
.nf
@@ -874,9 +887,9 @@ Plugin python_audit python_plugin.so ModulePath=<path> ClassName=<class>
Sudo supports loading multiple audit plugins.
Currently only 8 python audit plugins can be loaded at once.
.PP
-An audit plugin may have the following member functions (all of them are optional):
+An audit plugin may have the following member functions (all of which are optional):
.TP 6n
-\fBconstructor\fR
+\fIconstructor\fR
.nf
.RS 6n
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
@@ -890,7 +903,9 @@ as member variables in the object.
.sp
The constructor matches the
\fBopen\fR()
-function in the C sudo plugin API.
+function in the C
+\fBsudo\fR
+plugin API.
.sp
The function arguments are as follows:
.TP 6n
@@ -926,7 +941,7 @@ format.
.RE
.PD
.TP 6n
-\fBopen\fR
+\fIopen\fR
.nf
.RS 6n
open(self, submit_optind: int,
@@ -949,7 +964,7 @@ The argument vector sudo was invoked with, including all command line options.
.RE
.PD
.TP 6n
-\fBclose\fR
+\fIclose\fR
.br
.nf
.RS 6n
@@ -964,7 +979,9 @@ The function arguments are as follows:
.TP 6n
\fIstatus_type\fR
The type of status being passed.
-One of the sudo.EXIT_REASON.* constants.
+One of the
+\fRsudo.EXIT_REASON.*\fR
+constants.
.TP 6n
\fIstatus\fR
Depending on the value of
@@ -973,11 +990,11 @@ this value is either
ignored, the command's exit status as returned by the
wait(2)
system call, the value of
-\fRerrno\fR
+\fIerrno\fR
set by the
execve(2)
system call, or the value of
-\fRerrno\fR
+\fIerrno\fR
resulting from an error in the
\fBsudo\fR
front-end.
@@ -986,7 +1003,7 @@ front-end.
.RE
.PD
.TP 6n
-\fBshow_version\fR
+\fIshow_version\fR
.nf
.RS 6n
show_version(self, is_verbose: int) -> int
@@ -1011,7 +1028,7 @@ is run as the root user.
.RE
.PD
.TP 6n
-\fBaccept\fR
+\fIaccept\fR
.nf
.RS 6n
accept(self, plugin_name: str, plugin_type: int, command_info: Tuple[str, ...],
@@ -1075,7 +1092,7 @@ The environment the command will be run with.
.RE
.PD
.TP 6n
-\fBreject\fR
+\fIreject\fR
.nf
.RS 6n
reject(self, plugin_name: str, plugin_type: int, audit_msg: str,
@@ -1109,7 +1126,7 @@ front-end.
audit_msg
An optional string describing the reason the command was rejected by the plugin.
If the plugin did not provide a reason, audit_msg will be
-\fINone\fR
+\fRNone\fR.
.TP 6n
command_info
A vector of information describing the rejected command.
@@ -1121,7 +1138,7 @@ manual for possible values.
.RE
.PD
.TP 6n
-\fBerror\fR
+\fIerror\fR
.br
.nf
.RS 6n
@@ -1153,7 +1170,7 @@ front-end.
audit_msg
An optional string describing the plugin error.
If the plugin did not provide a description, it will be
-\fINone\fR
+\fRNone\fR.
.TP 6n
command_info
A vector of information describing the command.
@@ -1165,7 +1182,7 @@ manual for possible values.
.RE
.PD
.SS "Audit plugin example"
-Sudo ships a Python Audit plugin example.
+Sudo ships with a Python Audit plugin example.
To try it, register it by adding the following lines to
\fI@sysconfdir@/sudo.conf\fR:
.nf
@@ -1194,7 +1211,7 @@ Currently only 8 python approval plugins can be loaded at once.
.PP
An approval plugin may have the following member functions:
.TP 6n
-\fBconstructor\fR
+\fIconstructor\fR
.nf
.RS 6n
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
@@ -1210,7 +1227,9 @@ as member variables in the object.
.sp
The constructor matches the
\fBopen\fR()
-function in the C sudo plugin API.
+function in the C
+\fBsudo\fR
+plugin API.
.sp
The function arguments are as follows:
.TP 6n
@@ -1254,7 +1273,7 @@ The argument vector sudo was invoked with, including all command line options.
.RE
.PD
.TP 6n
-\fBshow_version\fR
+\fIshow_version\fR
.nf
.RS 6n
show_version(self, is_verbose: int) -> int
@@ -1262,10 +1281,11 @@ show_version(self, is_verbose: int) -> int
.fi
.RS 6n
.sp
-Display the version. (Same as for all the other plugins.)
+Display the version.
+(Same as for all the other plugins.)
.RE
.TP 6n
-\fBcheck\fR
+\fIcheck\fR
.br
.nf
.RS 6n
@@ -1306,7 +1326,7 @@ The environment the command will be run with.
.RE
.PD
.SS "Approval plugin example"
-Sudo ships a Python Approval plugin example.
+Sudo ships with a Python Approval plugin example.
To try it, register it by adding the following lines to
\fI@sysconfdir@/sudo.conf\fR:
.nf
@@ -1337,7 +1357,7 @@ Currently, only a single group plugin can be registered in
.PP
A group provider plugin may have the following member functions:
.TP 6n
-\fBconstructor\fR
+\fIconstructor\fR
.nf
.RS 6n
__init__(self, args: Tuple[str, ...], version: str)
@@ -1366,7 +1386,7 @@ The version of the Python Group Plugin API.
.RE
.PD
.TP 6n
-\fBquery\fR
+\fIquery\fR
.br
.nf
.RS 6n
@@ -1402,7 +1422,7 @@ is not present in the password database,
will be
\fRNULL\fR.
.SS "Group plugin example"
-Sudo ships a Python group plugin example.
+Sudo ships with a Python group plugin example.
To try it, register it in the
\fIsudoers\fR
file by adding the following lines:
@@ -1419,7 +1439,7 @@ The example plugin will tell
\fBsudo\fR
that the user
\fItest\fR
-is part of the non-unix group
+is part of the non-Unix group
\fImygroup\fR.
If you add a rule that uses this group, it will affect the
\fItest\fR
@@ -1444,16 +1464,18 @@ written in Python.
A Python plugin can interact with the user using the
\fBsudo.conv\fR()
function which displays one or more messages described by the
-\fBsudo.ConvMessage\fR
+\fRsudo.ConvMessage\fR
class.
This is the Python equivalent of the
\fBconversation\fR()
-function in the C sudo plugin API.
+function in the C
+\fBsudo\fR
+plugin API.
A plugin should not attempt to read directly from the standard input or
the user's tty (neither of which are guaranteed to exist).
.PP
The
-\fBsudo.ConvMessage\fR
+\fRsudo.ConvMessage\fR
class specifies how the user interaction should occur:
.nf
.sp
@@ -1462,7 +1484,7 @@ sudo.ConvMessage(msg_type: int, msg: str, timeout: int)
.RE
.fi
.PP
-\fBsudo.ConvMessage\fR
+\fRsudo.ConvMessage\fR
member variables:
.TP 6n
\fImsg_type\fR
@@ -1474,7 +1496,7 @@ constants below.
\fImsg\fR
The message to display to the user.
The caller must include a trailing newline in
-\fRmsg\fR
+\fImsg\fR
if one is to be displayed.
.TP 6n
\fItimeout\fR
@@ -1493,25 +1515,25 @@ To specify the message type, the following constants are available:
.PD 0
.TP 3n
\fB\(bu\fR
-sudo.CONV.PROMPT_ECHO_OFF
+\fRsudo.CONV.PROMPT_ECHO_OFF\fR
.TP 3n
\fB\(bu\fR
-sudo.CONV.PROMPT_ECHO_ON
+\fRsudo.CONV.PROMPT_ECHO_ON\fR
.TP 3n
\fB\(bu\fR
-sudo.CONV.ERROR_MSG
+\fRsudo.CONV.ERROR_MSG\fR
.TP 3n
\fB\(bu\fR
-sudo.CONV.INFO_MSG
+\fRsudo.CONV.INFO_MSG\fR
.TP 3n
\fB\(bu\fR
-sudo.CONV.PROMPT_MASK
+\fRsudo.CONV.PROMPT_MASK\fR
.TP 3n
\fB\(bu\fR
-sudo.CONV.PROMPT_ECHO_OK
+\fRsudo.CONV.PROMPT_ECHO_OK\fR
.TP 3n
\fB\(bu\fR
-sudo.CONV.PREFER_TTY
+\fRsudo.CONV.PREFER_TTY\fR
.RE
.PD
.PP
@@ -1534,7 +1556,7 @@ The function arguments are as follows:
.TP 6n
\fImessage(s)\fR
One of more messages (of type
-\fBsudo.ConvMessage\fR),
+\fRsudo.ConvMessage\fR),
each describing a conversation.
At least one message is required.
.TP 6n
@@ -1554,11 +1576,11 @@ The
\fBsudo.conv\fR()
function can raise the following exceptions:
.TP 6n
-\fBsudo.SudoException\fR
+\fRsudo.SudoException\fR
If the conversation fails, for example when the conversation function is not
available.
.TP 6n
-\fBsudo.ConversationInterrupted\fR
+\fRsudo.ConversationInterrupted\fR
If the conversation function returns an error, e.g., the timeout passed
or the user interrupted the conversation by pressing control-C.
.SS "Conversation example"
@@ -1618,7 +1640,7 @@ debug system.
\fIEnabling debugging in sudo.conf\fR
.PP
To enable debug messages, add a
-\fRDebug\fR
+\fIDebug\fR
line to
sudo.conf(@mansectform@)
with the program set to
@@ -1710,21 +1732,21 @@ l l l.
.PP
\fBsudo.conf name\fR \fBPython constant\fR \fBdescription\fR
.PP
-crit sudo.DEBUG.CRIT only critical messages
+crit \fRsudo.DEBUG.CRIT\fR only critical messages
.PP
-err sudo.DEBUG.ERROR
+err \fRsudo.DEBUG.ERROR\fR
.PP
-warn sudo.DEBUG.WARN
+warn \fRsudo.DEBUG.WARN\fR
.PP
-notice sudo.DEBUG.NOTICE
+notice \fRsudo.DEBUG.NOTICE\fR
.PP
-diag sudo.DEBUG.DIAG
+diag \fRsudo.DEBUG.DIAG\fR
.PP
-info sudo.DEBUG.INFO
+info \fRsudo.DEBUG.INFO\fR
.PP
-trace sudo.DEBUG.TRACE
+trace \fRsudo.DEBUG.TRACE\fR
.PP
-debug sudo.DEBUG.DEBUG very extreme verbose debugging
+debug \fRsudo.DEBUG.DEBUG\fR very extreme verbose debugging
.TE
.PP
\fIUsing the logging module\fR
@@ -1737,11 +1759,11 @@ The log handler of sudo will map each Python log level of a message to
the appropriate sudo debug level.
The sudo debug system will only receive messages that are not filtered
out by the Python loggers.
-For example, the log level of the python logger will be an additional filter
-for the log messages, and is usually very different from what level is set in sudo.conf
-for the sudo debug system.
+For example, the log level of the python logger will be an additional
+filter for the log messages, and is usually very different from
+what level is set in sudo.conf for the sudo debug system.
.SS "Debug example"
-Sudo ships an example debug plugin by default.
+Sudo ships with an example debug plugin.
To try it, register it by adding the following lines to
\fI@sysconfdir@/sudo.conf\fR:
.nf
@@ -1816,12 +1838,13 @@ This is how the plugin API accepts options and settings.
.SH "PLUGIN API CHANGELOG (Python)"
None yet
.SH "LIMITATIONS"
-Only a maximum number of 8 python I/O plugins can be loaded at once.
+A maximum of 8 python I/O plugins can be loaded at once.
If
\fI@sysconfdir@/sudo.conf\fR
contains more, those will be rejected with a warning message.
.PP
-The Event API and the hook function API is currently not accessible for Python plugins.
+The Event API and the hook function API is currently not accessible
+for Python plugins.
.SH "SEE ALSO"
sudo.conf(@mansectform@),
sudo_plugin(@mansectform@),
@@ -1849,7 +1872,7 @@ If you believe you have found a bug in
you can submit a bug report at https://bugzilla.sudo.ws/
.SH "SECURITY CONSIDERATIONS"
All Python plugin handling is implemented inside the
-\fRpython_plugin.so\fR
+\fIpython_plugin.so\fR
dynamic plugin.
Therefore, if no Python plugin is registered in
sudo.conf(@mansectform@)
@@ -1875,7 +1898,7 @@ accidentally importing such file would make it possible for any user
However, during development of a plugin this might not be very convenient.
The
sudo.conf(@mansectform@)
-\fRdeveloper_mode\fR
+\fIdeveloper_mode\fR
option can be used to disable it.
For example:
.RS 6n
diff --git a/docs/sudo_plugin_python.mdoc.in b/docs/sudo_plugin_python.mdoc.in
index 111bed672..e17e1d272 100644
--- a/docs/sudo_plugin_python.mdoc.in
+++ b/docs/sudo_plugin_python.mdoc.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd June 6, 2022
+.Dd September 11, 2022
.Dt SUDO_PLUGIN_PYTHON @mansectform@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -85,9 +85,9 @@ When the plugin loads,
will create an instance of this class and call the methods.
The actual methods required depent on the type of the plugin,
but most return an
-.Dq int
+.Vt int
result code, as documented in
-.Xr sudo_plugin @mansectsu@ ,
+.Xr sudo_plugin @mansectform@ ,
that indicates whether or not the method was successful.
The Python sudo module defines the following constants to improve readability:
.Bl -column "sudo.RC.USAGE_ERROR" "XXX" -offset 4n
@@ -100,12 +100,12 @@ The Python sudo module defines the following constants to improve readability:
.El
.Pp
If a function returns
-.Em None
+.Dv None
(for example, if it does not call return),
it will be considered to have returned
.Dv sudo.RC.OK .
-If an exception is raised (other than sudo.PluginException), the backtrace will be
-shown to the user and the plugin function will return
+If an exception is raised (other than sudo.PluginException), the
+backtrace will be shown to the user and the plugin function will return
.Dv sudo.RC.ERROR .
If that is not acceptable, you must catch the exception and handle it yourself.
.Pp
@@ -128,7 +128,7 @@ Running the Python interpreter and bridging between C and Python is
handled by the
.Nm sudo
plugin
-.Li python_plugin.so .
+.Pa python_plugin.so .
This shared object can be loaded like any other dynamic
.Nm sudo
plugin and should receive the path and the class name of the Python
@@ -187,8 +187,8 @@ Currently, only a single policy plugin may be specified in
.Pp
A policy plugin may have the following member functions:
.Bl -tag -width 4n
-.It Sy constructor
-.Bd -literal
+.It Fa constructor
+.Bd -literal -compact
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
version: str, user_info: Tuple[str, ...],
plugin_options: Tuple[str, ...])
@@ -200,7 +200,9 @@ as member variables in the object.
.Pp
The constructor matches the
.Fn open
-function in the C sudo plugin API.
+function in the C
+.Nm sudo
+plugin API.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
@@ -239,7 +241,7 @@ see the policy plugin
.Fn open
documentation in
.Xr sudo_plugin @mansectform@ .
-.It Sy check_policy
+.It Fa check_policy
.Bd -literal -compact
check_policy(self, argv: Tuple[str, ...], env_add: Tuple[str, ...])
.Ed
@@ -314,7 +316,7 @@ tuple of strings in
.Dq key=value
format.
.El
-.It Sy init_session
+.It Fa init_session
.Bd -literal -compact
init_session(self, user_pwd: Tuple, user_env: Tuple[str, ...])
.Ed
@@ -331,8 +333,9 @@ The function arguments are as follows:
.Bl -tag -width 4n
.It Fa user_pwd
A tuple describing the user's passwd entry.
-Convertible to pwd.struct_passwd or
-.Em None
+Convertible to
+.Vt pwd.struct_passwd or
+.Dv None
if the user is not present in the password database.
.Pp
Example conversion:
@@ -371,7 +374,7 @@ environment in
If this is omitted, no changes will be made to
.Fa user_env .
.El
-.It Sy list
+.It Fa list
.Bd -literal -compact
list(self, argv: Tuple[str, ...], is_verbose: int, user: str)
.Ed
@@ -382,7 +385,7 @@ The function arguments are as follows:
.Bl -tag -width 4n
.It Fa argv
If not set to
-.Em None ,
+.Dv None ,
an argument vector describing a command the user wishes to check
against the policy.
.It Fa is_verbose
@@ -390,16 +393,16 @@ Flag indicating whether to list in verbose mode or not.
.It Fa user
The name of a different user to list privileges for if the policy allows it.
If
-.Em None ,
+.Dv None ,
the plugin should list the privileges of the invoking user.
.El
-.It Sy validate
+.It Fa validate
.Bd -literal -compact
validate(self)
.Ed
.Pp
For policy plugins that cache authentication credentials, this function is used to validate and cache the credentials (optional).
-.It Sy invalidate
+.It Fa invalidate
.Bd -literal -compact
invalidate(self, remove: int)
.Ed
@@ -412,7 +415,7 @@ The function arguments are as follows:
If this flag is set, the plugin may remove the credentials instead of simply
invalidating them.
.El
-.It Sy show_version
+.It Fa show_version
.Bd -literal -compact
show_version(self, is_verbose: int)
.Ed
@@ -430,7 +433,7 @@ Currently this is 1 if
.Ql sudo -V
is run as the root user.
.El
-.It Sy close
+.It Fa close
.Bd -literal -compact
close(self, exit_status: int, error: int)
.Ed
@@ -439,7 +442,9 @@ Called when a command finishes executing.
.Pp
Works the same as the
.Fn close
-function in the C sudo plugin API, except that it only gets called if
+function in the C
+.Nm sudo
+plugin API, except that it only gets called if
.Nm sudo
attempts to execute the command.
.Pp
@@ -464,8 +469,10 @@ Plugin python_policy python_plugin.so \e
ClassName=SudoPolicyPlugin
.Ed
.Pp
-Be aware, however, that you cannot enable the Python policy plugin
-in addition to another policy plugin, such as
+Only one policy plugin can be enabled at a time so you must disable
+any other policy plugin listed in
+.Pa @sysconfdir@/sudo.conf ,
+such as
.Xr sudoers @mansectform@ .
.Ss I/O plugin API
I/O plugins must be registered in
@@ -480,7 +487,7 @@ Currently only 8 python I/O plugins can be loaded at once.
.Pp
An I/O plugin may have the following member functions:
.Bl -tag -width 4n
-.It Sy constructor
+.It Fa constructor
.Bd -literal -compact
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
version: str, user_info: Tuple[str, ...],
@@ -493,7 +500,9 @@ as member variables in the object.
.Pp
The constructor matches the
.Fn open
-function in the C sudo plugin API.
+function in the C
+.Nm sudo
+plugin API.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
@@ -532,7 +541,7 @@ see the I/O plugin
.Fn open
documentation in
.Xr sudo_plugin @mansectform@ .
-.It Sy open
+.It Fa open
.Bd -literal -compact
open(self, argv: Tuple[str, ...],
command_info: Tuple[str, ...]) -> int
@@ -542,11 +551,13 @@ Receives the command the user wishes to run.
.Pp
Works the same as the
.Fn open
-function in the C sudo plugin API except that:
+function in the C
+.Nm sudo
+plugin API except that:
.Pp
.Bl -bullet -compact -offset 4n -width 1n
.It
-It only gets called before the user would execute some command
+It only gets called when there is a command to be executed
(and not for a version query for example).
.It
Other arguments of the C API
@@ -583,7 +594,7 @@ constants.
If the function returns
.Dv sudo.RC.REJECT ,
no I/O will be sent to the plugin.
-.It Sy log_ttyin , log_ttyout , log_stdin , log_stdout , log_stderr
+.It Fa log_ttyin , log_ttyout , log_stdin , log_stdout , log_stderr
.Bd -literal -compact
log_ttyin(self, buf: str) -> int
log_ttyout(self, buf: str) -> int
@@ -609,8 +620,8 @@ constants.
.Pp
If
.Dv sudo.RC.ERROR
-is returned, the running command will be terminated and all of the plugin's logging
-functions will be disabled.
+is returned, the running command will be terminated and all of the
+plugin's logging functions will be disabled.
Other I/O logging plugins will still receive any remaining
input or output that has not yet been processed.
.Pp
@@ -622,7 +633,7 @@ If an output logging function rejects the data by returning
.Dv sudo.RC.REJECT ,
the command will be terminated and the data will not be written to the
terminal, though it will still be sent to any other I/O logging plugins.
-.It Sy change_winsize
+.It Fa change_winsize
.Bd -literal -compact
change_winsize(self, line: int, cols: int) -> int
.Ed
@@ -635,7 +646,7 @@ The number of lines of the terminal.
.It Fa cols
The number of columns of the terminal.
.El
-.It Sy log_suspend
+.It Fa log_suspend
.Bd -literal -compact
log_suspend(self, signo: int) -> int
.Ed
@@ -648,7 +659,7 @@ The number of the signal that caused the command to be suspended or
.Dv SIGCONT
if the command was resumed.
.El
-.It Sy show_version
+.It Fa show_version
.Bd -literal -compact
show_version(self, is_verbose: int)
.Ed
@@ -665,15 +676,17 @@ Currently this is 1 if
.Ql sudo -V
is run as the root user.
.El
-.It Sy close
+.It Fa close
.Bd -literal -compact
close(self, exit_status: int, error: int) -> None
.Ed
-Called when a command execution finished.
+Called when a command finishes execution.
.Pp
Works the same as the
.Fn close
-function in the C sudo plugin API, except that it only gets called if
+function in the C
+.Nm sudo
+plugin API, except that it only gets called if
.Nm sudo
attempts to execute the command.
.Pp
@@ -689,7 +702,7 @@ system call, otherwise 0.
.El
.El
.Ss I/O plugin example
-Sudo ships a Python I/O plugin example.
+Sudo ships with a Python I/O plugin example.
To try it, register it by adding the following lines to
.Pa @sysconfdir@/sudo.conf :
.Bd -literal -offset 4n
@@ -708,9 +721,9 @@ Plugin python_audit python_plugin.so ModulePath=<path> ClassName=<class>
Sudo supports loading multiple audit plugins.
Currently only 8 python audit plugins can be loaded at once.
.Pp
-An audit plugin may have the following member functions (all of them are optional):
+An audit plugin may have the following member functions (all of which are optional):
.Bl -tag -width 4n
-.It Sy constructor
+.It Fa constructor
.Bd -literal -compact
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
version: str, user_info: Tuple[str, ...], plugin_options: Tuple[str, ...])
@@ -721,7 +734,9 @@ as member variables in the object.
.Pp
The constructor matches the
.Fn open
-function in the C sudo plugin API.
+function in the C
+.Nm sudo
+plugin API.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
@@ -749,7 +764,7 @@ This is a tuple of strings, usually (but not necessarily) in
.Dq key=value
format.
.El
-.It Sy open
+.It Fa open
.Bd -literal -compact
open(self, submit_optind: int,
submit_argv: Tuple[str, ...]) -> int
@@ -764,7 +779,7 @@ that corresponds to the first entry that is not a command line option.
.It Fa submit_argv
The argument vector sudo was invoked with, including all command line options.
.El
-.It Sy close
+.It Fa close
.Bd -literal -compact
close(self, status_type: int, status: int) -> None
.Ed
@@ -775,7 +790,9 @@ The function arguments are as follows:
.Bl -tag -width 4n
.It Fa status_type
The type of status being passed.
-One of the sudo.EXIT_REASON.* constants.
+One of the
+.Dv sudo.EXIT_REASON.*
+constants.
.It Fa status
Depending on the value of
.Fa status_type ,
@@ -783,16 +800,16 @@ this value is either
ignored, the command's exit status as returned by the
.Xr wait 2
system call, the value of
-.Li errno
+.Va errno
set by the
.Xr execve 2
system call, or the value of
-.Li errno
+.Va errno
resulting from an error in the
.Nm sudo
front-end.
.El
-.It Sy show_version
+.It Fa show_version
.Bd -literal -compact
show_version(self, is_verbose: int) -> int
.Ed
@@ -810,7 +827,7 @@ Currently this is 1 if
.Ql sudo -V
is run as the root user.
.El
-.It Sy accept
+.It Fa accept
.Bd -literal -compact
accept(self, plugin_name: str, plugin_type: int, command_info: Tuple[str, ...],
run_argv: Tuple[str, ...], run_envp: Tuple[str, ...]) -> int
@@ -863,7 +880,7 @@ Argument vector describing a command that will be run.
.It run_envp
The environment the command will be run with.
.El
-.It Sy reject
+.It Fa reject
.Bd -literal -compact
reject(self, plugin_name: str, plugin_type: int, audit_msg: str,
command_info: Tuple[str, ...]) -> int
@@ -892,15 +909,14 @@ front-end.
.It audit_msg
An optional string describing the reason the command was rejected by the plugin.
If the plugin did not provide a reason, audit_msg will be
-.Em None
-.
+.Dv None .
.It command_info
A vector of information describing the rejected command.
See the
.Xr sudo_plugin @mansectform@
manual for possible values.
.El
-.It Sy error
+.It Fa error
.Bd -literal -compact
error(self, plugin_name: str, plugin_type: int, audit_msg: str,
command_info: Tuple[str, ...]) -> int
@@ -926,8 +942,7 @@ front-end.
.It audit_msg
An optional string describing the plugin error.
If the plugin did not provide a description, it will be
-.Em None
-.
+.Dv None .
.It command_info
A vector of information describing the command.
See the
@@ -936,7 +951,7 @@ manual for possible values.
.El
.El
.Ss Audit plugin example
-Sudo ships a Python Audit plugin example.
+Sudo ships with a Python Audit plugin example.
To try it, register it by adding the following lines to
.Pa @sysconfdir@/sudo.conf :
.Bd -literal -offset 4n
@@ -959,7 +974,7 @@ Currently only 8 python approval plugins can be loaded at once.
.Pp
An approval plugin may have the following member functions:
.Bl -tag -width 4n
-.It Sy constructor
+.It Fa constructor
.Bd -literal -compact
__init__(self, user_env: Tuple[str, ...], settings: Tuple[str, ...],
version: str, user_info: Tuple[str, ...], plugin_options: Tuple[str, ...],
@@ -972,7 +987,9 @@ as member variables in the object.
.Pp
The constructor matches the
.Fn open
-function in the C sudo plugin API.
+function in the C
+.Nm sudo
+plugin API.
.Pp
The function arguments are as follows:
.Bl -tag -width 4n
@@ -1006,13 +1023,14 @@ that corresponds to the first entry that is not a command line option.
.It Fa submit_argv
The argument vector sudo was invoked with, including all command line options.
.El
-.It Sy show_version
+.It Fa show_version
.Bd -literal -compact
show_version(self, is_verbose: int) -> int
.Ed
.Pp
-Display the version. (Same as for all the other plugins.)
-.It Sy check
+Display the version.
+(Same as for all the other plugins.)
+.It Fa check
.Bd -literal -compact
check(self, command_info: Tuple[str, ...], run_argv: Tuple[str, ...],
run_env: Tuple[str, ...]) -> int
@@ -1042,7 +1060,7 @@ The environment the command will be run with.
.El
.El
.Ss Approval plugin example
-Sudo ships a Python Approval plugin example.
+Sudo ships with a Python Approval plugin example.
To try it, register it by adding the following lines to
.Pa @sysconfdir@/sudo.conf :
.Bd -literal -offset 4n
@@ -1067,7 +1085,7 @@ Currently, only a single group plugin can be registered in
.Pp
A group provider plugin may have the following member functions:
.Bl -tag -width 4n
-.It Sy constructor
+.It Fa constructor
.Bd -literal -compact
__init__(self, args: Tuple[str, ...], version: str)
.Ed
@@ -1088,7 +1106,7 @@ format).
.It Fa version
The version of the Python Group Plugin API.
.El
-.It Sy query
+.It Fa query
.Bd -literal -compact
query(self, user: str, group: str, user_pwd: Tuple)
.Ed
@@ -1118,7 +1136,7 @@ will be
.Dv NULL .
.El
.Ss Group plugin example
-Sudo ships a Python group plugin example.
+Sudo ships with a Python group plugin example.
To try it, register it in the
.Em sudoers
file by adding the following lines:
@@ -1132,7 +1150,7 @@ The example plugin will tell
.Nm sudo
that the user
.Em test
-is part of the non-unix group
+is part of the non-Unix group
.Em mygroup .
If you add a rule that uses this group, it will affect the
.Em test
@@ -1154,22 +1172,24 @@ written in Python.
A Python plugin can interact with the user using the
.Fn sudo.conv
function which displays one or more messages described by the
-.Sy sudo.ConvMessage
+.Dv sudo.ConvMessage
class.
This is the Python equivalent of the
.Fn conversation
-function in the C sudo plugin API.
+function in the C
+.Nm sudo
+plugin API.
A plugin should not attempt to read directly from the standard input or
the user's tty (neither of which are guaranteed to exist).
.Pp
The
-.Sy sudo.ConvMessage
+.Dv sudo.ConvMessage
class specifies how the user interaction should occur:
.Bd -literal -offset 4n
sudo.ConvMessage(msg_type: int, msg: str, timeout: int)
.Ed
.Pp
-.Sy sudo.ConvMessage
+.Dv sudo.ConvMessage
member variables:
.Bl -tag -width 4n
.It Fa msg_type
@@ -1180,7 +1200,7 @@ constants below.
.It Fa msg
The message to display to the user.
The caller must include a trailing newline in
-.Li msg
+.Fa msg
if one is to be displayed.
.It Fa timeout
Optional.
@@ -1197,19 +1217,19 @@ To specify the message type, the following constants are available:
.Pp
.Bl -bullet -compact -offset 4n -width 1n
.It
-sudo.CONV.PROMPT_ECHO_OFF
+.Dv sudo.CONV.PROMPT_ECHO_OFF
.It
-sudo.CONV.PROMPT_ECHO_ON
+.Dv sudo.CONV.PROMPT_ECHO_ON
.It
-sudo.CONV.ERROR_MSG
+.Dv sudo.CONV.ERROR_MSG
.It
-sudo.CONV.INFO_MSG
+.Dv sudo.CONV.INFO_MSG
.It
-sudo.CONV.PROMPT_MASK
+.Dv sudo.CONV.PROMPT_MASK
.It
-sudo.CONV.PROMPT_ECHO_OK
+.Dv sudo.CONV.PROMPT_ECHO_OK
.It
-sudo.CONV.PREFER_TTY
+.Dv sudo.CONV.PREFER_TTY
.El
.Pp
See the
@@ -1228,7 +1248,7 @@ The function arguments are as follows:
.Bl -tag -width 4n
.It Fa message(s)
One of more messages (of type
-.Sy sudo.ConvMessage ) ,
+.Dv sudo.ConvMessage ) ,
each describing a conversation.
At least one message is required.
.It Fa on_suspend
@@ -1247,10 +1267,10 @@ The
.Fn sudo.conv
function can raise the following exceptions:
.Bl -tag -width 4n
-.It Sy sudo.SudoException
+.It Dv sudo.SudoException
If the conversation fails, for example when the conversation function is not
available.
-.It Sy sudo.ConversationInterrupted
+.It Dv sudo.ConversationInterrupted
If the conversation function returns an error, e.g., the timeout passed
or the user interrupted the conversation by pressing control-C.
.El
@@ -1305,7 +1325,7 @@ debug system.
.Em Enabling debugging in sudo.conf
.Pp
To enable debug messages, add a
-.Li Debug
+.Em Debug
line to
.Xr sudo.conf @mansectform@
with the program set to
@@ -1380,14 +1400,14 @@ one or more messages to log
.Em Available log levels:
.Bl -column "name in sudo.conf" "Python constant" "only critical messages"
.It Sy sudo.conf name Ta Sy Python constant Ta Sy description
-.It crit Ta sudo.DEBUG.CRIT Ta only critical messages
-.It err Ta sudo.DEBUG.ERROR Ta
-.It warn Ta sudo.DEBUG.WARN Ta
-.It notice Ta sudo.DEBUG.NOTICE Ta
-.It diag Ta sudo.DEBUG.DIAG Ta
-.It info Ta sudo.DEBUG.INFO Ta
-.It trace Ta sudo.DEBUG.TRACE Ta
-.It debug Ta sudo.DEBUG.DEBUG Ta very extreme verbose debugging
+.It crit Ta Dv sudo.DEBUG.CRIT Ta only critical messages
+.It err Ta Dv sudo.DEBUG.ERROR Ta
+.It warn Ta Dv sudo.DEBUG.WARN Ta
+.It notice Ta Dv sudo.DEBUG.NOTICE Ta
+.It diag Ta Dv sudo.DEBUG.DIAG Ta
+.It info Ta Dv sudo.DEBUG.INFO Ta
+.It trace Ta Dv sudo.DEBUG.TRACE Ta
+.It debug Ta Dv sudo.DEBUG.DEBUG Ta very extreme verbose debugging
.El
.Pp
.Em Using the logging module
@@ -1400,11 +1420,11 @@ The log handler of sudo will map each Python log level of a message to
the appropriate sudo debug level.
The sudo debug system will only receive messages that are not filtered
out by the Python loggers.
-For example, the log level of the python logger will be an additional filter
-for the log messages, and is usually very different from what level is set in sudo.conf
-for the sudo debug system.
+For example, the log level of the python logger will be an additional
+filter for the log messages, and is usually very different from
+what level is set in sudo.conf for the sudo debug system.
.Ss Debug example
-Sudo ships an example debug plugin by default.
+Sudo ships with an example debug plugin.
To try it, register it by adding the following lines to
.Pa @sysconfdir@/sudo.conf :
.Bd -literal -offset 4n
@@ -1470,12 +1490,13 @@ This is how the plugin API accepts options and settings.
.Sh PLUGIN API CHANGELOG (Python)
None yet
.Sh LIMITATIONS
-Only a maximum number of 8 python I/O plugins can be loaded at once.
+A maximum of 8 python I/O plugins can be loaded at once.
If
.Pa @sysconfdir@/sudo.conf
contains more, those will be rejected with a warning message.
.Pp
-The Event API and the hook function API is currently not accessible for Python plugins.
+The Event API and the hook function API is currently not accessible
+for Python plugins.
.Sh SEE ALSO
.Xr sudo.conf @mansectform@ ,
.Xr sudo_plugin @mansectform@ ,
@@ -1502,7 +1523,7 @@ If you believe you have found a bug in
you can submit a bug report at https://bugzilla.sudo.ws/
.Sh SECURITY CONSIDERATIONS
All Python plugin handling is implemented inside the
-.Li python_plugin.so
+.Pa python_plugin.so
dynamic plugin.
Therefore, if no Python plugin is registered in
.Xr sudo.conf @mansectform@
@@ -1528,7 +1549,7 @@ accidentally importing such file would make it possible for any user
However, during development of a plugin this might not be very convenient.
The
.Xr sudo.conf @mansectform@
-.Li developer_mode
+.Em developer_mode
option can be used to disable it.
For example:
.Dl Set developer_mode true
diff --git a/docs/sudo_sendlog.man.in b/docs/sudo_sendlog.man.in
index 72e118725..eea3cca14 100644
--- a/docs/sudo_sendlog.man.in
+++ b/docs/sudo_sendlog.man.in
@@ -154,7 +154,7 @@ version and exit.
.SS "Debugging sendlog"
\fBsudo_sendlog\fR
supports a flexible debugging framework that is configured via
-\fRDebug\fR
+\fIDebug\fR
lines in the
sudo.conf(@mansectform@)
file.
diff --git a/docs/sudo_sendlog.mdoc.in b/docs/sudo_sendlog.mdoc.in
index 42edb553e..e8c17ae4e 100644
--- a/docs/sudo_sendlog.mdoc.in
+++ b/docs/sudo_sendlog.mdoc.in
@@ -139,7 +139,7 @@ version and exit.
.Ss Debugging sendlog
.Nm
supports a flexible debugging framework that is configured via
-.Li Debug
+.Em Debug
lines in the
.Xr sudo.conf @mansectform@
file.
diff --git a/docs/sudoers.ldap.man.in b/docs/sudoers.ldap.man.in
index 259e29e93..3fd34f3b0 100644
--- a/docs/sudoers.ldap.man.in
+++ b/docs/sudoers.ldap.man.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "SUDOERS.LDAP" "@mansectform@" "February 16, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDOERS.LDAP" "@mansectform@" "September 13, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -69,16 +69,16 @@ is no need for a specialized tool to check syntax.
The
\fIsudoers\fR
configuration is contained in the
-\fRou=SUDOers\fR
+\(oqou=SUDOers\(cq
LDAP container.
.PP
Sudo first looks for the
-\fRcn=defaults\fR
+\(oqcn=defaults\(cq
entry in the SUDOers container.
If found, the multi-valued
-\fRsudoOption\fR
+\fIsudoOption\fR
attribute is parsed in the same manner as a global
-\fRDefaults\fR
+\fIDefaults\fR
line in
\fI@sysconfdir@/sudoers\fR.
In the following example, the
@@ -97,7 +97,7 @@ sudoOption: env_keep+=SSH_AUTH_SOCK
.fi
.PP
The equivalent of a sudoer in LDAP is a
-\fRsudoRole\fR.
+\fIsudoRole\fR.
It consists of the following attributes:
.TP 6n
\fBsudoUser\fR
@@ -120,36 +120,36 @@ Non-Unix group support is only available when an appropriate
\fIgroup_plugin\fR
is defined in the global
\fIdefaults\fR
-\fRsudoRole\fR
+\fIsudoRole\fR
object.
If a
-\fRsudoUser\fR
+\fIsudoUser\fR
entry is preceded by an exclamation point,
\(oq\&!\(cq,
and the entry matches, the
-\fRsudoRole\fR
+\fIsudoRole\fR
in which it resides will be ignored.
Negated
-\fRsudoUser\fR
+\fIsudoUser\fR
entries are only supported by version 1.9.9 or higher.
.TP 6n
\fBsudoHost\fR
A host name, IP address, IP network, or host netgroup (prefixed with a
\(oq+\(cq).
The special value
-\fRALL\fR
+\fBALL\fR
will match any host.
Host netgroups are matched using the host (both qualified and unqualified)
and domain members only; the user member is not used when matching.
If a
-\fRsudoHost\fR
+\fIsudoHost\fR
entry is preceded by an exclamation point,
\(oq\&!\(cq,
and the entry matches, the
-\fRsudoRole\fR
+\fIsudoRole\fR
in which it resides will be ignored.
Negated
-\fRsudoHost\fR
+\fIsudoHost\fR
entries are only supported by version 1.8.18 or higher.
.TP 6n
\fBsudoCommand\fR
@@ -160,7 +160,7 @@ If a command name is preceded by an exclamation point,
the user will be prohibited from running that command.
.sp
The built-in command
-\(lq\fRsudoedit\fR\(rq
+\(lqsudoedit\(rq
is used to permit a user to run
\fBsudo\fR
with the
@@ -169,13 +169,13 @@ option (or as
\fBsudoedit\fR).
It may take command line arguments just as a normal command does.
Unlike other commands,
-\(lq\fRsudoedit\fR\(rq
+\(lqsudoedit\(rq
is a built into
\fBsudo\fR
itself and must be specified in without a leading path.
.sp
The special value
-\fRALL\fR
+\fBALL\fR
will match any command.
.sp
If a command name is prefixed with a SHA-2 digest, it will
@@ -205,7 +205,7 @@ Command digests are only supported by version 1.8.7 or higher.
\fBsudoOption\fR
Identical in function to the global options described above, but
specific to the
-\fRsudoRole\fR
+\fIsudoRole\fR
in which it resides.
.TP 6n
\fBsudoRunAsUser\fR
@@ -217,30 +217,29 @@ or user netgroup (prefixed with a
\(oq+\(cq)
that contains a list of users that commands may be run as.
The special value
-\fRALL\fR
+\fBALL\fR
will match any user.
If a
-\fRsudoRunAsUser\fR
+\fIsudoRunAsUser\fR
entry is preceded by an exclamation point,
\(oq\&!\(cq,
and the entry matches, the
-\fRsudoRole\fR
+\fIsudoRole\fR
in which it resides will be ignored.
If
-\fRsudoRunAsUser\fR
+\fIsudoRunAsUser\fR
is specified but empty, it will match the invoking user.
If neither
-\fRsudoRunAsUser\fR
+\fIsudoRunAsUser\fR
nor
-\fRsudoRunAsGroup\fR
+\fIsudoRunAsGroup\fR
are present, the value of the
\fIrunas_default\fR
-\fRsudoOption\fR
-is used (defaults to
-\fR@runas_default@\fR).
+\fIsudoOption\fR
+is used (defaults to @runas_default@).
.sp
The
-\fRsudoRunAsUser\fR
+\fIsudoRunAsUser\fR
attribute is only available in
\fBsudo\fR
versions
@@ -248,10 +247,10 @@ versions
Older versions of
\fBsudo\fR
use the
-\fRsudoRunAs\fR
+\fIsudoRunAs\fR
attribute instead.
Negated
-\fRsudoRunAsUser\fR
+\fIsudoRunAsUser\fR
entries are only supported by version 1.8.26 or higher.
.TP 6n
\fBsudoRunAsGroup\fR
@@ -259,34 +258,34 @@ A Unix group or group-ID (prefixed with
\(oq#\(cq)
that commands may be run as.
The special value
-\fRALL\fR
+\fBALL\fR
will match any group.
If a
-\fRsudoRunAsGroup\fR
+\fIsudoRunAsGroup\fR
entry is preceded by an exclamation point,
\(oq\&!\(cq,
and the entry matches, the
-\fRsudoRole\fR
+\fIsudoRole\fR
in which it resides will be ignored.
.sp
The
-\fRsudoRunAsGroup\fR
+\fIsudoRunAsGroup\fR
attribute is only available in
\fBsudo\fR
versions
1.7.0 and higher.
Negated
-\fRsudoRunAsGroup\fR
+\fIsudoRunAsGroup\fR
entries are only supported by version 1.8.26 or higher.
.TP 6n
\fBsudoNotBefore\fR
A timestamp in the form
-\fRyyyymmddHHMMSSZ\fR
+\(oqyyyymmddHHMMSSZ\(cq
that can be used to provide a start date/time for when the
-\fRsudoRole\fR
+\fIsudoRole\fR
will be valid.
If multiple
-\fRsudoNotBefore\fR
+\fIsudoNotBefore\fR
entries are present, the earliest is used.
Timestamps must be in Coordinated Universal Time (UTC),
not the local timezone.
@@ -294,7 +293,7 @@ The minute and seconds portions are optional, but some LDAP servers
require that they be present (contrary to the RFC).
.sp
The
-\fRsudoNotBefore\fR
+\fIsudoNotBefore\fR
attribute is only available in
\fBsudo\fR
versions 1.7.5 and higher and must be explicitly enabled via the
@@ -304,12 +303,12 @@ option in
.TP 6n
\fBsudoNotAfter\fR
A timestamp in the form
-\fRyyyymmddHHMMSSZ\fR
+\(oqyyyymmddHHMMSSZ\(cq
that indicates an expiration date/time, after which the
-\fRsudoRole\fR
+\fIsudoRole\fR
will no longer be valid.
If multiple
-\fRsudoNotAfter\fR
+\fIsudoNotAfter\fR
entries are present, the last one is used.
Timestamps must be in Coordinated Universal Time (UTC),
not the local timezone.
@@ -317,7 +316,7 @@ The minute and seconds portions are optional, but some LDAP servers
require that they be present (contrary to the RFC).
.sp
The
-\fRsudoNotAfter\fR
+\fIsudoNotAfter\fR
attribute is only available in
\fBsudo\fR
versions
@@ -328,26 +327,26 @@ option in
.TP 6n
\fBsudoOrder\fR
The
-\fRsudoRole\fR
+\fIsudoRole\fR
entries retrieved from the LDAP directory have no inherent order.
The
-\fRsudoOrder\fR
+\fIsudoOrder\fR
attribute is an integer (or floating point value for LDAP servers
that support it) that is used to sort the matching entries.
This allows LDAP-based sudoers entries to more closely mimic the behavior
of the sudoers file, where the order of the entries influences the result.
If multiple entries match, the entry with the highest
-\fRsudoOrder\fR
+\fIsudoOrder\fR
attribute is chosen.
This corresponds to the
\(lqlast match\(rq
behavior of the sudoers file.
If the
-\fRsudoOrder\fR
+\fIsudoOrder\fR
attribute is not present, a value of 0 is assumed.
.sp
The
-\fRsudoOrder\fR
+\fIsudoOrder\fR
attribute is only available in
\fBsudo\fR
versions 1.7.5 and higher.
@@ -355,12 +354,12 @@ versions 1.7.5 and higher.
Each attribute listed above should contain a single value, but there
may be multiple instances of each attribute type.
A
-\fRsudoRole\fR
+\fIsudoRole\fR
must contain at least one
-\fRsudoUser\fR,
-\fRsudoHost\fR,
+\fIsudoUser\fR,
+\fIsudoHost\fR,
and
-\fRsudoCommand\fR.
+\fIsudoCommand\fR.
.PP
The following example allows users in group wheel to run any command
on any host via
@@ -384,7 +383,7 @@ The first query is to parse the global options.
The second is to match against the user's name and the groups that
the user belongs to.
(The special
-\fRALL\fR
+\fBALL\fR
tag is matched in this query too.)
If no match is returned for the user's name and groups, a third
query returns all entries containing user netgroups and other
@@ -411,12 +410,12 @@ are as follows:
.TP 5n
1.\&
Match all
-\fRnisNetgroup\fR
+\fInisNetgroup\fR
records with a
-\fRnisNetgroupTriple\fR
+\fInisNetgroupTriple\fR
containing the user, host, and NIS domain.
The query will match
-\fRnisNetgroupTriple\fR
+\fInisNetgroupTriple\fR
entries with either the short or long form of the host name or
no host name specified in the tuple.
If the NIS domain is set, the query will match only match entries
@@ -425,13 +424,13 @@ If the NIS domain is
\fInot\fR
set, a wildcard is used to match any domain name but be aware that the
NIS schema used by some LDAP servers may not support wild cards for
-\fRnisNetgroupTriple\fR.
+\fInisNetgroupTriple\fR.
.TP 5n
2.\&
Repeated queries are performed to find any nested
-\fRnisNetgroup\fR
+\fInisNetgroup\fR
records with a
-\fRmemberNisNetgroup\fR
+\fImemberNisNetgroup\fR
entry that refers to an already-matched record.
.PP
For sites with a large number of netgroups, using
@@ -465,7 +464,7 @@ returned in any specific order.
.PP
The order in which different entries are applied can be controlled
using the
-\fRsudoOrder\fR
+\fIsudoOrder\fR
attribute, but there is no way to guarantee the order of attributes
within a specific entry.
If there are conflicting command rules in an entry, the negative
@@ -519,18 +518,18 @@ These cannot be converted automatically.
For example, a Cmnd_Alias in a
\fIsudoers\fR
file may be converted to a
-\fRsudoRole\fR
+\fIsudoRole\fR
that contains multiple commands.
Multiple users and/or groups may be assigned to the
-\fRsudoRole\fR.
+\fIsudoRole\fR.
.PP
Also, host, user, runas, and command-based
-\fRDefaults\fR
+\fIDefaults\fR
entries are not supported.
However, a
-\fRsudoRole\fR
+\fIsudoRole\fR
may contain one or more
-\fRsudoOption\fR
+\fIsudoOption\fR
attributes which can often serve the same purpose.
.PP
Consider the following
@@ -590,7 +589,7 @@ Using a Unix group or netgroup in PAGERS rather than listing each
user would make this easier to maintain.
.PP
Per-user
-\fRDefaults\fR
+\fIDefaults\fR
entries can be emulated by using one or more sudoOption attributes
in a sudoRole.
Consider the following
@@ -637,7 +636,7 @@ LDAP support, the
schema must be
installed on your LDAP server.
In addition, be sure to index the
-\fRsudoUser\fR
+\fIsudoUser\fR
attribute.
.PP
The
@@ -797,53 +796,51 @@ The default value is protocol version 3.
\fBNETGROUP_BASE\fR \fIbase\fR
The base DN to use when performing LDAP netgroup queries.
Typically this is of the form
-\fRou=netgroup,dc=my-domain,dc=com\fR
-for the domain
-\fRmy-domain.com\fR.
+\(oqou=netgroup,dc=my-domain,dc=com\(cq
+for the domain my-domain.com.
Multiple
\fBNETGROUP_BASE\fR
lines may be specified, in which case they are queried in the order specified.
.sp
This option can be used to query a user's netgroups directly via LDAP
which is usually faster than fetching every
-\fRsudoRole\fR
+\fIsudoRole\fR
object containing a
-\fRsudoUser\fR
+\fIsudoUser\fR
that begins with a
\(oq+\(cq
prefix.
The NIS schema used by some LDAP servers need a modification to
support querying the
-\fRnisNetgroup\fR
+\fInisNetgroup\fR
object by its
-\fRnisNetgroupTriple\fR
+\fInisNetgroupTriple\fR
member.
OpenLDAP's
\fBslapd\fR
requires the following change to the
-\fRnisNetgroupTriple\fR
+\fInisNetgroupTriple\fR
attribute:
.nf
.sp
.RS 10n
attributetype ( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple'
- DESC 'Netgroup triple'
- EQUALITY caseIgnoreIA5Match
- SUBSTR caseIgnoreIA5SubstringsMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ DESC 'Netgroup triple'
+ EQUALITY caseIgnoreIA5Match
+ SUBSTR caseIgnoreIA5SubstringsMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
.RE
.fi
.TP 6n
\fBNETGROUP_SEARCH_FILTER\fR \fIldap_filter\fR
An LDAP filter which is used to restrict the set of records returned
when performing an LDAP netgroup query.
-Typically, this is of the
-form
-\fRattribute=value\fR
+Typically, this is of the form
+\(oqattribute=value\(cq
or
-\fR(&(attribute=value)(attribute2=value2))\fR.
+\(oq(&(attribute=value)(attribute2=value2))\(cq.
The default search filter is:
-\fRobjectClass=nisNetgroup\fR.
+\(oqobjectClass=nisNetgroup\(cq.
If
\fIldap_filter\fR
is omitted, no search filter will be used.
@@ -928,10 +925,10 @@ This option is only relevant when using SASL authentication.
If the
\fBSSL\fR
parameter is set to
-\fRon\fR,
-\fRtrue\fR,
+\fIon\fR,
+\fItrue\fR,
or
-\fRyes\fR
+\fIyes\fR
TLS (SSL) encryption is always used when communicating with the LDAP server.
Typically, this involves connecting to the server on port 636 (ldaps).
.TP 6n
@@ -939,7 +936,7 @@ Typically, this involves connecting to the server on port 636 (ldaps).
If the
\fBSSL\fR
parameter is set to
-\fRstart_tls\fR,
+\fIstart_tls\fR,
the LDAP server connection is initiated normally and TLS encryption is
begun before the bind credentials are sent.
This has the advantage of not requiring a dedicated port for encrypted
@@ -953,9 +950,8 @@ The base DN to use when performing
\fBsudo\fR
LDAP queries.
Typically this is of the form
-\fRou=SUDOers,dc=my-domain,dc=com\fR
-for the domain
-\fRmy-domain.com\fR.
+\(oqou=SUDOers,dc=my-domain,dc=com\(cq
+for the domain my-domain.com.
Multiple
\fBSUDOERS_BASE\fR
lines may be specified, in which case they are queried in the order specified.
@@ -997,20 +993,20 @@ when performing a
LDAP query.
Typically, this is of the
form
-\fRattribute=value\fR
+\(oqattribute=value\(cq
or
-\fR(&(attribute=value)(attribute2=value2))\fR.
+\(oq(&(attribute=value)(attribute2=value2))\(cq.
The default search filter is:
-\fRobjectClass=sudoRole\fR.
+\(oqobjectClass=sudoRole\(cq.
If
\fIldap_filter\fR
is omitted, no search filter will be used.
.TP 6n
\fBSUDOERS_TIMED\fR \fIon/true/yes/off/false/no\fR
Whether or not to evaluate the
-\fRsudoNotBefore\fR
+\fIsudoNotBefore\fR
and
-\fRsudoNotAfter\fR
+\fIsudoNotAfter\fR
attributes that implement time-dependent sudoers entries.
.TP 6n
\fBTIMELIMIT\fR \fIseconds\fR
@@ -1062,11 +1058,11 @@ The certificate type depends on the LDAP libraries used.
.PD 0
.TP 6n
OpenLDAP:
-\fRtls_cert /etc/ssl/client_cert.pem\fR
+\(oqtls_cert /etc/ssl/client_cert.pem\(cq
.PD
.TP 6n
Netscape-derived:
-\fRtls_cert /var/ldap/cert7.db\fR
+\(oqtls_cert /var/ldap/cert7.db\(cq
.TP 6n
IBM LDAP:
Unused, the key database specified by
@@ -1106,14 +1102,14 @@ The key type depends on the LDAP libraries used.
.PD 0
.TP 6n
OpenLDAP:
-\fRtls_key /etc/ssl/client_key.pem\fR
+\(oqtls_key /etc/ssl/client_key.pem\(cq
.PD
.TP 6n
Netscape-derived:
-\fRtls_key /var/ldap/key3.db\fR
+\(oqtls_key /var/ldap/key3.db\(cq
.TP 6n
IBM LDAP:
-\fRtls_key /usr/ldap/ldapkey.kdb\fR
+\(oqtls_key /usr/ldap/ldapkey.kdb\(cq
.PP
When using IBM LDAP libraries, this file may also contain
Certificate Authority and client certificates and may be encrypted.
@@ -1171,15 +1167,15 @@ The
must have the same path as the file specified by
\fBTLS_KEY\fR,
but use a
-\fR.sth\fR
+\(oq.sth\(cq
file extension instead of
-\fR.kdb\fR,
-e.g.,
-\fRldapkey.sth\fR.
+\(oq.kdb\(cq,
+for example
+\(oqldapkey.sth\(cq.
The default
-\fRldapkey.kdb\fR
+\(oqldapkey.kdb\(cq
that ships with the IBM Tivoli Directory Server is encrypted with the password
-\fRssl_password\fR.
+\(oqssl_password\(cq.
The
\fIgsk8capicmd\fR
utility can be used to manage the key database and create a
@@ -1251,9 +1247,9 @@ the latter being for servers that support TLS (SSL) encryption.
If no
\fIport\fR
is specified, the default is port 389 for
-\fRldap://\fR
+\(oqldap://\(cq
or port 636 for
-\fRldaps://\fR.
+\(oqldaps://\(cq.
If no
\fIhostname\fR
is specified,
@@ -1266,9 +1262,9 @@ lines are treated identically to a
\fBURI\fR
line containing multiple entries.
Only systems using the OpenSSL libraries support the mixing of
-\fRldap://\fR
+\(oqldap://\(cq
and
-\fRldaps://\fR
+\(oqldaps://\(cq
URIs.
Both the Netscape-derived and IBM LDAP libraries used on most commercial
versions of Unix are only capable of supporting one or the other.
@@ -1297,13 +1293,13 @@ to specify the
\fIsudoers\fR
search order.
Sudo looks for a line beginning with
-\fRsudoers\fR:
+\fIsudoers\fR:
and uses this to determine the search order.
By default,
\fBsudo\fR
does not stop searching after the first match and later matches take
precedence over earlier ones (unless
-\fR[SUCCESS=return]\fR
+\(oq[SUCCESS=return]\(cq
is used, see below).
The following sources are recognized:
.PP
@@ -1322,14 +1318,14 @@ read sudoers from LDAP
In addition, a subset of
\fInsswitch.conf\fR-style
action statements is supported, specifically
-\fR[SUCCESS=return]\fR
+\(oq[SUCCESS=return]\(cq
and
-\fR[NOTFOUND=return]\fR.
+\(oq[NOTFOUND=return]\(cq.
These will unconditionally terminate the search if the user was either
found
-(\fR[SUCCESS=return]\fR)
+\(oq[SUCCESS=return]\(cq
or not found
-(\fR[NOTFOUND=return]\fR)
+\(oq[NOTFOUND=return]\(cq
in the immediately preceding source.
Other action statements tokens are not supported, nor is test
negation with
@@ -1420,11 +1416,11 @@ sudoers = ldap = auth, files
.fi
.PP
In the above example, the
-\fRauth\fR
+\fIauth\fR
qualifier only affects user lookups; both LDAP and
\fIsudoers\fR
will be queried for
-\fRDefaults\fR
+\fIDefaults\fR
entries.
.PP
If the
@@ -1449,9 +1445,9 @@ rules.
To use SSSD as the
\fIsudoers\fR
source, you should use
-\fRsss\fR
+\fIsss\fR
instead of
-\fRldap\fR
+\fIldap\fR
for the sudoers entry in
\fI@nsswitch_conf@\fR.
The
@@ -1595,7 +1591,7 @@ Simply copy
it to the schema directory (e.g.,
\fI/etc/openldap/schema\fR),
add the proper
-\fRinclude\fR
+\fIinclude\fR
line in
\fIslapd.conf\fR
and restart
@@ -1610,9 +1606,9 @@ file instead.
attributetype ( 1.3.6.1.4.1.15953.9.1.1
NAME 'sudoUser'
DESC 'User(s) who may run sudo'
- EQUALITY caseExactIA5Match
- SUBSTR caseExactIA5SubstringsMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SUBSTR caseExactSubstringsMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.2
NAME 'sudoHost'
@@ -1642,14 +1638,14 @@ attributetype ( 1.3.6.1.4.1.15953.9.1.5
attributetype ( 1.3.6.1.4.1.15953.9.1.6
NAME 'sudoRunAsUser'
DESC 'User(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.7
NAME 'sudoRunAsGroup'
DESC 'Group(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.8
NAME 'sudoNotBefore'
@@ -1666,11 +1662,11 @@ attributetype ( 1.3.6.1.4.1.15953.9.1.9
SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
attributetype ( 1.3.6.1.4.1.15953.9.1.10
- NAME 'sudoOrder'
- DESC 'an integer to order the sudoRole entries'
- EQUALITY integerMatch
- ORDERING integerOrderingMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
+ NAME 'sudoOrder'
+ DESC 'an integer to order the sudoRole entries'
+ EQUALITY integerMatch
+ ORDERING integerOrderingMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL
DESC 'Sudoer Entries'
diff --git a/docs/sudoers.ldap.mdoc.in b/docs/sudoers.ldap.mdoc.in
index e967f06c3..39230c243 100644
--- a/docs/sudoers.ldap.mdoc.in
+++ b/docs/sudoers.ldap.mdoc.in
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd February 16, 2022
+.Dd September 13, 2022
.Dt SUDOERS.LDAP @mansectform@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -67,16 +67,16 @@ is no need for a specialized tool to check syntax.
The
.Em sudoers
configuration is contained in the
-.Li ou=SUDOers
+.Ql ou=SUDOers
LDAP container.
.Pp
Sudo first looks for the
-.Li cn=defaults
+.Ql cn=defaults
entry in the SUDOers container.
If found, the multi-valued
-.Li sudoOption
+.Em sudoOption
attribute is parsed in the same manner as a global
-.Li Defaults
+.Em Defaults
line in
.Pa @sysconfdir@/sudoers .
In the following example, the
@@ -92,7 +92,7 @@ sudoOption: env_keep+=SSH_AUTH_SOCK
.Ed
.Pp
The equivalent of a sudoer in LDAP is a
-.Li sudoRole .
+.Em sudoRole .
It consists of the following attributes:
.Bl -tag -width 4n
.It Sy sudoUser
@@ -115,35 +115,35 @@ Non-Unix group support is only available when an appropriate
.Em group_plugin
is defined in the global
.Em defaults
-.Li sudoRole
+.Em sudoRole
object.
If a
-.Li sudoUser
+.Em sudoUser
entry is preceded by an exclamation point,
.Ql \&! ,
and the entry matches, the
-.Li sudoRole
+.Em sudoRole
in which it resides will be ignored.
Negated
-.Li sudoUser
+.Em sudoUser
entries are only supported by version 1.9.9 or higher.
.It Sy sudoHost
A host name, IP address, IP network, or host netgroup (prefixed with a
.Ql + ) .
The special value
-.Li ALL
+.Sy ALL
will match any host.
Host netgroups are matched using the host (both qualified and unqualified)
and domain members only; the user member is not used when matching.
If a
-.Li sudoHost
+.Em sudoHost
entry is preceded by an exclamation point,
.Ql \&! ,
and the entry matches, the
-.Li sudoRole
+.Em sudoRole
in which it resides will be ignored.
Negated
-.Li sudoHost
+.Em sudoHost
entries are only supported by version 1.8.18 or higher.
.It Sy sudoCommand
A fully-qualified Unix command name with optional command line arguments,
@@ -153,7 +153,7 @@ If a command name is preceded by an exclamation point,
the user will be prohibited from running that command.
.Pp
The built-in command
-.Dq Li sudoedit
+.Dq sudoedit
is used to permit a user to run
.Nm sudo
with the
@@ -162,13 +162,13 @@ option (or as
.Nm sudoedit ) .
It may take command line arguments just as a normal command does.
Unlike other commands,
-.Dq Li sudoedit
+.Dq sudoedit
is a built into
.Nm sudo
itself and must be specified in without a leading path.
.Pp
The special value
-.Li ALL
+.Sy ALL
will match any command.
.Pp
If a command name is prefixed with a SHA-2 digest, it will
@@ -192,7 +192,7 @@ Command digests are only supported by version 1.8.7 or higher.
.It Sy sudoOption
Identical in function to the global options described above, but
specific to the
-.Li sudoRole
+.Em sudoRole
in which it resides.
.It Sy sudoRunAsUser
A user name or user-ID (prefixed with
@@ -203,30 +203,29 @@ or user netgroup (prefixed with a
.Ql + )
that contains a list of users that commands may be run as.
The special value
-.Li ALL
+.Sy ALL
will match any user.
If a
-.Li sudoRunAsUser
+.Em sudoRunAsUser
entry is preceded by an exclamation point,
.Ql \&! ,
and the entry matches, the
-.Li sudoRole
+.Em sudoRole
in which it resides will be ignored.
If
-.Li sudoRunAsUser
+.Em sudoRunAsUser
is specified but empty, it will match the invoking user.
If neither
-.Li sudoRunAsUser
+.Em sudoRunAsUser
nor
-.Li sudoRunAsGroup
+.Em sudoRunAsGroup
are present, the value of the
.Em runas_default
-.Li sudoOption
-is used (defaults to
-.Li @runas_default@ ) .
+.Em sudoOption
+is used (defaults to @runas_default@).
.Pp
The
-.Li sudoRunAsUser
+.Em sudoRunAsUser
attribute is only available in
.Nm sudo
versions
@@ -234,43 +233,43 @@ versions
Older versions of
.Nm sudo
use the
-.Li sudoRunAs
+.Em sudoRunAs
attribute instead.
Negated
-.Li sudoRunAsUser
+.Em sudoRunAsUser
entries are only supported by version 1.8.26 or higher.
.It Sy sudoRunAsGroup
A Unix group or group-ID (prefixed with
.Ql # )
that commands may be run as.
The special value
-.Li ALL
+.Sy ALL
will match any group.
If a
-.Li sudoRunAsGroup
+.Em sudoRunAsGroup
entry is preceded by an exclamation point,
.Ql \&! ,
and the entry matches, the
-.Li sudoRole
+.Em sudoRole
in which it resides will be ignored.
.Pp
The
-.Li sudoRunAsGroup
+.Em sudoRunAsGroup
attribute is only available in
.Nm sudo
versions
1.7.0 and higher.
Negated
-.Li sudoRunAsGroup
+.Em sudoRunAsGroup
entries are only supported by version 1.8.26 or higher.
.It Sy sudoNotBefore
A timestamp in the form
-.Li yyyymmddHHMMSSZ
+.Ql yyyymmddHHMMSSZ
that can be used to provide a start date/time for when the
-.Li sudoRole
+.Em sudoRole
will be valid.
If multiple
-.Li sudoNotBefore
+.Em sudoNotBefore
entries are present, the earliest is used.
Timestamps must be in Coordinated Universal Time (UTC),
not the local timezone.
@@ -278,7 +277,7 @@ The minute and seconds portions are optional, but some LDAP servers
require that they be present (contrary to the RFC).
.Pp
The
-.Li sudoNotBefore
+.Em sudoNotBefore
attribute is only available in
.Nm sudo
versions 1.7.5 and higher and must be explicitly enabled via the
@@ -287,12 +286,12 @@ option in
.Pa @ldap_conf@ .
.It Sy sudoNotAfter
A timestamp in the form
-.Li yyyymmddHHMMSSZ
+.Ql yyyymmddHHMMSSZ
that indicates an expiration date/time, after which the
-.Li sudoRole
+.Em sudoRole
will no longer be valid.
If multiple
-.Li sudoNotAfter
+.Em sudoNotAfter
entries are present, the last one is used.
Timestamps must be in Coordinated Universal Time (UTC),
not the local timezone.
@@ -300,7 +299,7 @@ The minute and seconds portions are optional, but some LDAP servers
require that they be present (contrary to the RFC).
.Pp
The
-.Li sudoNotAfter
+.Em sudoNotAfter
attribute is only available in
.Nm sudo
versions
@@ -310,26 +309,26 @@ option in
.Pa @ldap_conf@ .
.It Sy sudoOrder
The
-.Li sudoRole
+.Em sudoRole
entries retrieved from the LDAP directory have no inherent order.
The
-.Li sudoOrder
+.Em sudoOrder
attribute is an integer (or floating point value for LDAP servers
that support it) that is used to sort the matching entries.
This allows LDAP-based sudoers entries to more closely mimic the behavior
of the sudoers file, where the order of the entries influences the result.
If multiple entries match, the entry with the highest
-.Li sudoOrder
+.Em sudoOrder
attribute is chosen.
This corresponds to the
.Dq last match
behavior of the sudoers file.
If the
-.Li sudoOrder
+.Em sudoOrder
attribute is not present, a value of 0 is assumed.
.Pp
The
-.Li sudoOrder
+.Em sudoOrder
attribute is only available in
.Nm sudo
versions 1.7.5 and higher.
@@ -338,12 +337,12 @@ versions 1.7.5 and higher.
Each attribute listed above should contain a single value, but there
may be multiple instances of each attribute type.
A
-.Li sudoRole
+.Em sudoRole
must contain at least one
-.Li sudoUser ,
-.Li sudoHost ,
+.Em sudoUser ,
+.Em sudoHost ,
and
-.Li sudoCommand .
+.Em sudoCommand .
.Pp
The following example allows users in group wheel to run any command
on any host via
@@ -364,7 +363,7 @@ The first query is to parse the global options.
The second is to match against the user's name and the groups that
the user belongs to.
(The special
-.Li ALL
+.Sy ALL
tag is matched in this query too.)
If no match is returned for the user's name and groups, a third
query returns all entries containing user netgroups and other
@@ -391,12 +390,12 @@ are as follows:
.Bl -enum
.It
Match all
-.Li nisNetgroup
+.Em nisNetgroup
records with a
-.Li nisNetgroupTriple
+.Em nisNetgroupTriple
containing the user, host, and NIS domain.
The query will match
-.Li nisNetgroupTriple
+.Em nisNetgroupTriple
entries with either the short or long form of the host name or
no host name specified in the tuple.
If the NIS domain is set, the query will match only match entries
@@ -405,12 +404,12 @@ If the NIS domain is
.Em not
set, a wildcard is used to match any domain name but be aware that the
NIS schema used by some LDAP servers may not support wild cards for
-.Li nisNetgroupTriple .
+.Em nisNetgroupTriple .
.It
Repeated queries are performed to find any nested
-.Li nisNetgroup
+.Em nisNetgroup
records with a
-.Li memberNisNetgroup
+.Em memberNisNetgroup
entry that refers to an already-matched record.
.El
.Pp
@@ -445,7 +444,7 @@ returned in any specific order.
.Pp
The order in which different entries are applied can be controlled
using the
-.Li sudoOrder
+.Em sudoOrder
attribute, but there is no way to guarantee the order of attributes
within a specific entry.
If there are conflicting command rules in an entry, the negative
@@ -496,18 +495,18 @@ These cannot be converted automatically.
For example, a Cmnd_Alias in a
.Em sudoers
file may be converted to a
-.Li sudoRole
+.Em sudoRole
that contains multiple commands.
Multiple users and/or groups may be assigned to the
-.Li sudoRole .
+.Em sudoRole .
.Pp
Also, host, user, runas, and command-based
-.Li Defaults
+.Em Defaults
entries are not supported.
However, a
-.Li sudoRole
+.Em sudoRole
may contain one or more
-.Li sudoOption
+.Em sudoOption
attributes which can often serve the same purpose.
.Pp
Consider the following
@@ -561,7 +560,7 @@ Using a Unix group or netgroup in PAGERS rather than listing each
user would make this easier to maintain.
.Pp
Per-user
-.Li Defaults
+.Em Defaults
entries can be emulated by using one or more sudoOption attributes
in a sudoRole.
Consider the following
@@ -602,7 +601,7 @@ LDAP support, the
schema must be
installed on your LDAP server.
In addition, be sure to index the
-.Li sudoUser
+.Em sudoUser
attribute.
.Pp
The
@@ -748,49 +747,47 @@ The default value is protocol version 3.
.It Sy NETGROUP_BASE Ar base
The base DN to use when performing LDAP netgroup queries.
Typically this is of the form
-.Li ou=netgroup,dc=my-domain,dc=com
-for the domain
-.Li my-domain.com .
+.Ql ou=netgroup,dc=my-domain,dc=com
+for the domain my-domain.com.
Multiple
.Sy NETGROUP_BASE
lines may be specified, in which case they are queried in the order specified.
.Pp
This option can be used to query a user's netgroups directly via LDAP
which is usually faster than fetching every
-.Li sudoRole
+.Em sudoRole
object containing a
-.Li sudoUser
+.Em sudoUser
that begins with a
.Ql +
prefix.
The NIS schema used by some LDAP servers need a modification to
support querying the
-.Li nisNetgroup
+.Em nisNetgroup
object by its
-.Li nisNetgroupTriple
+.Em nisNetgroupTriple
member.
OpenLDAP's
.Sy slapd
requires the following change to the
-.Li nisNetgroupTriple
+.Em nisNetgroupTriple
attribute:
.Bd -literal -offset 4n
attributetype ( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple'
- DESC 'Netgroup triple'
- EQUALITY caseIgnoreIA5Match
- SUBSTR caseIgnoreIA5SubstringsMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ DESC 'Netgroup triple'
+ EQUALITY caseIgnoreIA5Match
+ SUBSTR caseIgnoreIA5SubstringsMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
.Ed
.It Sy NETGROUP_SEARCH_FILTER Ar ldap_filter
An LDAP filter which is used to restrict the set of records returned
when performing an LDAP netgroup query.
-Typically, this is of the
-form
-.Li attribute=value
+Typically, this is of the form
+.Ql attribute=value
or
-.Li (&(attribute=value)(attribute2=value2)) .
+.Ql (&(attribute=value)(attribute2=value2)) .
The default search filter is:
-.Li objectClass=nisNetgroup .
+.Ql objectClass=nisNetgroup .
If
.Ar ldap_filter
is omitted, no search filter will be used.
@@ -867,17 +864,17 @@ This option is only relevant when using SASL authentication.
If the
.Sy SSL
parameter is set to
-.Li on ,
-.Li true ,
+.Em on ,
+.Em true ,
or
-.Li yes
+.Em yes
TLS (SSL) encryption is always used when communicating with the LDAP server.
Typically, this involves connecting to the server on port 636 (ldaps).
.It Sy SSL Ar start_tls
If the
.Sy SSL
parameter is set to
-.Li start_tls ,
+.Em start_tls ,
the LDAP server connection is initiated normally and TLS encryption is
begun before the bind credentials are sent.
This has the advantage of not requiring a dedicated port for encrypted
@@ -890,9 +887,8 @@ The base DN to use when performing
.Nm sudo
LDAP queries.
Typically this is of the form
-.Li ou=SUDOers,dc=my-domain,dc=com
-for the domain
-.Li my-domain.com .
+.Ql ou=SUDOers,dc=my-domain,dc=com
+for the domain my-domain.com.
Multiple
.Sy SUDOERS_BASE
lines may be specified, in which case they are queried in the order specified.
@@ -932,19 +928,19 @@ when performing a
LDAP query.
Typically, this is of the
form
-.Li attribute=value
+.Ql attribute=value
or
-.Li (&(attribute=value)(attribute2=value2)) .
+.Ql (&(attribute=value)(attribute2=value2)) .
The default search filter is:
-.Li objectClass=sudoRole .
+.Ql objectClass=sudoRole .
If
.Ar ldap_filter
is omitted, no search filter will be used.
.It Sy SUDOERS_TIMED Ar on/true/yes/off/false/no
Whether or not to evaluate the
-.Li sudoNotBefore
+.Em sudoNotBefore
and
-.Li sudoNotAfter
+.Em sudoNotAfter
attributes that implement time-dependent sudoers entries.
.It Sy TIMELIMIT Ar seconds
The
@@ -987,9 +983,9 @@ be used to authenticate the client to the LDAP server.
The certificate type depends on the LDAP libraries used.
.Bl -tag -width 4n
.It OpenLDAP:
-.Li tls_cert /etc/ssl/client_cert.pem
+.Ql tls_cert /etc/ssl/client_cert.pem
.It Netscape-derived:
-.Li tls_cert /var/ldap/cert7.db
+.Ql tls_cert /var/ldap/cert7.db
.It IBM LDAP:
Unused, the key database specified by
.Sy TLS_KEY
@@ -1023,11 +1019,11 @@ The private key must not be password-protected.
The key type depends on the LDAP libraries used.
.Bl -tag -width 4n
.It OpenLDAP:
-.Li tls_key /etc/ssl/client_key.pem
+.Ql tls_key /etc/ssl/client_key.pem
.It Netscape-derived:
-.Li tls_key /var/ldap/key3.db
+.Ql tls_key /var/ldap/key3.db
.It IBM LDAP:
-.Li tls_key /usr/ldap/ldapkey.kdb
+.Ql tls_key /usr/ldap/ldapkey.kdb
.El
.Pp
When using IBM LDAP libraries, this file may also contain
@@ -1079,15 +1075,15 @@ The
must have the same path as the file specified by
.Sy TLS_KEY ,
but use a
-.Li .sth
+.Ql .sth
file extension instead of
-.Li .kdb ,
-e.g.,
-.Li ldapkey.sth .
+.Ql .kdb ,
+for example
+.Ql ldapkey.sth .
The default
-.Li ldapkey.kdb
+.Ql ldapkey.kdb
that ships with the IBM Tivoli Directory Server is encrypted with the password
-.Li ssl_password .
+.Ql ssl_password .
The
.Em gsk8capicmd
utility can be used to manage the key database and create a
@@ -1149,9 +1145,9 @@ the latter being for servers that support TLS (SSL) encryption.
If no
.Em port
is specified, the default is port 389 for
-.Li ldap://
+.Ql ldap://
or port 636 for
-.Li ldaps:// .
+.Ql ldaps:// .
If no
.Em hostname
is specified,
@@ -1164,9 +1160,9 @@ lines are treated identically to a
.Sy URI
line containing multiple entries.
Only systems using the OpenSSL libraries support the mixing of
-.Li ldap://
+.Ql ldap://
and
-.Li ldaps://
+.Ql ldaps://
URIs.
Both the Netscape-derived and IBM LDAP libraries used on most commercial
versions of Unix are only capable of supporting one or the other.
@@ -1194,13 +1190,13 @@ to specify the
.Em sudoers
search order.
Sudo looks for a line beginning with
-.Li sudoers :
+.Em sudoers :
and uses this to determine the search order.
By default,
.Nm sudo
does not stop searching after the first match and later matches take
precedence over earlier ones (unless
-.Li [SUCCESS=return]
+.Ql [SUCCESS=return]
is used, see below).
The following sources are recognized:
.Pp
@@ -1215,14 +1211,14 @@ read sudoers from LDAP
In addition, a subset of
.Pa nsswitch.conf Ns -style
action statements is supported, specifically
-.Li [SUCCESS=return]
+.Ql [SUCCESS=return]
and
-.Li [NOTFOUND=return] .
+.Ql [NOTFOUND=return] .
These will unconditionally terminate the search if the user was either
found
-.Pq Li [SUCCESS=return]
+.Ql [SUCCESS=return]
or not found
-.Pq Li [NOTFOUND=return]
+.Ql [NOTFOUND=return]
in the immediately preceding source.
Other action statements tokens are not supported, nor is test
negation with
@@ -1292,11 +1288,11 @@ sudoers = ldap = auth, files
.Ed
.Pp
In the above example, the
-.Li auth
+.Em auth
qualifier only affects user lookups; both LDAP and
.Em sudoers
will be queried for
-.Li Defaults
+.Em Defaults
entries.
.Pp
If the
@@ -1318,9 +1314,9 @@ rules.
To use SSSD as the
.Em sudoers
source, you should use
-.Li sss
+.Em sss
instead of
-.Li ldap
+.Em ldap
for the sudoers entry in
.Pa @nsswitch_conf@ .
The
@@ -1461,7 +1457,7 @@ Simply copy
it to the schema directory (e.g.,
.Pa /etc/openldap/schema ) ,
add the proper
-.Li include
+.Em include
line in
.Pa slapd.conf
and restart
@@ -1474,9 +1470,9 @@ file instead.
attributetype ( 1.3.6.1.4.1.15953.9.1.1
NAME 'sudoUser'
DESC 'User(s) who may run sudo'
- EQUALITY caseExactIA5Match
- SUBSTR caseExactIA5SubstringsMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SUBSTR caseExactSubstringsMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.2
NAME 'sudoHost'
@@ -1506,14 +1502,14 @@ attributetype ( 1.3.6.1.4.1.15953.9.1.5
attributetype ( 1.3.6.1.4.1.15953.9.1.6
NAME 'sudoRunAsUser'
DESC 'User(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.7
NAME 'sudoRunAsGroup'
DESC 'Group(s) impersonated by sudo'
- EQUALITY caseExactIA5Match
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+ EQUALITY caseExactMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
attributetype ( 1.3.6.1.4.1.15953.9.1.8
NAME 'sudoNotBefore'
@@ -1530,11 +1526,11 @@ attributetype ( 1.3.6.1.4.1.15953.9.1.9
SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
attributetype ( 1.3.6.1.4.1.15953.9.1.10
- NAME 'sudoOrder'
- DESC 'an integer to order the sudoRole entries'
- EQUALITY integerMatch
- ORDERING integerOrderingMatch
- SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
+ NAME 'sudoOrder'
+ DESC 'an integer to order the sudoRole entries'
+ EQUALITY integerMatch
+ ORDERING integerOrderingMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL
DESC 'Sudoer Entries'
diff --git a/docs/sudoers.man.in b/docs/sudoers.man.in
index 5f73f7ca2..dec073b31 100644
--- a/docs/sudoers.man.in
+++ b/docs/sudoers.man.in
@@ -25,7 +25,7 @@
.nr BA @BAMAN@
.nr LC @LCMAN@
.nr PS @PSMAN@
-.TH "SUDOERS" "@mansectform@" "May 31, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDOERS" "@mansectform@" "October 20, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -60,7 +60,7 @@ file to determine which plugins to load.
If no
sudo.conf(@mansectform@)
file is present, or if it contains no
-\fRPlugin\fR
+\fIPlugin\fR
lines,
\fBsudoers\fR
will be used for auditing, policy decisions and I/O logging.
@@ -179,16 +179,19 @@ security policy requires that most users authenticate
themselves before they can use
\fBsudo\fR.
A password is not required
-if the invoking user is root, if the target user is the same as the
-invoking user, or if the policy has disabled authentication for the
-user or command.
+if the invoking user is
+\fBroot\fR,
+if the target user is the same as the invoking user, or if the
+policy has disabled authentication for the user or command.
Unlike
su(1),
when
\fBsudoers\fR
requires
authentication, it validates the invoking user's credentials, not
-the target user's (or root's) credentials.
+the target user's (or
+\fB@runas_default@\fR's)
+credentials.
This can be changed via
the
\fIrootpw\fR,
@@ -206,7 +209,7 @@ used for such mail is configurable via the
\fImailto\fR
Defaults entry
(described later) and defaults to
-\fR@mailto@\fR.
+\fI@mailto@\fR.
.PP
No mail will be sent if an unauthorized user tries to run
\fBsudo\fR
@@ -230,7 +233,9 @@ are logged, regardless of whether or not mail is sent.
.PP
If
\fBsudo\fR
-is run by root and the
+is run by
+\fBroot\fR
+and the
\fRSUDO_USER\fR
environment variable
is set, the
@@ -238,7 +243,9 @@ is set, the
policy will use this value to determine who
the actual user is.
This can be used by a user to log commands
-through sudo even when a root shell has been invoked.
+through sudo even when a
+\fBroot\fR
+shell has been invoked.
It also
allows the
\fB\-e\fR
@@ -246,7 +253,9 @@ option to remain useful even when invoked via a
sudo-run script or program.
Note, however, that the
\fIsudoers\fR
-file lookup is still done for root, not the user specified by
+file lookup is still done for
+\fBroot\fR,
+not the user specified by
\fRSUDO_USER\fR.
.PP
\fBsudoers\fR
@@ -258,12 +267,10 @@ terminal session ID, the start time of the session leader
(using a monotonic clock if one is available).
The user may then use
\fBsudo\fR
-without a password for a short period of time
-(\fR@timeout@\fR
-minutes unless overridden by the
+without a password for a short period of time (@timeout@ minutes
+unless overridden by the
\fItimestamp_timeout\fR
-option)
-\&.
+option).
By default,
\fBsudoers\fR
uses a separate record for each terminal, which means that
@@ -294,27 +301,17 @@ and
\fIlogfile\fR
settings.
See
-\fILOG FORMAT\fR
+\fIEVENT LOGGING\fR
for a description of the log file format.
.PP
\fBsudoers\fR
-is also capable of running a command in a pseudo-terminal and logging all
+is also capable of running a command in a pseudo-terminal and logging
input and/or output.
The standard input, standard output, and standard error can be logged
even when not associated with a terminal.
-I/O logging is not on by default but can be enabled using
-the
-\fIlog_input\fR
-and
-\fIlog_output\fR
-options as well as the
-\fRLOG_INPUT\fR
-and
-\fRLOG_OUTPUT\fR
-command tags.
-See
-\fII/O LOG FILES\fR
-for details on how I/O log files are stored.
+For more information about I/O logging, see the
+\fII/O LOGGING\fR
+section.
.PP
Starting with version 1.9, the
\fIlog_servers\fR
@@ -400,7 +397,7 @@ This avoids an inconsistent environment where one of the variables
describing the user name is set to the invoking user and one is
set to the target user.
Environment variables with a value beginning with
-\fR()\fR
+\(oq()\(cq
are removed unless both the name and value parts are matched by
\fIenv_keep\fR
or
@@ -420,7 +417,7 @@ and
options are allowed and their values are
inherited from the invoking process.
Prior to version 1.8.21, environment variables with a value beginning with
-\fR()\fR
+\(oq()\(cq
were always removed.
Beginning with version 1.8.21, a pattern in
\fIenv_delete\fR
@@ -458,7 +455,7 @@ env_keep += "BASH_FUNC_my_func%%=()*"
.fi
.PP
Without the
-\(lq\fR=()*\fR\(rq
+\(oq=()*\(cq
suffix, this would not match, as
\fBbash\fR
shell functions are not preserved by default.
@@ -468,7 +465,9 @@ as modified by global Defaults parameters in
\fIsudoers\fR,
is displayed when
\fBsudo\fR
-is run by root with the
+is run by
+\fBroot\fR
+with the
\fB\-V\fR
option.
The list of environment variables to remove
@@ -613,7 +612,7 @@ By default,
uses the operating system's native method of setting resource limits
for the target user.
On Linux systems, resource limits are usually set by the
-\fRpam_limits.so\fR
+\fIpam_limits.so\fR
PAM module.
On some BSD systems, the
\fI/etc/login.conf\fR
@@ -691,9 +690,13 @@ are only supported by version 1.8.7 or higher.
EBNF is a concise and exact way of describing the grammar of a language.
Each EBNF definition is made up of
\fIproduction rules\fR.
-E.g.,
-.PP
-\fRsymbol ::= definition\fR | \fRalternate1\fR | \fRalternate2 ...\fR
+For example:
+.nf
+.sp
+.RS 4n
+symbol ::= definition | alternate1 | alternate2 ...
+.RE
+.fi
.PP
Each
\fIproduction rule\fR
@@ -706,15 +709,15 @@ Do not, however, confuse them with
\(lqwildcard\(rq
characters, which have different meanings.
.TP 6n
-\fR\&?\fR
+\&?
Means that the preceding symbol (or group of symbols) is optional.
That is, it may appear once or not at all.
.TP 6n
-\fR*\fR
+*
Means that the preceding symbol (or group of symbols) may appear
zero or more times.
.TP 6n
-\fR+\fR
++
Means that the preceding symbol (or group of symbols) may appear
one or more times.
.PP
@@ -725,17 +728,17 @@ we will use single quotes
to designate what is a verbatim character string (as opposed to a symbol name).
.SS "Aliases"
There are four kinds of aliases:
-\fRUser_Alias\fR,
-\fRRunas_Alias\fR,
-\fRHost_Alias\fR
+\fIUser_Alias\fR,
+\fIRunas_Alias\fR,
+\fIHost_Alias\fR
and
-\fRCmnd_Alias\fR.
+\fICmnd_Alias\fR.
Beginning with
\fBsudo\fR
1.9.0,
-\fRCmd_Alias\fR
+\fICmd_Alias\fR
may be used in place of
-\fRCmnd_Alias\fR
+\fICmnd_Alias\fR
if desired.
.nf
.sp
@@ -779,11 +782,11 @@ Alias_Type NAME = item1, item2, ...
where
\fIAlias_Type\fR
is one of
-\fRUser_Alias\fR,
-\fRRunas_Alias\fR,
-\fRHost_Alias\fR,
+\fIUser_Alias\fR,
+\fIRunas_Alias\fR,
+\fIHost_Alias\fR,
or
-\fRCmnd_Alias\fR.
+\fICmnd_Alias\fR.
A
\fRNAME\fR
is a string of uppercase letters, numbers,
@@ -797,7 +800,7 @@ uppercase letter.
It is possible to put several alias definitions
of the same type on a single line, joined by a colon
(\(oq:\&\(cq).
-E.g.,
+For example:
.nf
.sp
.RS 0n
@@ -832,7 +835,7 @@ User ::= '!'* user name |
.fi
.PP
A
-\fRUser_List\fR
+\fIUser_List\fR
is made up of one or more user names, user-IDs
(prefixed with
\(oq#\(cq),
@@ -847,7 +850,7 @@ non-Unix group names and IDs (prefixed with
and
\(oq%:#\(cq
respectively), and
-\fRUser_Alias\fRes.
+\fIUser_Alias\fRes.
Each list item may be prefixed with zero or more
\(oq\&!\(cq
operators.
@@ -859,14 +862,14 @@ User netgroups are matched using the user and domain members only;
the host member is not used when matching.
.PP
A
-\fRuser name\fR,
-\fRuser-ID\fR,
-\fRgroup\fR,
-\fRgroup-ID\fR,
-\fRnetgroup\fR,
-\fRnonunix_group\fR
+\fIuser name\fR,
+\fIuser-ID\fR,
+\fIgroup\fR,
+\fIgroup-ID\fR,
+\fInetgroup\fR,
+\fInonunix_group\fR
or
-\fRnonunix_gid\fR
+\fInonunix_gid\fR
may be enclosed in double quotes to avoid the
need for escaping special characters.
Alternately, special characters
@@ -876,9 +879,9 @@ using double quotes, any prefix characters must be included inside
the quotes.
.PP
The actual
-\fRnonunix_group\fR
+\fInonunix_group\fR
and
-\fRnonunix_gid\fR
+\fInonunix_gid\fR
syntax depends on
the underlying group provider plugin.
For instance, the QAS AD plugin supports the following formats:
@@ -923,21 +926,24 @@ Runas_Member ::= '!'* user name |
.fi
.PP
A
-\fRRunas_List\fR
+\fIRunas_List\fR
is similar to a
-\fRUser_List\fR
+\fIUser_List\fR
except that instead
of
-\fRUser_Alias\fRes
+\fIUser_Alias\fRes
it can contain
-\fRRunas_Alias\fRes.
+\fIRunas_Alias\fRes.
User names and groups are matched as strings.
In other words, two users (groups) with the same user (group) ID
are considered to be distinct.
-If you wish to match all user names with the same user-ID (e.g., root and
-toor), you can use a user-ID instead of a name (#0 in the example given).
+If you wish to match all user names with the same user-ID (e.g.,
+\fBroot\fR
+and
+\fBtoor\fR),
+you can use a user-ID instead of a name (#0 in the example given).
The user-ID or group-ID specified in a
-\fRRunas_Member\fR
+\fIRunas_Member\fR
need not be listed in the password or group database.
.nf
.sp
@@ -955,7 +961,7 @@ Host ::= '!'* host name |
.fi
.PP
A
-\fRHost_List\fR
+\fIHost_List\fR
is made up of one or more host names, IP addresses,
network numbers, netgroups (prefixed with
\(oq+\(cq),
@@ -977,7 +983,7 @@ A host name may include shell-style wildcards (see the
\fIWildcards\fR
section below),
but unless the
-\fRhost name\fR
+\fIhostname\fR
command on your machine returns the fully
qualified host name, you'll need to use the
\fIfqdn\fR
@@ -1027,7 +1033,7 @@ Cmnd ::= Digest_List? '!'* command |
.fi
.PP
A
-\fRCmnd_List\fR
+\fICmnd_List\fR
is a list of one or more commands, directories, or aliases.
A command is a fully qualified file name, which may include
shell-style wildcards (see the
@@ -1044,7 +1050,7 @@ A directory is a
fully qualified path name ending in a
\(oq/\(cq.
When you specify a directory in a
-\fRCmnd_List\fR,
+\fICmnd_List\fR,
the user will be able to run any file within that directory
(but not in any sub-directories therein).
If no command line arguments are specified, the user may run the
@@ -1055,19 +1061,19 @@ expression that starts with
and ends with
\(oq$\(cq.
If the command line arguments consist of
-\fR\&""\fR,
+\(oq\&""\(cq,
the command may only be run with
\fIno\fR
arguments.
.PP
If a
-\fRCmnd\fR
+\fICmnd\fR
has associated command line arguments, the arguments
in the
-\fRCmnd\fR
+\fICmnd\fR
must match those given by the user on the command line.
If the arguments in a
-\fRCmnd\fR
+\fICmnd\fR
begin with the
\(oq^\(cq
character, they will be interpreted as a regular expression
@@ -1082,7 +1088,7 @@ if they are used in command arguments:
\(oq=\&\(cq,
\(oq\e\(cq.
To prevent arguments in a
-\fRCmnd\fR
+\fICmnd\fR
that begin with a
\(oq^\(cq
character from being interpreted as a regular expression, the
@@ -1091,7 +1097,7 @@ must be escaped with a
\(oq\e\(cq.
.PP
The built-in command
-\(lq\fRsudoedit\fR\(rq
+\(lqsudoedit\(rq
is used to permit a user to run
\fBsudo\fR
with the
@@ -1100,7 +1106,7 @@ option (or as
\fBsudoedit\fR).
It may take command line arguments just as a normal command does.
Unlike other commands,
-\(lq\fRsudoedit\fR\(rq
+\(lqsudoedit\(rq
is built into
\fBsudo\fR
itself and must be specified in the
@@ -1111,27 +1117,27 @@ a leading path.
If a leading path is present, for example
\fI/usr/bin/sudoedit\fR,
the path name will be silently converted to
-\(lq\fRsudoedit\fR\(rq.
+\(lqsudoedit\(rq.
A fully-qualified path for
\fBsudoedit\fR
is treated as an error by
\fBvisudo\fR.
.PP
A
-\fRcommand\fR
+\fIcommand\fR
may be preceded by a
-\fRDigest_List\fR,
+\fIDigest_List\fR,
a comma-separated list of one or more
-\fRDigest_Spec\fR
+\fIDigest_Spec\fR
entries.
If a
-\fRDigest_List\fR
+\fIDigest_List\fR
is present, the command will only match successfully if it can be verified
using one of the SHA-2 digests in the list.
Starting with version 1.9.0, the
\fBALL\fR
reserved word can be used in conjunction with a
-\fRDigest_List\fR.
+\fIDigest_List\fR.
The following digest formats are supported: sha224, sha256, sha384, and sha512.
The string may be specified in either hex or base64 format
(base64 is more compact).
@@ -1161,7 +1167,7 @@ Warning, if the user has write access to the command itself (directly or via a
command), it may be possible for the user to replace the command after the
digest check has been performed but before the command is executed.
A similar race condition exists on systems that lack the
-\fBfexecve\fR()
+fexecve(2)
system call when the directory in which the command is located
is writable by the user.
See the description of the
@@ -1174,13 +1180,13 @@ Command digests are only supported by version 1.8.7 or higher.
.SS "Defaults"
Certain configuration options may be changed from their default
values at run-time via one or more
-\fRDefault_Entry\fR
+\fIDefault_Entry\fR
lines.
These may affect all users on any host, all users on a specific host, a
specific user, a specific command, or commands being run as a specific user.
Per-command entries may not include command line arguments.
If you need to specify arguments, define a
-\fRCmnd_Alias\fR
+\fICmnd_Alias\fR
and reference
that instead.
.nf
@@ -1241,16 +1247,16 @@ regexec(3)
function.
.PP
Lists have two additional assignment operators,
-\fR+=\fR
+\(oq+=\(cq
and
-\fR-=\fR.
+\(oq-=\(cq.
These operators are used to add to and delete from a list respectively.
It is not an error to use the
-\fR-=\fR
+\(oq-=\(cq
operator to remove an element
that does not exist in a list.
.PP
-Defaults entries are parsed in the following order: generic, host,
+Defaults entries are parsed in the following order: global, host,
user, and runas Defaults first, then command defaults.
If there are multiple Defaults settings of the same type, the last
matching setting is used.
@@ -1316,28 +1322,30 @@ A
\fBuser specification\fR
determines which commands a user may run
(and as what user) on specified hosts.
-By default, commands are
-run as
-\fBroot\fR,
-but this can be changed on a per-command basis.
+By default, commands are run as
+\fB@runas_default@\fR
+(unless
+\fIrunas_default\fR
+has been set to a different value)
+but this can also be changed on a per-command basis.
.PP
The basic structure of a user specification is
\(lqwho where = (as_whom) what\(rq.
Let's break that down into its constituent parts:
.SS "Runas_Spec"
A
-\fRRunas_Spec\fR
+\fIRunas_Spec\fR
determines the user and/or the group that a command
may be run as.
A fully-specified
-\fRRunas_Spec\fR
+\fIRunas_Spec\fR
consists of two
-\fRRunas_List\fRs
+\fIRunas_List\fRs
(as defined above) separated by a colon
(\(oq:\&\(cq)
and enclosed in a set of parentheses.
The first
-\fRRunas_List\fR
+\fIRunas_List\fR
indicates which users the command may be run as via the
\fB\-u\fR
option.
@@ -1345,32 +1353,35 @@ The second defines a list of groups that may be specified via the
\fB\-g\fR
option (in addition to any of the target user's groups).
If both
-\fRRunas_List\fRs
+\fIRunas_List\fRs
are specified, the command may be run with any combination of users
and groups listed in their respective
-\fRRunas_List\fRs.
+\fIRunas_List\fRs.
If only the first is specified, the command may be run as any user
in the list and, optionally, with any group the target user belongs to.
If the first
-\fRRunas_List\fR
+\fIRunas_List\fR
is empty but the
second is specified, the command may be run as the invoking user
with the group set to any listed in the
-\fRRunas_List\fR.
+\fIRunas_List\fR.
If both
-\fRRunas_List\fRs
+\fIRunas_List\fRs
are empty, the command may only be run as the invoking user and the
group, if specified, must be one that the invoking user is a member of.
If no
-\fRRunas_Spec\fR
-is specified, the command may only be run as
-\fBroot\fR
-and the group, if specified, must be one that
-\fBroot\fR
-is a member of.
+\fIRunas_Spec\fR
+is specified, the command may only be run as the
+\fIrunas_default\fR
+user
+(\fB@runas_default@\fR
+by default) and the group,
+if specified, must be one that the
+\fIrunas_default\fR
+user is a member of.
.PP
A
-\fRRunas_Spec\fR
+\fIRunas_Spec\fR
sets the default for the commands that follow it.
What this means is that for the entry:
.nf
@@ -1391,7 +1402,7 @@ on the host
boulder\(embut
only as
\fBoperator\fR.
-E.g.,
+For example:
.nf
.sp
.RS 0n
@@ -1400,7 +1411,7 @@ $ sudo -u operator /bin/ls
.fi
.PP
It is also possible to override a
-\fRRunas_Spec\fR
+\fIRunas_Spec\fR
later on in an entry.
If we modify the entry like so:
.nf
@@ -1426,7 +1437,7 @@ as
We can extend this to allow
\fBdgb\fR
to run
-\fR/bin/ls\fR
+\fI/bin/ls\fR
with either
the user or group set to
\fBoperator\fR:
@@ -1439,7 +1450,7 @@ dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill,\e
.fi
.PP
While the group portion of the
-\fRRunas_Spec\fR
+\fIRunas_Spec\fR
permits the
user to run as command with that group, it does not force the user
to do so.
@@ -1470,7 +1481,7 @@ tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu,\e
.PP
In this example only the group will be set, the command still runs as user
\fBtcm\fR.
-E.g.\&
+For example:
.nf
.sp
.RS 0n
@@ -1479,7 +1490,7 @@ $ sudo -g dialer /usr/bin/cu
.fi
.PP
Multiple users and groups may be present in a
-\fRRunas_Spec\fR,
+\fIRunas_Spec\fR,
in which case the user may select any combination of users and groups via the
\fB\-u\fR
and
@@ -1495,11 +1506,14 @@ alan ALL = (root, bin : operator, system) ALL
.PP
user
\fBalan\fR
-may run any command as either user root or bin,
+may run any command as either user
+\fBroot\fR
+or
+\fBbin\fR,
optionally setting the group to operator or system.
.SS "Option_Spec"
A
-\fRCmnd\fR
+\fICmnd\fR
may have zero or more options associated with it.
Options may consist of
.if \n(SL \{\
@@ -1511,11 +1525,11 @@ Solaris privileges sets,
.\}
start and/or end dates and command timeouts.
Once an option is set for a
-\fRCmnd\fR,
+\fICmnd\fR,
subsequent
-\fRCmnd\fRs
+\fICmnd\fRs
in the
-\fRCmnd_Spec_List\fR,
+\fICmnd_Spec_List\fR,
inherit that option unless it is overridden by another option.
Option names are reserved words in
\fIsudoers\fR.
@@ -1562,10 +1576,13 @@ alice ALL = (root) APPARMOR_PROFILE=my-profile ALL
.PP
the user
\fBalice\fR
-may run any command as root under confinement by the profile
+may run any command as
+\fBroot\fR
+under confinement by the profile
\(oqmy-profile\(cq.
You can also stack profiles, or allow a user to run commands unconfined by
-any profile. E.g.,
+any profile.
+For example:
.nf
.sp
.RS 0n
@@ -1580,7 +1597,9 @@ entries allow user
\fBbob\fR
to run
\fI/usr/bin/vi\fR
-as root under the stacked profiles
+as
+\fBroot\fR
+under the stacked profiles
\(oqfoo\(cq
and
\(oqbar\(cq,
@@ -1642,10 +1661,10 @@ and
\fRNOTAFTER\fR
settings.
The time stamp must be specified in
-\fIGeneralized Time\fR
+\(lqGeneralized Time\(rq
as defined by RFC 4517.
The format is effectively
-\fRyyyymmddHHMMSSZ\fR
+\(oqyyyymmddHHMMSSZ\(cq
where the minutes and seconds are optional.
The
\(oqZ\(cq
@@ -1679,7 +1698,7 @@ minutes, and seconds with a single-letter case-insensitive suffix
that indicates the unit of time.
For example, a timeout of 7 days, 8 hours, 30 minutes, and
10 seconds would be written as
-\fR7d8h30m10s\fR.
+\(oq7d8h30m10s\(cq.
If a number is specified without a unit, seconds are assumed.
Any of the days, minutes, hours, or seconds may be omitted.
The order must be from largest to smallest unit and a unit
@@ -1688,17 +1707,17 @@ may not be specified more than once.
The following are all
\fIvalid\fR
timeout values:
-\fR7d8h30m10s\fR,
-\fR14d\fR,
-\fR8h30m\fR,
-\fR600s\fR,
-\fR3600\fR.
+\(oq7d8h30m10s\(cq,
+\(oq14d\(cq,
+\(oq8h30m\(cq,
+\(oq600s\(cq,
+\(oq3600\(cq.
The following are
\fIinvalid\fR
timeout values:
-\fR12m2w1d\fR,
-\fR30s10m4h\fR,
-\fR1d2d3h\fR.
+\(oq12m2w1d\(cq,
+\(oq30s10m4h\(cq,
+\(oq1d2d3h\(cq.
.PP
This setting is only supported by version 1.8.20 or higher.
.SS "Chdir_Spec"
@@ -1726,7 +1745,7 @@ directory, unless the
\fB\-i\fR
option is given.
Path names of the form
-\fR~user/path/name\fR
+\fI~user/path/name\fR
are interpreted as being relative to the named user's home directory.
If the user name is omitted, the path will be relative to the runas
user's home directory.
@@ -1759,7 +1778,7 @@ similar to the
chroot(@mansectsu@)
utility.
Path names of the form
-\fR~user/path/name\fR
+\fI~user/path/name\fR
are interpreted as being relative to the named user's home directory.
If the user name is omitted, the path will be relative to the runas
user's home directory.
@@ -1786,11 +1805,11 @@ The following tag values are supported:
and
\fRNOSETENV\fR.
Once a tag is set on a
-\fRCmnd\fR,
+\fICmnd\fR,
subsequent
-\fRCmnd\fRs
+\fICmnd\fRs
in the
-\fRCmnd_Spec_List\fR,
+\fICmnd_Spec_List\fR,
inherit the tag unless it is overridden by the opposite tag (in other words,
\fRPASSWD\fR
overrides
@@ -1800,7 +1819,7 @@ and
overrides
\fREXEC\fR).
.TP 2n
-\fIEXEC\fR and \fINOEXEC\fR
+\fREXEC\fR and \fRNOEXEC\fR
.sp
If
\fBsudo\fR
@@ -1833,16 +1852,17 @@ section below for more details on how
works and whether or not it will work on your system.
.RE
.TP 2n
-\fIFOLLOW\fR and \fINOFOLLOW\fR
+\fRFOLLOW\fR and \fRNOFOLLOW\fR
+.sp
Starting with version 1.8.15,
\fBsudoedit\fR
will not open a file that is a symbolic link unless the
\fIsudoedit_follow\fR
flag is enabled.
The
-\fIFOLLOW\fR
+\fRFOLLOW\fR
and
-\fINOFOLLOW\fR
+\fRNOFOLLOW\fR
tags override the value of
\fIsudoedit_follow\fR
and can be used to permit (or deny) the editing of symbolic links
@@ -1851,29 +1871,23 @@ These tags are only effective for the
\fIsudoedit\fR
command and are ignored for all other commands.
.TP 2n
-\fILOG_INPUT\fR and \fINOLOG_INPUT\fR
+\fRLOG_INPUT\fR and \fRNOLOG_INPUT\fR
.sp
These tags override the value of the
\fIlog_input\fR
flag on a per-command basis.
-For more information, see the description of
-\fIlog_input\fR
-in the
-\fISUDOERS OPTIONS\fR
-section below.
+For more information, see
+\fII/O LOGGING\fR.
.TP 2n
-\fILOG_OUTPUT\fR and \fINOLOG_OUTPUT\fR
+\fRLOG_OUTPUT\fR and \fRNOLOG_OUTPUT\fR
.sp
These tags override the value of the
\fIlog_output\fR
flag on a per-command basis.
-For more information, see the description of
-\fIlog_output\fR
-in the
-\fISUDOERS OPTIONS\fR
-section below.
+For more information, see
+\fII/O LOGGING\fR.
.TP 2n
-\fIMAIL\fR and \fINOMAIL\fR
+\fRMAIL\fR and \fRNOMAIL\fR
.sp
These tags provide fine-grained control over whether
mail will be sent when a user runs a command by
@@ -1888,7 +1902,7 @@ or
\fB\-v\fR
options.
A
-\fINOMAIL\fR
+\fRNOMAIL\fR
tag will also override the
\fImail_always\fR
and
@@ -1903,7 +1917,7 @@ in the
\fISUDOERS OPTIONS\fR
section below.
.TP 2n
-\fIPASSWD\fR and \fINOPASSWD\fR
+\fRPASSWD\fR and \fRNOPASSWD\fR
.sp
By default,
\fBsudo\fR
@@ -1913,12 +1927,12 @@ This behavior can be modified via the
\fRNOPASSWD\fR
tag.
Like a
-\fRRunas_Spec\fR,
+\fIRunas_Spec\fR,
the
\fRNOPASSWD\fR
tag sets
a default for the commands that follow it in the
-\fRCmnd_Spec_List\fR.
+\fICmnd_Spec_List\fR.
Conversely, the
\fRPASSWD\fR
tag can be used to reverse things.
@@ -1939,7 +1953,7 @@ to run
and
\fI/usr/bin/lprm\fR
as
-\fBroot\fR
+\fB@runas_default@\fR
on the machine
\(lqrushmore\(rq
without authenticating himself.
@@ -1966,10 +1980,10 @@ By default, if the
\fRNOPASSWD\fR
tag is applied to any of a user's entries for the current host,
the user will be able to run
-\(lq\fRsudo -l\fR\(rq
+\(oqsudo -l\(cq
without a password.
Additionally, a user may only run
-\(lq\fRsudo -v\fR\(rq
+\(oqsudo -v\(cq
without a password if all of the user's entries for the current
host have the
\fRNOPASSWD\fR
@@ -1981,7 +1995,7 @@ and
options.
.RE
.TP 2n
-\fISETENV\fR and \fINOSETENV\fR
+\fRSETENV\fR and \fRNOSETENV\fR
.sp
These tags override the value of the
\fIsetenv\fR
@@ -2008,7 +2022,7 @@ tag is implied for that command; this default may be overridden by use of the
\fRNOSETENV\fR
tag.
.TP 2n
-\fIINTERCEPT\fR and \fINOINTERCEPT\fR
+\fRINTERCEPT\fR and \fRNOINTERCEPT\fR
.sp
If
\fBsudo\fR
@@ -2023,6 +2037,11 @@ and logged just like they would be if run through
directly.
This is useful in conjunction with commands that allow shell escapes
such as editors, shells, and paginators.
+There is additional overhead due to the policy check that may add
+latency when running commands such as shell scripts that execute a
+large number of sub-commands.
+For interactive commands, such as a shell or editor,
+the overhead is not usually noticeable.
.sp
In the following example, user
\fBchuck\fR
@@ -2058,21 +2077,21 @@ fnmatch(3)
functions as specified by
IEEE Std 1003.1 (\(lqPOSIX.1\(rq).
.TP 10n
-\fR*\fR
+*
Matches any set of zero or more characters (including white space).
.TP 10n
-\fR\&?\fR
+\&?
Matches any single character (including white space).
.TP 10n
-\fR[...]\fR
+[...]
Matches any character in the specified range.
.TP 10n
-\fR[!...]\fR
+[!...]
Matches any character
\fInot\fR
in the specified range.
.TP 10n
-\fR\ex\fR
+\ex
For any character
\(oqx\(cq,
evaluates to
@@ -2144,9 +2163,9 @@ below.
.SS "Exceptions to wildcard rules"
The following exceptions apply to the above rules:
.TP 10n
-\fR\&""\fR
+\&""
If the empty string
-\fR\&""\fR
+\(oq\&""\(cq
is the only command line argument in the
\fIsudoers\fR
file entry it means that command is not allowed to be run with
@@ -2207,7 +2226,11 @@ In the following example, user
\fBjohn\fR
can run the
passwd(1)
-command as root on any host but is not allowed to change root's password.
+command as
+\fB@runas_default@\fR
+on any host but is not allowed to change
+\fBroot\fR's
+password.
This kind of rule is impossible to express safely using wildcards.
.nf
.sp
@@ -2244,7 +2267,8 @@ to run the
\fI/usr/sbin/usermod\fR,
and
\fI/usr/sbin/userdel\fR
-commands as root.
+commands as
+\fB@runas_default@\fR.
.nf
.sp
.RS 4n
@@ -2274,14 +2298,14 @@ It is possible to include other
files from within the
\fIsudoers\fR
file currently being parsed using the
-\fR@include\fR
+\fI@include\fR
and
-\fR@includedir\fR
+\fI@includedir\fR
directives.
For compatibility with sudo versions prior to 1.9.1,
-\fR#include\fR
+\fI#include\fR
and
-\fR#includedir\fR
+\fI#includedir\fR
are also accepted.
.PP
An include file can be used, for example, to keep a site-wide
@@ -2342,7 +2366,7 @@ contains the line:
.nf
.sp
.RS 4n
-\fR@include sudoers.local\fR
+@include sudoers.local
.RE
.fi
.PP
@@ -2350,7 +2374,7 @@ the file that will be included is
\fI/etc/sudoers.local\fR.
.PP
The file name may also include the
-\fR%h\fR
+\(oq%h\(cq
escape, signifying the short form of the host name.
In other words, if the machine's host name is
\(lqxerxes\(rq,
@@ -2368,7 +2392,7 @@ to include the file
\fI/etc/sudoers.xerxes\fR.
.PP
The
-\fR@includedir\fR
+\fI@includedir\fR
directive can be used to create a
\fIsudoers.d\fR
directory that the system package manager can drop
@@ -2391,6 +2415,7 @@ or contain a
\(oq.\&\(cq
character to avoid causing problems with package manager or editor
temporary/backup files.
+.PP
Files are parsed in sorted lexical order.
That is,
\fI/etc/sudoers.d/01_first\fR
@@ -2405,14 +2430,14 @@ Using a consistent number of leading zeroes in the file names can be used
to avoid such problems.
After parsing the files in the directory, control returns to the
file that contained the
-\fR@includedir\fR
+\fI@includedir\fR
directive.
.PP
Unlike files included via
-\fR@include\fR,
+\fI@include\fR,
\fBvisudo\fR
will not edit the files in a
-\fR@includedir\fR
+\fI@includedir\fR
directory unless one of them contains a syntax error.
It is still possible to run
\fBvisudo\fR
@@ -2438,11 +2463,11 @@ is a built-in
\fIalias\fR
that always causes a match to succeed.
It can be used wherever one might otherwise use a
-\fRCmnd_Alias\fR,
-\fRUser_Alias\fR,
-\fRRunas_Alias\fR,
+\fICmnd_Alias\fR,
+\fIUser_Alias\fR,
+\fIRunas_Alias\fR,
or
-\fRHost_Alias\fR.
+\fIHost_Alias\fR.
Attempting to define an
\fIalias\fR
named
@@ -2455,7 +2480,7 @@ can be dangerous since in a command context, it allows the user to run
command on the system.
.PP
The following option names permitted in an
-\fROption_Spec\fR
+\fIOption_Spec\fR
are also considered reserved words:
\fRCHROOT\fR,
.if \n(PS \{\
@@ -2486,16 +2511,18 @@ can be used as a logical
operator in a list or
\fIalias\fR
as well as in front of a
-\fRCmnd\fR.
+\fICmnd\fR.
This allows one to exclude certain values.
For the
\(oq\&!\(cq
operator to be effective, there must be something for it to exclude.
-For example, to match all users except for root one would use:
+For example, to match all users except for
+\fBroot\fR
+one would use:
.nf
.sp
.RS 4n
-ALL,!root
+ALL, !root
.RE
.fi
.PP
@@ -2509,7 +2536,9 @@ is omitted, as in:
.RE
.fi
.PP
-it would explicitly deny root but not match any other users.
+it would explicitly deny
+\fBroot\fR
+but not match any other users.
This is different from a true
\(lqnegation\(rq
operator.
@@ -2550,7 +2579,7 @@ when used as part of a word (e.g., a user name or host name):
.SH "SUDOERS OPTIONS"
\fBsudo\fR's
behavior can be modified by
-\fRDefault_Entry\fR
+\fIDefault_Entry\fR
lines, as explained earlier.
A list of all supported Defaults parameters, grouped by type, are listed below.
.PP
@@ -2559,9 +2588,12 @@ A list of all supported Defaults parameters, grouped by type, are listed below.
always_query_group_plugin
If a
\fIgroup_plugin\fR
-is configured, use it to resolve groups of the form %group as long
-as there is not also a system group of the same name.
-Normally, only groups of the form %:group are passed to the
+is configured, use it to resolve groups of the form
+\(oq%group\(cq
+as long as there is not also a system group of the same name.
+Normally, only groups of the form
+\(oq%:group\(cq
+are passed to the
\fIgroup_plugin\fR.
This flag is
\fIoff\fR
@@ -2573,7 +2605,9 @@ If enabled,
will set the
\fRHOME\fR
environment variable to the home directory of the target user
-(which is the root user unless the
+(which is the
+\fIrunas_default\fR
+user unless the
\fB\-u\fR
option is used).
This flag is largely obsolete and has no effect unless the
@@ -2678,10 +2712,10 @@ automatic restarting of system calls.
Unfortunately, not all operating systems do this by default,
and even those that do may have bugs.
For example, macOS fails to restart the
-\fBtcgetattr\fR()
+tcgetattr(3)
and
-\fBtcsetattr\fR()
-system calls (this is a bug in macOS).
+tcsetattr(3)
+functions (this is a bug in macOS).
Furthermore, because this behavior depends on the command stopping with the
\fRSIGTTIN\fR
or
@@ -2712,9 +2746,13 @@ or
\fREDITOR\fR
environment variables before falling back on the default editor list.
\fBvisudo\fR
-is typically run as root so this flag may allow a user with
+is typically run as
+\fBroot\fR
+so this flag may allow a user with
\fBvisudo\fR
-privileges to run arbitrary commands as root without logging.
+privileges to run arbitrary commands as
+\fBroot\fR
+without logging.
An alternative is to place a colon-separated list of
\(lqsafe\(rq
editors int the
@@ -2765,22 +2803,24 @@ Any variables in the caller's environment or in the file specified
by the
\fIrestricted_env_file\fR
setting that match the
-\fRenv_keep\fR
+\fIenv_keep\fR
and
-\fRenv_check\fR
+\fIenv_check\fR
lists are then added, followed by any variables present in the file
specified by the
\fIenv_file\fR
setting (if any).
The contents of the
-\fRenv_keep\fR
+\fIenv_keep\fR
and
-\fRenv_check\fR
+\fIenv_check\fR
lists, as modified by global Defaults parameters in
\fIsudoers\fR,
are displayed when
\fBsudo\fR
-is run by root with the
+is run by
+\fBroot\fR
+with the
\fB\-V\fR
option.
If the
@@ -2833,7 +2873,7 @@ Most programs that require a user's password will disable echo before
reading the password to avoid displaying the plaintext password on
the screen.
However, if terminal input is being logged (see
-\fIlog_input\fR),
+\fII/O LOGGING\fR),
the password will still be present in the I/O log.
If the
\fIlog_passwords\fR
@@ -2856,8 +2896,8 @@ is set), only the
first character of the password will be replaced in the I/O log.
This option has no effect unless
\fIlog_input\fR
-and
-\fIlog_input\fR
+or
+\fIlog_ttyin\fR
are also set.
This flag is
\fIon\fR
@@ -2869,16 +2909,16 @@ fqdn
Set this flag if you want to put fully qualified host names in the
\fIsudoers\fR
file when the local host name (as returned by the
-\fRhostname\fR
+\(oqhostname\(cq
command) does not contain the domain name.
In other words, instead of myhost you would use myhost.mydomain.edu.
You may still use the short form if you wish (and even mix the two).
This flag is only effective when the
\(lqcanonical\(rq
host name, as returned by the
-\fBgetaddrinfo\fR()
+getaddrinfo(3)
or
-\fBgethostbyname\fR()
+gethostbyname(3)
function, is a fully-qualified domain name.
This is usually the case when the system is configured to use DNS
for host name resolution.
@@ -2928,11 +2968,8 @@ from the network).
Just like with the hosts file, you must use the
\(lqcanonical\(rq
name as DNS knows it.
-That is, you may not use a host alias
-(\fRCNAME\fR
-entry)
-due to performance issues and the fact that there is no way to get all
-aliases from DNS.
+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.
.sp
This flag is
\fI@fqdn@\fR
@@ -2958,7 +2995,7 @@ by default.
ignore_dot
If set,
\fBsudo\fR
-will ignore "." or "" (both denoting current directory) in the
+will ignore "." or "" (both denoting the current directory) in the
\fRPATH\fR
environment variable; the
\fRPATH\fR
@@ -2997,7 +3034,7 @@ ignore_local_sudoers
If set via LDAP, parsing of
\fI@sysconfdir@/sudoers\fR
will be skipped.
-This is intended for Enterprises that wish to prevent the usage of local
+This is intended for sites that wish to prevent the usage of local
sudoers files so that only LDAP is used.
This thwarts the efforts of rogue operators who would attempt to add roles to
\fI@sysconfdir@/sudoers\fR.
@@ -3008,7 +3045,7 @@ Since this flag tells
\fBsudo\fR
how to behave when no specific LDAP entries have been matched, this
sudoOption is only meaningful for the
-\fRcn=defaults\fR
+\(oqcn=defaults\(cq
section.
This flag is
\fIoff\fR
@@ -3078,19 +3115,14 @@ by default.
log_input
If set,
\fBsudo\fR
-will run the command in a pseudo-terminal and log all user input.
-If the standard input is not connected to the user's tty, due to
-I/O redirection or because the command is part of a pipeline, that
-input is also captured and stored in a separate log file.
-Anything sent to the standard input will be consumed, regardless of
-whether or not the command run via
+will run the command in a pseudo-terminal (if
\fBsudo\fR
-is actually reading the standard input.
-This may have unexpected results when using
-\fBsudo\fR
-in a shell script that expects to process the standard input.
+was run from a terminal) and log all user input.
+If the standard input is not connected to the user's terminal, due
+to I/O redirection or because the command is part of a pipeline,
+that input is also logged.
For more information about I/O logging, see the
-\fII/O LOG FILES\fR
+\fII/O LOGGING\fR
section.
This flag is
\fIoff\fR
@@ -3099,12 +3131,15 @@ by default.
log_output
If set,
\fBsudo\fR
-will run the command in a pseudo-terminal and log all output that is sent
-to the screen, similar to the
-script(1)
-command.
+will run the command in a pseudo-terminal (if
+\fBsudo\fR
+was run from a terminal) and log all output that is sent to the
+user's terminal, the standard output or the standard error.
+If the standard output or standard error is not connected to the
+user's terminal, due to I/O redirection or because the command is
+part of a pipeline, that output is also logged.
For more information about I/O logging, see the
-\fII/O LOG FILES\fR
+\fII/O LOGGING\fR
section.
This flag is
\fIoff\fR
@@ -3140,20 +3175,59 @@ by default.
.sp
This setting is only supported by version 1.9.0 or higher.
.TP 18n
+log_stderr
+If set,
+\fBsudo\fR
+will log the standard error if it is not connected to the user's terminal.
+This can be used to log output to a pipe or redirected to a file.
+This flag is
+\fIoff\fR
+by default but is enabled when either the
+\fIlog_output\fR
+flag or the
+\fRLOG_OUTPUT\fR
+command tag is set.
+.TP 18n
+log_stdin
+If set,
+\fBsudo\fR
+will log the standard input if it is not connected to the user's terminal.
+This can be used to log input from a pipe or redirected from a file.
+This flag is
+\fIoff\fR
+by default but is enabled when either the
+\fIlog_input\fR
+flag or the
+\fRLOG_INPUT\fR
+command tag is set.
+.TP 18n
+log_stdout
+If set,
+\fBsudo\fR
+will log the standard output if it is not connected to the user's terminal.
+This can be used to log output to a pipe or redirected to a file.
+This flag is
+\fIoff\fR
+by default but is enabled when either the
+\fIlog_output\fR
+flag or the
+\fRLOG_OUTPUT\fR
+command tag is set.
+.TP 18n
log_subcmds
If set,
\fBsudoers\fR
will log when a command spawns a child process and executes a program
using the
-\fBexecl\fR(),
-\fBexecle\fR(),
-\fBexeclp\fR(),
-\fBexecv\fR(),
-\fBexecve\fR(),
-\fBexecvp\fR(),
-\fBexecvpe\fR(),
+execve(2),
+execl(3),
+execle(3),
+execlp(3),
+execv(3),
+execvp(3),
+execvpe(3),
or
-\fBsystem\fR()
+system(3)
library functions.
For example, if a shell is run by
\fBsudo\fR,
@@ -3175,6 +3249,38 @@ and is incompatible with SELinux RBAC support unless the system supports
seccomp(2)
filter mode.
.TP 18n
+log_ttyin
+If set,
+\fBsudo\fR
+will run the command in a pseudo-terminal and log user keystrokes
+sent to the user's terminal, if one is present.
+This flag is
+\fIoff\fR
+by default but is enabled when either the
+\fIlog_input\fR
+flag or the
+\fRLOG_INPUT\fR
+command tag is set.
+If no terminal is present, for example when running a remote command using
+ssh(1),
+this flag will have no effect.
+.TP 18n
+log_ttyout
+If set,
+\fBsudo\fR
+will run the command in a pseudo-terminal and log all output displayed
+on the user's terminal, if one is present.
+This flag is
+\fIoff\fR
+by default but is enabled when either the
+\fIlog_output\fR
+flag or the
+\fRLOG_OUTPUT\fR
+command tag is set.
+If no terminal is present, for example when running a remote command using
+ssh(1),
+this flag will have no effect.
+.TP 18n
log_year
If set, the four-digit year will be logged in the (non-syslog)
\fBsudo\fR
@@ -3289,7 +3395,7 @@ This works well on systems where the number of groups listed in the
\fIsudoers\fR
file is larger than the number of groups a typical user belongs to.
On systems where group lookups are slow, where users may belong
-to a large number of groups, and where the number of groups listed
+to a large number of groups, or where the number of groups listed
in the
\fIsudoers\fR
file is relatively small, it may be prohibitively expensive and
@@ -3341,7 +3447,7 @@ tag has been set, unless overridden by an
\fRNOINTERCEPT\fR
tag.
See the description of
-\fIINTERCEPT and NOINTERCEPT\fR
+\fRINTERCEPT and NOINTERCEPT\fR
above as well as the
\fIPreventing shell escapes\fR
section at the end of this manual.
@@ -3368,7 +3474,7 @@ is enable.
This flag has no effect unless the
\fIintercept\fR
flag is enabled or the
-\fIINTERCEPT\fR
+\fRINTERCEPT\fR
tag has been set for the command.
This flag is
\fIon\fR
@@ -3391,7 +3497,7 @@ subsequent commands will need to be authenticated.
This flag has no effect unless the
\fIintercept\fR
flag is enabled or the
-\fIINTERCEPT\fR
+\fRINTERCEPT\fR
tag has been set for the command.
This flag is
\fIoff\fR
@@ -3399,15 +3505,58 @@ by default.
.sp
This setting is only supported by version 1.9.8 or higher.
.TP 18n
+intercept_verify
+If set,
+\fBsudo\fR
+will attempt to verify that a command run in intercept mode has
+the expected path name, command line arguments and environment.
+.sp
+The process will be stopped after
+execve(2)
+has completed but before the new command has had a chance to run.
+To verify the command,
+\fBsudo\fR
+will read the command's path from
+\fI/proc/PID/exe\fR,
+the command line arguments and environment from the process's memory,
+and compare them against the arguments that were passed to
+execve(2).
+In the event of a mismatch, the command will be sent a
+\fRSIGKILL\fR
+signal and terminated.
+.sp
+This can help prevent a time of check versus time of use issue with
+intercept mode where the
+execve(2)
+arguments could be altered after the
+\fBsudoers\fR
+policy check.
+The checks can only be performed if the
+proc(@mansectform@)
+file system is available.
+This flag has no effect unless the
+\fIintercept\fR
+flag is enabled or the
+\fRINTERCEPT\fR
+tag has been set for the command and the
+\fIintercept_type\fR
+option is set to
+\fItrace\fR.
+This flag is
+\fIon\fR
+by default.
+.sp
+This setting is only supported by version 1.9.12 or higher.
+.TP 18n
netgroup_tuple
If set, netgroup lookups will be performed using the full netgroup
tuple: host name, user name, and domain (if one is set).
Historically,
\fBsudo\fR
only matched the user name and domain for netgroups used in a
-\fRUser_List\fR
+\fIUser_List\fR
and only matched the host name and domain for netgroups used in a
-\fRHost_List\fR.
+\fIHost_List\fR.
This flag is
\fIoff\fR
by default.
@@ -3421,7 +3570,7 @@ tag has been set, unless overridden by an
\fREXEC\fR
tag.
See the description of
-\fIEXEC and NOEXEC\fR
+\fREXEC and NOEXEC\fR
above as well as the
\fIPreventing shell escapes\fR
section at the end of this manual.
@@ -3630,17 +3779,23 @@ This flag is
by default.
.TP 18n
root_sudo
-If set, root is allowed to run
+If set,
+\fBroot\fR
+is allowed to run
\fBsudo\fR
too.
Disabling this prevents users from
\(lqchaining\(rq
\fBsudo\fR
-commands to get a root shell by doing something like
-\(lq\fRsudo sudo /bin/sh\fR\(rq.
+commands to get a
+\fBroot\fR
+shell by doing something like
+\(oqsudo sudo /bin/sh\(cq.
Note, however, that turning off
\fIroot_sudo\fR
-will also prevent root from running
+will also prevent
+\fBroot\fR
+from running
\fBsudoedit\fR.
Disabling
\fIroot_sudo\fR
@@ -3652,7 +3807,9 @@ by default.
rootpw
If set,
\fBsudo\fR
-will prompt for the root password instead of the password of the invoking user
+will prompt for the
+\fBroot\fR
+password instead of the password of the invoking user
when running a command or editing a file.
This flag is
\fIoff\fR
@@ -3662,7 +3819,7 @@ runas_allow_unknown_id
If enabled, allow matching of runas user and group IDs that are
not present in the password or group databases.
In addition to explicitly matching unknown user or group IDs in a
-\fRRunas_List\fR,
+\fIRunas_List\fR,
this option also allows the
\fBALL\fR
alias to match unknown IDs.
@@ -3682,7 +3839,7 @@ If enabled,
will only run commands as a user whose shell appears in the
\fI/etc/shells\fR
file, even if the invoking user's
-\fRRunas_List\fR
+\fIRunas_List\fR
would otherwise permit it.
If no
\fI/etc/shells\fR
@@ -3703,7 +3860,7 @@ If set,
will prompt for the password of the user defined by the
\fIrunas_default\fR
option (defaults to
-\fR@runas_default@\fR)
+\fB@runas_default@\fR)
instead of the password of the invoking user
when running a command or editing a file.
This flag is
@@ -3728,7 +3885,9 @@ is invoked with the
option, the
\fRHOME\fR
environment variable will be set to the home directory of the target
-user (which is the root user unless the
+user (which is the
+\fIrunas_default\fR
+user unless the
\fB\-u\fR
option is used).
This flag is largely obsolete and has no effect unless the
@@ -3749,7 +3908,9 @@ will set the
\fRLOGNAME\fR
and
\fRUSER\fR
-environment variables to the name of the target user (usually root unless the
+environment variables to the name of the target user (the user specified by
+\fIrunas_default\fR
+unless the
\fB\-u\fR
option is given).
However, since some programs (including the RCS revision control system) use
@@ -3782,6 +3943,11 @@ A pseudo-terminal is allocated by
when it is running in a terminal and one or more of the
\fIlog_input\fR,
\fIlog_output\fR,
+\fIlog_stdin\fR,
+\fIlog_stdout\fR,
+\fIlog_stderr\fR,
+\fIlog_ttyin\fR,
+\fIlog_ttyout\fR,
or
\fIuse_pty\fR
flags is enabled.
@@ -3814,7 +3980,9 @@ If set and
is invoked with no arguments it acts as if the
\fB\-s\fR
option had been given.
-That is, it runs a shell as root (the shell is determined by the
+That is, it runs a shell as
+\fBroot\fR
+(the shell is determined by the
\fRSHELL\fR
environment variable if it is set, falling back on the shell listed
in the invoking user's /etc/passwd entry if not).
@@ -3826,7 +3994,9 @@ stay_setuid
Normally, when
\fBsudo\fR
executes a command the real and effective user-IDs are set to the target
-user (root by default).
+user
+(\fB@runas_default@\fR
+by default).
This option changes that behavior such that the real user-ID is left
as the invoking user's user-ID.
In other words, this makes
@@ -3854,7 +4024,8 @@ Symbolic links will not be followed in writable directories and
will refuse to edit a file located in a writable directory.
These restrictions are not enforced when
\fBsudoedit\fR
-is run by root.
+is run by
+\fBroot\fR.
On some systems, if all directory components of the path to be edited
are not readable by the target user,
\fBsudoedit\fR
@@ -3878,9 +4049,9 @@ option can be enabled to allow
\fBsudoedit\fR
to open symbolic links.
It may be overridden on a per-command basis by the
-\fIFOLLOW\fR
+\fRFOLLOW\fR
and
-\fINOFOLLOW\fR
+\fRNOFOLLOW\fR
tags.
This flag is
\fIoff\fR
@@ -3904,8 +4075,8 @@ If set,
will prompt for the password of the user specified
by the
\fB\-u\fR
-option (defaults to
-\fRroot\fR)
+option (defaults to the value of
+\fIrunas_default\fR)
instead of the password of the invoking user
when running a command or editing a file.
This flag precludes the use of a user-ID not listed in the passwd
@@ -4010,7 +4181,7 @@ If a timeout is specified both in the
\fIsudoers\fR
file and on the command line, the smaller of the two timeouts will be used.
See the
-\fRTimeout_Spec\fR
+\fITimeout_Spec\fR
section for a description of the timeout syntax.
This flag is
\fIoff\fR
@@ -4040,7 +4211,7 @@ flag is set,
\fBsudo\fR
will prompt for a password even when it would be visible on the screen.
This makes it possible to run things like
-\(lq\fRssh somehost sudo ls\fR\(rq
+\(oqssh somehost sudo ls\(cq
since by default,
ssh(1)
does
@@ -4060,14 +4231,13 @@ The
\fIclosefrom\fR
option can be used to specify a different file descriptor at which
to start closing.
-The default is
-\fR3\fR.
+The default is 3.
.TP 18n
command_timeout
The maximum amount of time a command is allowed to run before
it is terminated.
See the
-\fRTimeout_Spec\fR
+\fITimeout_Spec\fR
section for a description of the timeout syntax.
.sp
This setting is only supported by version 1.8.20 or higher.
@@ -4076,7 +4246,7 @@ log_server_timeout
The maximum amount of time to wait when connecting to a log server
or waiting for a server response.
See the
-\fRTimeout_Spec\fR
+\fITimeout_Spec\fR
section for a description of the timeout syntax.
The default value is 30 seconds.
.sp
@@ -4084,12 +4254,12 @@ This setting is only supported by version 1.9.0 or higher.
.TP 18n
maxseq
The maximum sequence number that will be substituted for the
-\(lq\fR%{seq}\fR\(rq
+\(oq%{seq}\(cq
escape in the I/O log file (see the
\fIiolog_dir\fR
description below for more information).
While the value substituted for
-\(lq\fR%{seq}\fR\(rq
+\(oq%{seq}\(cq
is in base 36,
\fImaxseq\fR
itself should be expressed in decimal.
@@ -4113,8 +4283,7 @@ passwd_tries
The number of tries a user gets to enter his/her password before
\fBsudo\fR
logs the failure and exits.
-The default is
-\fR@passwd_tries@\fR.
+The default is @passwd_tries@.
.TP 18n
syslog_maxlen
On many systems,
@@ -4146,22 +4315,15 @@ loglinelen
Number of characters per line for the file log.
This value is used to decide when to wrap lines for nicer log files.
This has no effect on the syslog log file, only the file log.
-The default is
-\fR@loglen@\fR
-(use 0 or negate the option to disable word wrap).
+The default is @loglen@ (use 0 or negate the option to disable word wrap).
.TP 18n
passwd_timeout
Number of minutes before the
\fBsudo\fR
-password prompt times out, or
-\fR0\fR
-for no timeout.
+password prompt times out, or 0 for no timeout.
The timeout may include a fractional component
-if minute granularity is insufficient, for example
-\fR2.5\fR.
-The
-default is
-\fR@password_timeout@\fR.
+if minute granularity is insufficient, for example 2.5.
+The default is @password_timeout@.
.TP 18n
timestamp_timeout
.br
@@ -4169,20 +4331,15 @@ Number of minutes that can elapse before
\fBsudo\fR
will ask for a password again.
The timeout may include a fractional component if
-minute granularity is insufficient, for example
-\fR2.5\fR.
-The default is
-\fR@timeout@\fR.
-Set this to
-\fR0\fR
-to always prompt for a password.
-If set to a value less than
-\fR0\fR
-the user's time stamp will not expire until the system is rebooted.
+minute granularity is insufficient, for example 2.5.
+The default is @timeout@.
+Set this to 0 to always prompt for a password.
+If set to a value less than 0 the user's time stamp will not expire
+until the system is rebooted.
This can be used to allow users to create or delete their own time stamps via
-\(lq\fRsudo -v\fR\(rq
+\(oqsudo -v\(cq
and
-\(lq\fRsudo -k\fR\(rq
+\(oqsudo -k\(cq
respectively.
.TP 18n
umask
@@ -4195,10 +4352,8 @@ Unless the
flag is set, the actual umask will be the union of the
user's umask and the value of the
\fIumask\fR
-setting, which defaults to
-\fR@sudo_umask@\fR.
-This guarantees
-that
+setting, which defaults to @sudo_umask@.
+This guarantees that
\fBsudo\fR
never lowers the umask when running a command.
.sp
@@ -4226,7 +4381,7 @@ The default
can be overridden for individual
\fIsudoers\fR
entries by specifying the
-\fIAPPARMOR_PROFILE\fR
+\fRAPPARMOR_PROFILE\fR
option.
This option is only available when sudo is built with AppArmor
support.
@@ -4237,18 +4392,18 @@ The message may include the
\(oq%d\(cq
escape which will expand to the number of failed password attempts.
If set, it overrides the default message,
-\fR%d incorrect password attempt(s)\fR.
+\(lq%d incorrect password attempt(s)\(rq.
.TP 18n
badpass_message
Message that is displayed if a user enters an incorrect password.
The default is
-\fR@badpass_message@\fR
+\(lq@badpass_message@\(rq
unless insults are enabled.
.TP 18n
editor
A colon
(\(oq:\&\(cq)
-separated list of editors path names used by
+separated list of editor path names used by
\fBsudoedit\fR
and
\fBvisudo\fR.
@@ -4300,15 +4455,15 @@ It has the following possible values:
.TP 8n
dso
Preload a dynamic shared object (shared library) that intercepts the
-\fBexecl\fR(),
-\fBexecle\fR(),
-\fBexeclp\fR(),
-\fBexecv\fR(),
-\fBexecve\fR(),
-\fBexecvp\fR(),
-\fBexecvpe\fR(),
+execve(2),
+execl(3),
+execle(3),
+execlp(3),
+execv(3),
+execvp(3),
+execvpe(3),
and
-\fBsystem\fR()
+system(3)
library functions.
A value of
\fIdso\fR
@@ -4368,30 +4523,32 @@ escape sequences are supported:
.RS 18n
.PD 0
.TP 6n
-\fR%{seq}\fR
+%{seq}
expanded to a monotonically increasing base-36 sequence number, such as 0100A5,
where every two digits are used to form a new directory, e.g.,
\fI01/00/A5\fR
.PD
.TP 6n
-\fR%{user}\fR
+%{user}
expanded to the invoking user's login name
.TP 6n
-\fR%{group}\fR
+%{group}
expanded to the name of the invoking user's real group-ID
.TP 6n
-\fR%{runas_user}\fR
+%{runas_user}
expanded to the login name of the user the command will
-be run as (e.g., root)
+be run as (e.g.,
+\fBroot\fR)
.TP 6n
-\fR%{runas_group}\fR
+%{runas_group}
expanded to the group name of the user the command will
-be run as (e.g., wheel)
+be run as (e.g.,
+\fBwheel\fR)
.TP 6n
-\fR%{hostname}\fR
+%{hostname}
expanded to the local host name without the domain name
.TP 6n
-\fR%{command}\fR
+%{command}
expanded to the base name of the command being run
.PP
In addition, any escape sequences supported by the system's
@@ -4420,7 +4577,7 @@ tags are present for a command.
\fIiolog_file\fR
may contain directory components.
The default is
-\(lq\fR%{seq}\fR\(rq.
+\(oq%{seq}\(cq.
.sp
See the
\fIiolog_dir\fR
@@ -4430,9 +4587,9 @@ escape sequences.
.sp
In addition to the escape sequences, path names that end in six or
more
-\fRX\fRs
+\fIX\fRs
will have the
-\fRX\fRs
+\fIX\fRs
replaced with a unique combination of digits and letters, similar to the
mktemp(3)
function.
@@ -4446,7 +4603,7 @@ overwritten unless
\fIiolog_file\fR
ends in six or
more
-\fRX\fRs.
+\fIX\fRs.
.TP 18n
iolog_flush
If set,
@@ -4571,7 +4728,7 @@ For
\fBsudo_logsrvd\fR,
client certificate validation is controlled by the
\fItls_checkpeer\fR
-option, which defaults to
+flag, which defaults to
\fIfalse\fR.
.sp
This setting is only supported by version 1.9.0 or higher.
@@ -4581,10 +4738,10 @@ Subject of the mail sent to the
\fImailto\fR
user.
The escape
-\fR%h\fR
+\(oq%h\(cq
will expand to the host name of the machine.
Default is
-\(lq\fR@mailsub@\fR\(rq.
+\(lq@mailsub@\(rq.
.TP 18n
noexec_file
As of
@@ -4600,9 +4757,9 @@ name used when the
\fB\-A\fR
option is specified.
The default value is either
-\(lq\fR@pam_service@\fR\(rq
+\(oq@pam_service@\(cq
or
-\(lq\fR@pam_login_service@\fR\(rq,
+\(oq@pam_login_service@\(cq,
depending on whether or not the
\fB\-i\fR
option is also specified.
@@ -4619,7 +4776,7 @@ name used when the
\fB\-i\fR
option is specified.
The default value is
-\(lq\fR@pam_login_service@\fR\(rq.
+\(oq@pam_login_service@\(cq.
See the description of
\fIpam_service\fR
for more information.
@@ -4635,7 +4792,7 @@ file or a file in the
\fI/etc/pam.d\fR
directory.
The default value is
-\(lq\fRsudo\fR\(rq.
+\(oqsudo\(cq.
.sp
This setting is only supported by version 1.8.8 or higher.
.TP 18n
@@ -4652,17 +4809,17 @@ escape sequences are supported:
.RS 18n
.PD 0
.TP 6n
-\fR%H\fR
+%H
expanded to the local host name including the domain name
(only if the machine's host name is fully qualified or the
\fIfqdn\fR
option is set)
.PD
.TP 6n
-\fR%h\fR
+%h
expanded to the local host name without the domain name
.TP 6n
-\fR%p\fR
+%p
expanded to the user whose password is being asked for (respects the
\fIrootpw\fR,
\fItargetpw\fR
@@ -4671,18 +4828,19 @@ and
flags in
\fIsudoers\fR)
.TP 6n
-\fR\&%U\fR
+\&%U
expanded to the login name of the user the command will
-be run as (defaults to root)
+be run as (defaults to
+\fB@runas_default@\fR)
.TP 6n
-\fR%u\fR
+%u
expanded to the invoking user's login name
.TP 6n
-\fR%%\fR
+%%
two consecutive
-\fR%\fR
+\(oq%\(cq
characters are collapsed into a single
-\fR%\fR
+\(oq%\(cq
character
.PP
On systems that use PAM for authentication,
@@ -4699,7 +4857,7 @@ The
flag can be used to change this behavior.
.sp
The default value is
-\(lq\fR@passprompt@\fR\(rq.
+\(oq@passprompt@\(cq.
.RE
.if \n(PS \{\
.TP 18n
@@ -4738,14 +4896,14 @@ The default user to run commands as if the
\fB\-u\fR
option is not specified on the command line.
This defaults to
-\fR@runas_default@\fR.
+\fB@runas_default@\fR.
.TP 18n
sudoers_locale
Locale to use when parsing the sudoers file, logging commands, and
sending email.
Changing the locale may affect how sudoers is interpreted.
Defaults to
-\(lq\fRC\fR\(rq.
+\(oqC\(cq.
.TP 18n
timestamp_type
\fBsudoers\fR
@@ -4772,10 +4930,7 @@ process ID (usually the shell).
Commands run from the same shell (or other common parent process)
will not require a password for
\fItimestamp_timeout\fR
-minutes
-(\fR@timeout@\fR
-by default)
-\&.
+minutes (@timeout@ by default).
Commands run via
\fBsudo\fR
with a different parent process ID, for example from a shell script,
@@ -4788,10 +4943,7 @@ If no terminal is present, the behavior is the same as
\fIppid\fR.
Commands run from the same terminal will not require a password for
\fItimestamp_timeout\fR
-minutes
-(\fR@timeout@\fR
-by default)
-\&.
+minutes (@timeout@ by default).
.TP 8n
kernel
The time stamp is stored in the kernel as an attribute of the terminal
@@ -4823,7 +4975,7 @@ timestampowner
The owner of the lecture status directory, time stamp directory and all
files stored therein.
The default is
-\fRroot\fR.
+\fBroot\fR.
.if \n(SL \{\
.TP 18n
type
@@ -4854,7 +5006,7 @@ is configured with the
\fR--enable-admin-flag\fR
option.
The default value is
-\fR~/.sudo_as_admin_successful\fR.
+\fI~/.sudo_as_admin_successful\fR.
.TP 14n
env_file
The
@@ -4862,9 +5014,9 @@ The
option specifies the fully qualified path to a file containing variables
to be set in the environment of the program being run.
Entries in this file should either be of the form
-\(lq\fRVARIABLE=value\fR\(rq
+\(oqVARIABLE=value\(cq
or
-\(lq\fRexport VARIABLE=value\fR\(rq.
+\(oqexport VARIABLE=value\(cq.
The value may optionally be enclosed in single or double quotes.
Variables in this file are only added if the variable does not already
exist in the environment.
@@ -4879,7 +5031,7 @@ and
exempt_group
Users in this group are exempt from password and PATH requirements.
The group name specified should not include a
-\fR%\fR
+\(oq%\(cq
prefix.
This is not set by default.
.TP 14n
@@ -4932,7 +5084,7 @@ alias.
.sp
This setting is only supported by version 1.8.20 or higher.
If the operating system does not support the
-\fBfexecve\fR()
+fexecve(2)
system call, this setting has no effect.
.RE
.TP 14n
@@ -4948,6 +5100,34 @@ These arguments (if any) will be passed to the plugin's initialization function.
If arguments are present, the string must be enclosed in double quotes
(\&"").
.sp
+On 64-bit systems, if the plugin is present but cannot be loaded,
+\fBsudoers\fR
+will look for a 64-bit version and, if it exists, load that as a fallback.
+The exact rules for this vary by system.
+On Solaris, if the plugin is stored in a directory ending in
+\(lqlib\(rq,
+\fBsudoers\fR
+will create a fallback path by appending
+\(lq/64\(rq
+to the directory name;
+\fI/usr/lib/sudo_plugin.so\fR
+becomes
+\fI/usr/lib/64/sudo_plugin.so\fR.
+On Linux, a directory ending in
+\(lqlib\(rq
+will be transformed to
+\(lqlib64\(rq
+as the fallback path;
+\fI/usr/lib/sudo_plugin.so\fR
+becomes
+\fI/usr/lib64/sudo_plugin.so\fR.
+On all other systems, the fallback path is generated by adding a
+\(lq64\(rq
+before the file extension;
+\fIsudo_plugin.so\fR
+becomes
+\fIsudo_plugin64.so\fR.
+.sp
For more information see
\fIGROUP PROVIDER PLUGINS\fR.
.TP 14n
@@ -5055,7 +5235,7 @@ may be truncated.
.TP 10n
sudo
Traditional sudo-style logs, see
-\fILOG FORMAT\fR
+\fIEVENT LOGGING\fR
for a description of the log file format.
.PP
This setting affects logs sent via
@@ -5097,7 +5277,7 @@ The address should be enclosed in double quotes
to protect against
\fBsudo\fR
interpreting the
-\fR@\fR
+\(oq@\(cq
sign.
Defaults to the name of the user running
\fBsudo\fR.
@@ -5111,10 +5291,9 @@ The address should be enclosed in double quotes
to protect against
\fBsudo\fR
interpreting the
-\fR@\fR
+\(oq@\(cq
sign.
-Defaults to
-\fR@mailto@\fR.
+Defaults to @mailto@.
.TP 14n
rlimit_as
The maximum size to which the process's address space may grow (in bytes),
@@ -5193,9 +5372,9 @@ The
option specifies the fully qualified path to a file containing variables
to be set in the environment of the program being run.
Entries in this file should either be of the form
-\(lq\fRVARIABLE=value\fR\(rq
+\(oqVARIABLE=value\(cq
or
-\(lq\fRexport VARIABLE=value\fR\(rq.
+\(oqexport VARIABLE=value\(cq.
The value may optionally be enclosed in single or double quotes.
Variables in this file are only added if the variable does not already
exist in the environment.
@@ -5240,7 +5419,7 @@ It is only possible to use
\fIrunchroot\fR
as a command-specific Defaults setting if the command exists with
the same path both inside and outside the chroot jail.
-This restriction does not apply to generic, host, or user-based
+This restriction does not apply to global, host, or user-based
Defaults settings or to a
\fICmnd_Spec\fR
that includes a
@@ -5285,8 +5464,7 @@ This option is @secure_path@ by default.
syslog
Syslog facility if syslog is being used for logging (negate to
disable syslog logging).
-Defaults to
-\fR@logfac@\fR.
+Defaults to @logfac@.
.sp
The following syslog facilities are supported:
\fBauthpriv\fR
@@ -5309,8 +5487,7 @@ syslog_badpri
.br
Syslog priority to use when the user is not allowed to run a command or
when authentication is unsuccessful.
-Defaults to
-\fR@badpri@\fR.
+Defaults to @badpri@.
.sp
The following syslog priorities are supported:
\fBalert\fR,
@@ -5330,8 +5507,7 @@ will disable logging of unsuccessful commands.
syslog_goodpri
Syslog priority to use when the user is allowed to run a command and
authentication is successful.
-Defaults to
-\fR@goodpri@\fR.
+Defaults to @goodpri@.
.sp
See
\fIsyslog_badpri\fR
@@ -5435,21 +5611,22 @@ The argument may be a double-quoted, space-separated list or a
single value without double-quotes.
The list can be replaced, added to, deleted from, or disabled by using
the
-\fR=\fR,
-\fR+=\fR,
-\fR-=\fR,
+\(oq=\(cq,
+\(oq+=\(cq,
+\(oq-=\(cq,
and
-\fR\&!\fR
+\(oq\&!\(cq
operators respectively.
Regardless of whether the
-\fRenv_reset\fR
+\fIenv_reset\fR
option is enabled or disabled, variables specified by
-\fRenv_check\fR
+\fIenv_check\fR
will be preserved in the environment if they pass the aforementioned check.
The global list of environment variables to check is displayed when
\fBsudo\fR
-is run by root with
-the
+is run by
+\fBroot\fR
+with the
\fB\-V\fR
option.
.RE
@@ -5461,15 +5638,17 @@ option is not in effect.
The argument may be a double-quoted, space-separated list or a
single value without double-quotes.
The list can be replaced, added to, deleted from, or disabled by using the
-\fR=\fR,
-\fR+=\fR,
-\fR-=\fR,
+\(oq=\(cq,
+\(oq+=\(cq,
+\(oq-=\(cq,
and
-\fR\&!\fR
+\(oq\&!\(cq
operators respectively.
The global list of environment variables to remove is displayed when
\fBsudo\fR
-is run by root with the
+is run by
+\fBroot\fR
+with the
\fB\-V\fR
option.
Many operating systems will remove potentially dangerous variables
@@ -5486,16 +5665,18 @@ processes will receive.
The argument may be a double-quoted, space-separated list or a
single value without double-quotes.
The list can be replaced, added to, deleted from, or disabled by using the
-\fR=\fR,
-\fR+=\fR,
-\fR-=\fR,
+\(oq=\(cq,
+\(oq+=\(cq,
+\(oq-=\(cq,
and
-\fR\&!\fR
+\(oq\&!\(cq
operators respectively.
The global list of variables to keep
is displayed when
\fBsudo\fR
-is run by root with the
+is run by
+\fBroot\fR
+with the
\fB\-V\fR
option.
.sp
@@ -5588,7 +5769,7 @@ plugin supports its own plugin interface to allow non-Unix
group lookups which can query a group source other
than the standard Unix group database.
This can be used to implement support for the
-\fRnonunix_group\fR
+\fInonunix_group\fR
syntax described earlier.
.PP
Group provider plugins are specified via the
@@ -5627,9 +5808,9 @@ system_group
The
\fIsystem_group\fR
plugin supports group lookups via the standard C library functions
-\fBgetgrnam\fR()
+getgrnam(3)
and
-\fBgetgrid\fR().
+getgrid(3).
This plugin can be used in instances where the user belongs to
groups not present in the user's supplemental group vector.
This plugin takes no options:
@@ -5642,7 +5823,7 @@ Defaults group_plugin=system_group.so
.PP
The group provider plugin API is described in detail in
sudo_plugin(@mansectform@).
-.SH "LOG FORMAT"
+.SH "EVENT LOGGING"
\fBsudoers\fR
can log events in either JSON or
\fIsudo\fR
@@ -5743,7 +5924,7 @@ The actual command that was executed.
Messages are logged using the locale specified by
\fIsudoers_locale\fR,
which defaults to the
-\(lq\fRC\fR\(rq
+\(oqC\(cq
locale.
.SS "Denied command log entries"
If the user is not allowed to run the command, the reason for the denial
@@ -5833,12 +6014,12 @@ is the user-ID that owns the
\fIsudoers\fR
file) to the end of the
\fBsudoers\fR
-\fRPlugin\fR
+\fIPlugin\fR
line in the
sudo.conf(@mansectform@)
file.
.TP 3n
-unable to stat @sysconfdir@/sudoers
+unable to open @sysconfdir@/sudoers
The
\fI@sysconfdir@/sudoers\fR
file is missing.
@@ -5862,7 +6043,7 @@ is the user-ID that owns the
\fIsudoers\fR
file) to the
\fBsudoers\fR
-\fRPlugin\fR
+\fIPlugin\fR
line in the
sudo.conf(@mansectform@)
file.
@@ -5879,7 +6060,7 @@ The default mode may be changed via the
\(lqsudoers_mode\(rq
option to the
\fBsudoers\fR
-\fRPlugin\fR
+\fIPlugin\fR
line in the
sudo.conf(@mansectform@)
file.
@@ -5898,7 +6079,7 @@ is the group-ID that owns the
\fIsudoers\fR
file) to the
\fBsudoers\fR
-\fRPlugin\fR
+\fIPlugin\fR
line in the
sudo.conf(@mansectform@)
file.
@@ -5908,7 +6089,9 @@ unable to open @rundir@/ts/username
was unable to read or create the user's time stamp file.
This can happen when
\fItimestampowner\fR
-is set to a user other than root and the mode on
+is set to a user other than
+\fBroot\fR
+and the mode on
\fI@rundir@\fR
is not searchable by group or other.
The default mode for
@@ -5945,7 +6128,7 @@ The
and
\fIprogname\fR
fields are added by the system's
-\fBsyslog\fR()
+syslog(3)
function, not
\fBsudoers\fR
itself.
@@ -5998,11 +6181,60 @@ If the
option is set to 0 (or negated with a
\(oq\&!\(cq),
word wrap will be disabled.
-.SH "I/O LOG FILES"
+.SH "I/O LOGGING"
When I/O logging is enabled,
\fBsudo\fR
-will run the command in a pseudo-terminal and log all user input and/or output,
-depending on which options are enabled.
+will runs the command in a pseudo-terminal, logging user input
+and/or output, depending on which
+\fBsudoers\fR
+flags are enabled.
+There are five distinct types of I/O that can be logged, each with
+a corresponding
+\fBsudoers\fR
+flag.
+.TS
+l l l.
+.PP
+\fBType\fR \fBFlag\fR \fBDescription\fR
+.PP
+terminal input log_ttyin keystrokes entered by the user
+.PP
+terminal output log_ttyout command output displayed to the screen
+.PP
+standard input log_stdin input from a pipe or a file
+.PP
+standard output log_stdout output to a pipe or a file
+.PP
+standard error log_stderr output to a pipe or a file
+.TE
+.PP
+In addition to flags described the above, the
+\fIlog_input\fR
+flag and
+\fRLOG_INPUT\fR
+command tag set both
+\fIlog_ttyin\fR
+and
+\fIlog_stdin\fR.
+The
+\fIlog_output\fR
+flag and
+\fRLOG_OUTPUT\fR
+command tag set
+\fIlog_ttyout\fR,
+\fIlog_stdout\fR,
+and
+\fIlog_stderr\fR.
+.PP
+To capture terminal input and output,
+\fBsudo\fR
+run the command in a pseudo-terminal, logging the input and
+output before passing it on to the user.
+To capture the standard input, standard output or standard error,
+\fBsudo\fR
+uses a pipe to interpose itself between the input or output stream,
+logging the I/O before passing it to the other end of the pipe.
+.PP
I/O can be logged either to the local machine or to a remote log server.
For local logs, I/O is logged to the directory specified by the
\fIiolog_dir\fR
@@ -6012,7 +6244,7 @@ by default)
using a unique session ID that is included in the
\fBsudo\fR
log line, prefixed with
-\(lq\fRTSID=\fR\(rq.
+\(oqTSID=\(cq.
The
\fIiolog_file\fR
option may be used to control the format of the session ID.
@@ -6022,7 +6254,121 @@ setting is used to specify one or more log servers running
\fBsudo_logsrvd\fR
or another server that implements the protocol described by
sudo_logsrv.proto(@mansectform@).
+.SS "I/O logging pitfals"
+When logging standard input, anything sent to the standard input
+will be consumed, regardless of whether or not the command run via
+\fBsudo\fR
+is actively reading the standard input.
+This may have unexpected results when using
+\fBsudo\fR
+in a shell script that expects to process the standard input.
+For example, given the following shell script:
+.nf
+.sp
+.RS 4n
+#!/bin/sh
+sudo echo testing
+echo done
+.RE
+.fi
+.PP
+It will behave as expected when the script is passed to the shell as a
+an argument:
+.nf
+.sp
+.RS 4n
+$ sh test.sh
+testing
+done
+.RE
+.fi
+.PP
+However, if the script is passed to the shell on the standard input, the
+\(oqsudo echo testing\(cq
+command will consume the rest of the script.
+This means that the
+\(oqecho done\(cq
+statement is never executed.
+.nf
+.sp
+.RS 4n
+$ sh -s < test.sh
+testing
+.RE
+.fi
+.PP
+There are several ways to work around this problem:
+.TP 5n
+1.\&
+Redirect the standard input from
+\fI/dev/null\fR
+when running a command via
+\fBsudo\fR
+that does not need to read the standard input.
+.nf
+.sp
+.RS 9n
+sudo echo testing < /dev/null
+.RE
+.fi
+.TP 5n
+2.\&
+Pass the script to the shell by path name instead of via the standard input.
+.nf
+.sp
+.RS 9n
+sh test.sh
+.RE
+.fi
+.TP 5n
+3.\&
+Disable logging the standard input for commands that do not need
+to read the standard input.
+.nf
+.sp
+.RS 9n
+Defaults!/bin/echo !log_stdin
+.RE
+.fi
+.PP
+Depending on the command, it may not be desirable to log the
+standard input or standard output.
+For example, I/O logging of commands that send or receive large
+amount of data via the standard output or standard input such as
+rsync(1)
+and
+tar(1)
+could fill up the log file system with superfluous data.
+It is possible to disable logging of the standard input and standard
+output for such commands as follows:
+.nf
+.sp
+.RS 4n
+Cmnd_Alias COPY_CMDS = /usr/bin/tar, /usr/bin/cpio, /usr/bin/rsync
+
+# Log input and output but omit stdin and stdout when copying files.
+Defaults log_input, log_output
+Defaults!COPY_CMDS !log_stdin, !log_stdout
+.RE
+.fi
.PP
+However, be aware that using the
+\fIlog_input\fR
+flag or the
+\fRLOG_INPUT\fR
+command tag will also enable
+\fIlog_stdin\fR.
+Likewise, the
+\fIlog_ouput\fR
+flag or the
+\fRLOG_OUTPUT\fR
+command tag will enable
+\fIlog_stdout\fR
+and
+\fIlog_stderr.\fR
+Careful ordering of rules may be necessary to achieve the results
+that you expect.
+.SS "I/O log format"
For both local and remote I/O logs, each log is stored in a separate
directory that contains the following files:
.TP 10n
@@ -6079,12 +6425,12 @@ if no terminal was present.
.TP 10n
runargv
A JSON array representing the command's argument vector as passed to the
-\fBexecve\fR()
+execve(2)
system call.
.TP 10n
runenv
A JSON array representing the command's environment as passed to the
-\fBexecve\fR()
+execve(2)
system call.
.TP 10n
rungid
@@ -6168,6 +6514,13 @@ command suspend or resume, signal received
.TP 10n
\fIttyin\fR
Raw input from the user's terminal, exactly as it was received.
+This file is only present if the
+\fIlog_input\fR
+or
+\fIlog_ttyin\fR
+flags are set and
+\fBsudo\fR
+was run from a terminal.
No post-processing is performed.
For manual viewing, you may wish to convert carriage return characters
in the log to line feeds.
@@ -6177,19 +6530,42 @@ For example:
\fIstdin\fR
The standard input when no terminal is present, or input redirected from
a pipe or file.
+This file is only present if the
+\fIlog_input\fR
+or
+\fIlog_stdin\fR
+flags are set and the standard input is not connected to a terminal.
.TP 10n
\fIttyout\fR
Output from the pseudo-terminal (what the command writes to the screen).
Terminal-specific post-processing is performed before the data is logged.
This means that, for example, line feeds are usually converted to
line feed/carriage return pairs and tabs may be expanded to spaces.
+This file is only present if the
+\fIlog_output\fR
+or
+\fIlog_ttyout\fR
+flags are set and
+\fBsudo\fR
+was run from a terminal.
.TP 10n
\fIstdout\fR
The standard output when no terminal is present, or output redirected to
a pipe or file.
+This file is only present if the
+\fIlog_output\fR
+or
+\fIlog_stdout\fR
+flags are set and the standard output is not connected to a terminal.
.TP 10n
\fIstderr\fR
-The standard error redirected to a pipe or file.
+The standard error when no terminal is present, or output redirected to
+a pipe or file.
+This file is only present if the
+\fIlog_output\fR
+or
+\fIlog_stderr\fR
+flags are set and the standard error is not connected to a terminal.
.PP
All files other than
\fIlog\fR
@@ -6217,6 +6593,9 @@ In most cases, logging the command output via
or
\fRLOG_OUTPUT\fR
is all that is required.
+When logging input, consider disabling the
+\fIlog_passwords\fR
+flag.
.PP
Since each session's I/O logs are stored in a separate directory,
traditional log rotation utilities cannot be used to limit the
@@ -6336,14 +6715,15 @@ need not provide a password and we don't want to reset the
\fRLOGNAME\fR
or
\fRUSER\fR
-environment variables when running commands as root.
+environment variables when running commands as
+\fBroot\fR.
Additionally, on the machines in the
-\fISERVERS\fR
-\fRHost_Alias\fR,
+\fRSERVERS\fR
+\fIHost_Alias\fR,
we keep an additional local log file and make sure we log the year
in each log line since the log entries will be kept around for several years.
Lastly, we disable shell escapes for the commands in the PAGERS
-\fRCmnd_Alias\fR
+\fICmnd_Alias\fR
(\fI/usr/bin/more\fR,
\fI/usr/bin/pg\fR
and
@@ -6421,17 +6801,12 @@ jack CSNETS = ALL
The user
\fBjack\fR
may run any command on the machines in the
-\fICSNETS\fR
-alias (the networks
-\fR128.138.243.0\fR,
-\fR128.138.204.0\fR,
-and
-\fR128.138.242.0\fR).
-Of those networks, only
-\fR128.138.204.0\fR
-has an explicit netmask (in CIDR notation) indicating it is a class C network.
+\fRCSNETS\fR
+alias (the networks 128.138.243.0, 128.138.204.0, and 128.138.242.0).
+Of those networks, only 128.138.204.0 has an explicit netmask (in
+CIDR notation) indicating it is a class C network.
For the other networks in
-\fICSNETS\fR,
+\fRCSNETS\fR,
the local machine's netmask will be used during matching.
.nf
.sp
@@ -6443,9 +6818,8 @@ lisa CUNETS = ALL
The user
\fBlisa\fR
may run any command on any host in the
-\fICUNETS\fR
-alias (the class B network
-\fR128.138.0.0\fR).
+\fRCUNETS\fR
+alias (the class B network 128.138.0.0).
.nf
.sp
.RS 0n
@@ -6497,8 +6871,8 @@ group may run commands in
\fI/usr/sbin/\fR
as themselves
with any group in the
-\fIADMINGRP\fR
-\fRRunas_Alias\fR
+\fRADMINGRP\fR
+\fIRunas_Alias\fR
(the
\fBadm\fR
and
@@ -6508,8 +6882,9 @@ groups).
The user
\fBpete\fR
is allowed to change anyone's password except for
-root on the
-\fIHPPA\fR
+\fBroot\fR
+on the
+\fRHPPA\fR
machines.
Because command line arguments are matched as a single,
concatenated string, the
@@ -6544,12 +6919,12 @@ bob SPARC = (OP) ALL : SGI = (OP) ALL
The user
\fBbob\fR
may run anything on the
-\fISPARC\fR
+\fRSPARC\fR
and
-\fISGI\fR
+\fRSGI\fR
machines as any user listed in the
-\fIOP\fR
-\fRRunas_Alias\fR
+\fROP\fR
+\fIRunas_Alias\fR
(\fBroot\fR
and
\fBoperator\fR.)
@@ -6592,8 +6967,8 @@ fred ALL = (DB) NOPASSWD: ALL
The user
\fBfred\fR
can run commands as any user in the
-\fIDB\fR
-\fRRunas_Alias\fR
+\fRDB\fR
+\fIRunas_Alias\fR
(\fBoracle\fR
or
\fBsybase\fR)
@@ -6606,11 +6981,12 @@ john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
.fi
.PP
On the
-\fIALPHA\fR
+\fRALPHA\fR
machines, user
\fBjohn\fR
-may su to anyone except root but he is not allowed to specify any options
-to the
+may su to anyone except
+\fBroot\fR
+but he is not allowed to specify any options to the
su(1)
command.
.nf
@@ -6623,8 +6999,8 @@ jen ALL, !SERVERS = ALL
The user
\fBjen\fR
may run any command on any machine except for those in the
-\fISERVERS\fR
-\fRHost_Alias\fR
+\fRSERVERS\fR
+\fIHost_Alias\fR
(primary, mail, www, and ns).
.nf
.sp
@@ -6634,21 +7010,21 @@ jill SERVERS = /usr/bin/, !SU, !SHELLS
.fi
.PP
For any machine in the
-\fISERVERS\fR
-\fRHost_Alias\fR,
+\fRSERVERS\fR
+\fIHost_Alias\fR,
\fBjill\fR
may run
any commands in the directory
\fI/usr/bin/\fR
except for those commands
belonging to the
-\fISU\fR
+\fRSU\fR
and
-\fISHELLS\fR
-\fRCmnd_Aliases\fR.
+\fRSHELLS\fR
+\fICmnd_Aliases\fR.
While not specifically mentioned in the rule, the commands in the
-\fIPAGERS\fR
-\fRCmnd_Alias\fR
+\fRPAGERS\fR
+\fICmnd_Alias\fR
all reside in
\fI/usr/bin\fR
and have the
@@ -6683,8 +7059,8 @@ WEBADMIN www = (www) ALL, (root) /usr/bin/su www
.fi
.PP
On the host www, any user in the
-\fIWEBADMIN\fR
-\fRUser_Alias\fR
+\fRWEBADMIN\fR
+\fIUser_Alias\fR
(will, wendy, and wim), may run any command as user www (which owns the
web pages) or simply
su(1)
@@ -6698,7 +7074,7 @@ ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\e
.fi
.PP
Any user may mount or unmount a CD-ROM on the machines in the CDROM
-\fRHost_Alias\fR
+\fIHost_Alias\fR
(orion, perseus, hercules) without entering a password.
This is a bit tedious for users to type, so it is a prime candidate
for encapsulating in a shell script.
@@ -6724,9 +7100,9 @@ bill ALL = ALL, !SU, !SHELLS
Doesn't really prevent
\fBbill\fR
from running the commands listed in
-\fISU\fR
+\fRSU\fR
or
-\fISHELLS\fR
+\fRSHELLS\fR
since he can simply copy those commands to a different name, or use
a shell escape from an editor or other program.
Therefore, these kind of restrictions should be considered
@@ -6735,7 +7111,9 @@ advisory at best (and reinforced by policy).
In general, if a user has sudo
\fBALL\fR
there is nothing to prevent them from creating their own program that gives
-them a root shell (or making their own copy of a shell) regardless of any
+them a
+\fBroot\fR
+shell (or making their own copy of a shell) regardless of any
\(oq!\&\(cq
elements in the user specification.
.SS "Security implications of \fIfast_glob\fR"
@@ -6763,13 +7141,13 @@ john ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,\e
User
\fBjohn\fR
can still run
-\fR/usr/bin/passwd root\fR
+\(oq/usr/bin/passwd root\(cq
if
\fIfast_glob\fR
is enabled by changing to
\fI/usr/bin\fR
and running
-\fR./passwd root\fR
+\(oq./passwd root\(cq
instead.
.PP
Another potential issue is that when
@@ -6878,12 +7256,7 @@ do not is often unworkable.
.TP 10n
intercept
.br
-Many systems that support shared libraries have the ability to
-override default library functions by pointing an environment
-variable (usually
-\fRLD_PRELOAD\fR)
-to an alternate shared library.
-On such systems,
+On most systems,
\fBsudo\fR's
\fIintercept\fR
functionality can be used to transparently intercept an attempt to
@@ -6891,74 +7264,88 @@ run a new command, allow or deny it based on
\fIsudoers\fR
rules, and log the result.
For example, this can be used to restrict the commands run from
-within a privileged shell.
+within a privileged shell or editor.
+.sp
+There are two underlying mechanisms that may be used to implement
+\fIintercept\fR
+mode:
+\fIdso\fR
+and
+\fItrace\fR.
+The
+\fIintercept_type\fR
+setting can be used to select between them.
+.sp
+The first mechanism,
+\fIdso\fR,
+overrides the standard C library functions that are used to execute a
+command.
+It does this by setting an environment variable (usually
+\fRLD_PRELOAD\fR)
+to the path of a dynamic shared object, or shared library,
+containing custom versions of the
+execve(2),
+execl(3),
+execle(3),
+execlp(3),
+execv(3),
+execvp(3),
+execvpe(3),
+and
+system(3)
+library functions that connect back to
+\fBsudo\fR
+for a policy decision.
Note, however, that this applies only to dynamically-linked
executables.
It is not possible to intercept commands for statically-linked executables
-or executables that run under binary emulation.
-This implementation of the
+or executables that run under binary emulation this way.
+Because most dynamic loaders ignore
+\fRLD_PRELOAD\fR
+(or the equivalent) when running set-user-ID and set-group-ID programs,
+\fBsudoers\fR
+will not permit such programs to be run in
\fIintercept\fR
-functionality is incompatible with
+mode by default.
+The
+\fIdso\fR
+mechanism is incompatible with
\fBsudo\fR's
SELinux RBAC support (but see below).
SELinux disables
\fRLD_PRELOAD\fR
-by default and interferes with file descriptor inheritance.
+by default and interferes with file descriptor inheritance, which
+\fBsudo\fR
+relies on.
.sp
-Linux systems that support
+The second mechanism,
+\fItrace\fR,
+is available on Linux systems that support
seccomp(2)
-filtering can use a different method involving
+filtering.
+It uses
ptrace(2)
-instead of pre-loading a shared library.
-This method supports both static and dynamic executables as well as
+and
+seccomp(2)
+to intercept the
+execve(2)
+system call instead of pre-loading a dynamic shared object.
+Both static and dynamic executables are supported and it is compatible with
\fBsudo\fR's
SELinux RBAC mode.
-Because it operates at the system call level, not the library function level,
-it is possible to intercept all calls to
-execve(2).
Functions utilizing the
execveat(2)
system call, such as
fexecve(3),
are not currently intercepted.
.sp
-The shared library-based
-\fIintercept\fR
-functionality only works for programs that use the
-\fBexecl\fR(),
-\fBexecle\fR(),
-\fBexeclp\fR(),
-\fBexecv\fR(),
-\fBexecve\fR(),
-\fBexecvp\fR(),
-\fBexecvpe\fR(),
-or
-\fBsystem\fR()
-library functions to run the new command.
-This may be expanded in a future release of
-\fBsudo\fR.
-Because most dynamic loaders ignore
-\fRLD_PRELOAD\fR
-(or the equivalent) when running set-user-ID and set-group-ID programs,
-\fBsudoers\fR
-will not permit such programs to be run in
-\fIintercept\fR
-mode.
-The Linux
-seccomp(2)\-based
-implementation does not share these restrictions.
-.sp
The
\fIintercept\fR
feature is known to work on Solaris, *BSD, Linux, macOS, HP-UX 11.x
and AIX 5.3 and above.
It should be supported on most operating systems that support the
\fRLD_PRELOAD\fR
-environment variable.
-Check your operating system's manual pages for the dynamic linker
-(usually ld.so, ld.so.1, dyld, dld.sl, rld, or loader) to see if
-\fRLD_PRELOAD\fR
-is supported.
+environment variable or an equivalent.
It is not possible to intercept shell built-in commands or restrict
the ability to read or write sensitive files from within a shell.
.sp
@@ -6987,6 +7374,28 @@ you can always just try it out and check whether or not external
commands run via a shell are logged when
\fIintercept\fR
is enabled.
+.sp
+There is an inherent race condition between when a command is checked against
+\fBsudoers\fR
+rules and when it is actually executed.
+If a user is allowed to run arbitrary commands, they may be able
+to change the
+execve(2)
+arguments in the program after the
+\fBsudoers\fR
+policy check has completed but before the new command is executed.
+Starting with version 1.9.12, the
+\fItrace\fR
+method will verify that the command and its arguments have not
+changed after
+execve(2)
+has completed but before execution of the new program has had a chance to run.
+This is not the case with the
+\fIdso\fR
+method.
+See the description of the
+\fIintercept_verify\fR
+setting for more information.
.RE
.TP 10n
log
@@ -7027,26 +7436,26 @@ The
\fInoexec\fR
functionality
is capable of blocking execution of commands run via the
-\fBexecl\fR(),
-\fBexecle\fR(),
-\fBexeclp\fR(),
-\fBexect\fR(),
-\fBexecv\fR(),
-\fBexecve\fR(),
-\fBexecveat\fR(),
-\fBexecvP\fR(),
-\fBexecvp\fR(),
-\fBexecvpe\fR(),
-\fBfexecve\fR(),
-\fBpopen\fR(),
-\fBposix_spawn\fR(),
-\fBposix_spawnp\fR(),
-\fBsystem\fR(),
+execve(2),
+execl(3),
+execle(3),
+execlp(3),
+exect(3),
+execv(3),
+execveat(3),
+execvP(3),
+execvp(3),
+execvpe(3),
+fexecve(3),
+popen(3),
+posix_spawn(3),
+posix_spawnp(3),
+system(3),
and
-\fBwordexp\fR()
+wordexp(3)
functions.
On Linux, a
-\fBseccomp\fR()
+seccomp(2)
filter is used to implement
\fInoexec\fR.
On Solaris 10 and higher,
@@ -7088,9 +7497,11 @@ is enabled.
.RE
.PP
Restricting shell escapes is not a panacea.
-Programs running as root are still capable of many potentially hazardous
-operations (such as changing or overwriting files) that could lead
-to unintended privilege escalation.
+Programs running as
+\fBroot\fR
+are still capable of many potentially hazardous operations (such
+as changing or overwriting files) that could lead to unintended
+privilege escalation.
In the specific case of an editor, a safer approach is to give the
user permission to run
\fBsudoedit\fR
@@ -7143,7 +7554,9 @@ $ sudoedit /etc/motd
.RE
.fi
.PP
-The editor will run as the operator user, not root, on a temporary copy of
+The editor will run as the operator user, not
+\fB@runas_default@\fR,
+on a temporary copy of
\fI/etc/motd\fR.
After the file has been edited,
\fI/etc/motd\fR
@@ -7164,7 +7577,8 @@ not be followed in writable directories and
will refuse to edit a file located in a writable directory
unless the
\fIsudoedit_checkdir\fR
-option has been disabled or the invoking user is root.
+option has been disabled or the invoking user is
+\fBroot\fR.
Additionally, in version 1.8.15 and higher,
\fBsudoedit\fR
will refuse to open a symbolic link unless either the
@@ -7181,8 +7595,10 @@ file.
will check the ownership of its time stamp directory
(\fI@rundir@/ts\fR
by default)
-and ignore the directory's contents if it is not owned by root or
-if it is writable by a user other than root.
+and ignore the directory's contents if it is not owned by
+\fBroot\fR
+or if it is writable by a user other than
+\fBroot\fR.
Older versions of
\fBsudo\fR
stored time stamp files in
@@ -7289,11 +7705,11 @@ The following subsystems are used by the
plugin:
.TP 10n
\fIalias\fR
-\fRUser_Alias\fR,
-\fRRunas_Alias\fR,
-\fRHost_Alias\fR
+\fIUser_Alias\fR,
+\fIRunas_Alias\fR,
+\fIHost_Alias\fR
and
-\fRCmnd_Alias\fR
+\fICmnd_Alias\fR
processing
.TP 10n
\fIall\fR
@@ -7423,7 +7839,7 @@ When using netgroups of machines (as opposed to users), if you
store fully qualified host name in the netgroup (as is usually the
case), you either need to have the machine's host name be fully qualified
as returned by the
-\fRhostname\fR
+\fIhostname\fR
command or use the
\fIfqdn\fR
option in
diff --git a/docs/sudoers.mdoc.in b/docs/sudoers.mdoc.in
index 29aeacfdd..d09f06a99 100644
--- a/docs/sudoers.mdoc.in
+++ b/docs/sudoers.mdoc.in
@@ -25,7 +25,7 @@
.nr BA @BAMAN@
.nr LC @LCMAN@
.nr PS @PSMAN@
-.Dd May 31, 2022
+.Dd October 20, 2022
.Dt SUDOERS @mansectform@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -60,7 +60,7 @@ file to determine which plugins to load.
If no
.Xr sudo.conf @mansectform@
file is present, or if it contains no
-.Li Plugin
+.Em Plugin
lines,
.Nm
will be used for auditing, policy decisions and I/O logging.
@@ -168,16 +168,19 @@ security policy requires that most users authenticate
themselves before they can use
.Nm sudo .
A password is not required
-if the invoking user is root, if the target user is the same as the
-invoking user, or if the policy has disabled authentication for the
-user or command.
+if the invoking user is
+.Sy root ,
+if the target user is the same as the invoking user, or if the
+policy has disabled authentication for the user or command.
Unlike
.Xr su 1 ,
when
.Nm
requires
authentication, it validates the invoking user's credentials, not
-the target user's (or root's) credentials.
+the target user's (or
+.Sy @runas_default@ Ns No 's)
+credentials.
This can be changed via
the
.Em rootpw ,
@@ -195,7 +198,7 @@ used for such mail is configurable via the
.Em mailto
Defaults entry
(described later) and defaults to
-.Li @mailto@ .
+.Em @mailto@ .
.Pp
No mail will be sent if an unauthorized user tries to run
.Nm sudo
@@ -219,7 +222,9 @@ are logged, regardless of whether or not mail is sent.
.Pp
If
.Nm sudo
-is run by root and the
+is run by
+.Sy root
+and the
.Ev SUDO_USER
environment variable
is set, the
@@ -227,7 +232,9 @@ is set, the
policy will use this value to determine who
the actual user is.
This can be used by a user to log commands
-through sudo even when a root shell has been invoked.
+through sudo even when a
+.Sy root
+shell has been invoked.
It also
allows the
.Fl e
@@ -235,7 +242,9 @@ option to remain useful even when invoked via a
sudo-run script or program.
Note, however, that the
.Em sudoers
-file lookup is still done for root, not the user specified by
+file lookup is still done for
+.Sy root ,
+not the user specified by
.Ev SUDO_USER .
.Pp
.Nm
@@ -247,13 +256,10 @@ terminal session ID, the start time of the session leader
(using a monotonic clock if one is available).
The user may then use
.Nm sudo
-without a password for a short period of time
-.Po
-.Li @timeout@
-minutes unless overridden by the
+without a password for a short period of time (@timeout@ minutes
+unless overridden by the
.Em timestamp_timeout
-option
-.Pc .
+option).
By default,
.Nm
uses a separate record for each terminal, which means that
@@ -284,27 +290,17 @@ and
.Em logfile
settings.
See
-.Sx "LOG FORMAT"
+.Sx "EVENT LOGGING"
for a description of the log file format.
.Pp
.Nm
-is also capable of running a command in a pseudo-terminal and logging all
+is also capable of running a command in a pseudo-terminal and logging
input and/or output.
The standard input, standard output, and standard error can be logged
even when not associated with a terminal.
-I/O logging is not on by default but can be enabled using
-the
-.Em log_input
-and
-.Em log_output
-options as well as the
-.Li LOG_INPUT
-and
-.Li LOG_OUTPUT
-command tags.
-See
-.Sx "I/O LOG FILES"
-for details on how I/O log files are stored.
+For more information about I/O logging, see the
+.Sx "I/O LOGGING"
+section.
.Pp
Starting with version 1.9, the
.Em log_servers
@@ -390,7 +386,7 @@ This avoids an inconsistent environment where one of the variables
describing the user name is set to the invoking user and one is
set to the target user.
Environment variables with a value beginning with
-.Li ()
+.Ql ()
are removed unless both the name and value parts are matched by
.Em env_keep
or
@@ -410,7 +406,7 @@ and
options are allowed and their values are
inherited from the invoking process.
Prior to version 1.8.21, environment variables with a value beginning with
-.Li ()
+.Ql ()
were always removed.
Beginning with version 1.8.21, a pattern in
.Em env_delete
@@ -445,7 +441,7 @@ env_keep += "BASH_FUNC_my_func%%=()*"
.Ed
.Pp
Without the
-.Dq Li =()*
+.Ql =()*
suffix, this would not match, as
.Sy bash
shell functions are not preserved by default.
@@ -455,7 +451,9 @@ as modified by global Defaults parameters in
.Em sudoers ,
is displayed when
.Nm sudo
-is run by root with the
+is run by
+.Sy root
+with the
.Fl V
option.
The list of environment variables to remove
@@ -600,7 +598,7 @@ By default,
uses the operating system's native method of setting resource limits
for the target user.
On Linux systems, resource limits are usually set by the
-.Li pam_limits.so
+.Pa pam_limits.so
PAM module.
On some BSD systems, the
.Pa /etc/login.conf
@@ -674,9 +672,10 @@ are only supported by version 1.8.7 or higher.
EBNF is a concise and exact way of describing the grammar of a language.
Each EBNF definition is made up of
.Em production rules .
-E.g.,
-.Pp
-.Li symbol ::= definition | alternate1 | alternate2 ...
+For example:
+.Bd -literal -offset 4n
+symbol ::= definition | alternate1 | alternate2 ...
+.Ed
.Pp
Each
.Em production rule
@@ -689,13 +688,13 @@ Do not, however, confuse them with
.Dq wildcard
characters, which have different meanings.
.Bl -tag -width 4n
-.It Li \&?
+.It \&?
Means that the preceding symbol (or group of symbols) is optional.
That is, it may appear once or not at all.
-.It Li *
+.It *
Means that the preceding symbol (or group of symbols) may appear
zero or more times.
-.It Li +
+.It +
Means that the preceding symbol (or group of symbols) may appear
one or more times.
.El
@@ -707,17 +706,17 @@ we will use single quotes
to designate what is a verbatim character string (as opposed to a symbol name).
.Ss Aliases
There are four kinds of aliases:
-.Li User_Alias ,
-.Li Runas_Alias ,
-.Li Host_Alias
+.Em User_Alias ,
+.Em Runas_Alias ,
+.Em Host_Alias
and
-.Li Cmnd_Alias .
+.Em Cmnd_Alias .
Beginning with
.Nm sudo
1.9.0,
-.Li Cmd_Alias
+.Em Cmd_Alias
may be used in place of
-.Li Cmnd_Alias
+.Em Cmnd_Alias
if desired.
.Bd -literal
Alias ::= 'User_Alias' User_Alias_Spec (':' User_Alias_Spec)* |
@@ -755,25 +754,25 @@ Alias_Type NAME = item1, item2, ...
where
.Em Alias_Type
is one of
-.Li User_Alias ,
-.Li Runas_Alias ,
-.Li Host_Alias ,
+.Em User_Alias ,
+.Em Runas_Alias ,
+.Em Host_Alias ,
or
-.Li Cmnd_Alias .
+.Em Cmnd_Alias .
A
-.Li NAME
+.Dv NAME
is a string of uppercase letters, numbers,
and underscore characters
.Pq Ql _ .
A
-.Li NAME
+.Dv NAME
.Sy must
start with an
uppercase letter.
It is possible to put several alias definitions
of the same type on a single line, joined by a colon
.Pq Ql :\& .
-E.g.,
+For example:
.Bd -literal
Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
.Ed
@@ -802,7 +801,7 @@ User ::= '!'* user name |
.Ed
.Pp
A
-.Li User_List
+.Em User_List
is made up of one or more user names, user-IDs
(prefixed with
.Ql # ) ,
@@ -817,7 +816,7 @@ non-Unix group names and IDs (prefixed with
and
.Ql %:#
respectively), and
-.Li User_Alias Ns es.
+.Em User_Alias Ns es.
Each list item may be prefixed with zero or more
.Ql \&!
operators.
@@ -829,14 +828,14 @@ User netgroups are matched using the user and domain members only;
the host member is not used when matching.
.Pp
A
-.Li user name ,
-.Li user-ID ,
-.Li group ,
-.Li group-ID ,
-.Li netgroup ,
-.Li nonunix_group
+.Em user name ,
+.Em user-ID ,
+.Em group ,
+.Em group-ID ,
+.Em netgroup ,
+.Em nonunix_group
or
-.Li nonunix_gid
+.Em nonunix_gid
may be enclosed in double quotes to avoid the
need for escaping special characters.
Alternately, special characters
@@ -846,9 +845,9 @@ using double quotes, any prefix characters must be included inside
the quotes.
.Pp
The actual
-.Li nonunix_group
+.Em nonunix_group
and
-.Li nonunix_gid
+.Em nonunix_gid
syntax depends on
the underlying group provider plugin.
For instance, the QAS AD plugin supports the following formats:
@@ -889,21 +888,24 @@ Runas_Member ::= '!'* user name |
.Ed
.Pp
A
-.Li Runas_List
+.Em Runas_List
is similar to a
-.Li User_List
+.Em User_List
except that instead
of
-.Li User_Alias Ns es
+.Em User_Alias Ns es
it can contain
-.Li Runas_Alias Ns es .
+.Em Runas_Alias Ns es .
User names and groups are matched as strings.
In other words, two users (groups) with the same user (group) ID
are considered to be distinct.
-If you wish to match all user names with the same user-ID (e.g., root and
-toor), you can use a user-ID instead of a name (#0 in the example given).
+If you wish to match all user names with the same user-ID (e.g.,
+.Sy root
+and
+.Sy toor ) ,
+you can use a user-ID instead of a name (#0 in the example given).
The user-ID or group-ID specified in a
-.Li Runas_Member
+.Em Runas_Member
need not be listed in the password or group database.
.Bd -literal
Host_List ::= Host |
@@ -918,7 +920,7 @@ Host ::= '!'* host name |
.Ed
.Pp
A
-.Li Host_List
+.Em Host_List
is made up of one or more host names, IP addresses,
network numbers, netgroups (prefixed with
.Ql + ) ,
@@ -940,7 +942,7 @@ A host name may include shell-style wildcards (see the
.Sx Wildcards
section below),
but unless the
-.Li host name
+.Em hostname
command on your machine returns the fully
qualified host name, you'll need to use the
.Em fqdn
@@ -987,7 +989,7 @@ Cmnd ::= Digest_List? '!'* command |
.Ed
.Pp
A
-.Li Cmnd_List
+.Em Cmnd_List
is a list of one or more commands, directories, or aliases.
A command is a fully qualified file name, which may include
shell-style wildcards (see the
@@ -1004,7 +1006,7 @@ A directory is a
fully qualified path name ending in a
.Ql / .
When you specify a directory in a
-.Li Cmnd_List ,
+.Em Cmnd_List ,
the user will be able to run any file within that directory
(but not in any sub-directories therein).
If no command line arguments are specified, the user may run the
@@ -1015,19 +1017,19 @@ expression that starts with
and ends with
.Ql $ .
If the command line arguments consist of
-.Li \&"" ,
+.Ql \&"" ,
the command may only be run with
.Em no
arguments.
.Pp
If a
-.Li Cmnd
+.Em Cmnd
has associated command line arguments, the arguments
in the
-.Li Cmnd
+.Em Cmnd
must match those given by the user on the command line.
If the arguments in a
-.Li Cmnd
+.Em Cmnd
begin with the
.Ql ^
character, they will be interpreted as a regular expression
@@ -1042,7 +1044,7 @@ if they are used in command arguments:
.Ql =\& ,
.Ql \e .
To prevent arguments in a
-.Li Cmnd
+.Em Cmnd
that begin with a
.Ql ^
character from being interpreted as a regular expression, the
@@ -1051,7 +1053,7 @@ must be escaped with a
.Ql \e .
.Pp
The built-in command
-.Dq Li sudoedit
+.Dq sudoedit
is used to permit a user to run
.Nm sudo
with the
@@ -1060,7 +1062,7 @@ option (or as
.Nm sudoedit ) .
It may take command line arguments just as a normal command does.
Unlike other commands,
-.Dq Li sudoedit
+.Dq sudoedit
is built into
.Nm sudo
itself and must be specified in the
@@ -1071,27 +1073,27 @@ a leading path.
If a leading path is present, for example
.Pa /usr/bin/sudoedit ,
the path name will be silently converted to
-.Dq Li sudoedit .
+.Dq sudoedit .
A fully-qualified path for
.Nm sudoedit
is treated as an error by
.Nm visudo .
.Pp
A
-.Li command
+.Em command
may be preceded by a
-.Li Digest_List ,
+.Em Digest_List ,
a comma-separated list of one or more
-.Li Digest_Spec
+.Em Digest_Spec
entries.
If a
-.Li Digest_List
+.Em Digest_List
is present, the command will only match successfully if it can be verified
using one of the SHA-2 digests in the list.
Starting with version 1.9.0, the
.Sy ALL
reserved word can be used in conjunction with a
-.Li Digest_List .
+.Em Digest_List .
The following digest formats are supported: sha224, sha256, sha384, and sha512.
The string may be specified in either hex or base64 format
(base64 is more compact).
@@ -1115,7 +1117,7 @@ Warning, if the user has write access to the command itself (directly or via a
command), it may be possible for the user to replace the command after the
digest check has been performed but before the command is executed.
A similar race condition exists on systems that lack the
-.Fn fexecve
+.Xr fexecve 2
system call when the directory in which the command is located
is writable by the user.
See the description of the
@@ -1128,13 +1130,13 @@ Command digests are only supported by version 1.8.7 or higher.
.Ss Defaults
Certain configuration options may be changed from their default
values at run-time via one or more
-.Li Default_Entry
+.Em Default_Entry
lines.
These may affect all users on any host, all users on a specific host, a
specific user, a specific command, or commands being run as a specific user.
Per-command entries may not include command line arguments.
If you need to specify arguments, define a
-.Li Cmnd_Alias
+.Em Cmnd_Alias
and reference
that instead.
.Bd -literal
@@ -1192,16 +1194,16 @@ or
function.
.Pp
Lists have two additional assignment operators,
-.Li +=
+.Ql +=
and
-.Li -= .
+.Ql -= .
These operators are used to add to and delete from a list respectively.
It is not an error to use the
-.Li -=
+.Ql -=
operator to remove an element
that does not exist in a list.
.Pp
-Defaults entries are parsed in the following order: generic, host,
+Defaults entries are parsed in the following order: global, host,
user, and runas Defaults first, then command defaults.
If there are multiple Defaults settings of the same type, the last
matching setting is used.
@@ -1273,28 +1275,30 @@ A
.Sy user specification
determines which commands a user may run
(and as what user) on specified hosts.
-By default, commands are
-run as
-.Sy root ,
-but this can be changed on a per-command basis.
+By default, commands are run as
+.Sy @runas_default@
+(unless
+.Em runas_default
+has been set to a different value)
+but this can also be changed on a per-command basis.
.Pp
The basic structure of a user specification is
.Dq who where = (as_whom) what .
Let's break that down into its constituent parts:
.Ss Runas_Spec
A
-.Li Runas_Spec
+.Em Runas_Spec
determines the user and/or the group that a command
may be run as.
A fully-specified
-.Li Runas_Spec
+.Em Runas_Spec
consists of two
-.Li Runas_List Ns s
+.Em Runas_List Ns s
(as defined above) separated by a colon
.Pq Ql :\&
and enclosed in a set of parentheses.
The first
-.Li Runas_List
+.Em Runas_List
indicates which users the command may be run as via the
.Fl u
option.
@@ -1302,32 +1306,35 @@ The second defines a list of groups that may be specified via the
.Fl g
option (in addition to any of the target user's groups).
If both
-.Li Runas_List Ns s
+.Em Runas_List Ns s
are specified, the command may be run with any combination of users
and groups listed in their respective
-.Li Runas_List Ns s.
+.Em Runas_List Ns s.
If only the first is specified, the command may be run as any user
in the list and, optionally, with any group the target user belongs to.
If the first
-.Li Runas_List
+.Em Runas_List
is empty but the
second is specified, the command may be run as the invoking user
with the group set to any listed in the
-.Li Runas_List .
+.Em Runas_List .
If both
-.Li Runas_List Ns s
+.Em Runas_List Ns s
are empty, the command may only be run as the invoking user and the
group, if specified, must be one that the invoking user is a member of.
If no
-.Li Runas_Spec
-is specified, the command may only be run as
-.Sy root
-and the group, if specified, must be one that
-.Sy root
-is a member of.
+.Em Runas_Spec
+is specified, the command may only be run as the
+.Em runas_default
+user
+.Sy ( @runas_default@
+by default) and the group,
+if specified, must be one that the
+.Em runas_default
+user is a member of.
.Pp
A
-.Li Runas_Spec
+.Em Runas_Spec
sets the default for the commands that follow it.
What this means is that for the entry:
.Bd -literal
@@ -1345,13 +1352,13 @@ on the host
.No boulder Ns \(em Ns but
only as
.Sy operator .
-E.g.,
+For example:
.Bd -literal
$ sudo -u operator /bin/ls
.Ed
.Pp
It is also possible to override a
-.Li Runas_Spec
+.Em Runas_Spec
later on in an entry.
If we modify the entry like so:
.Bd -literal
@@ -1374,7 +1381,7 @@ as
We can extend this to allow
.Sy dgb
to run
-.Li /bin/ls
+.Pa /bin/ls
with either
the user or group set to
.Sy operator :
@@ -1384,7 +1391,7 @@ dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill,\e
.Ed
.Pp
While the group portion of the
-.Li Runas_Spec
+.Em Runas_Spec
permits the
user to run as command with that group, it does not force the user
to do so.
@@ -1409,13 +1416,13 @@ tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu,\e
.Pp
In this example only the group will be set, the command still runs as user
.Sy tcm .
-E.g.\&
+For example:
.Bd -literal
$ sudo -g dialer /usr/bin/cu
.Ed
.Pp
Multiple users and groups may be present in a
-.Li Runas_Spec ,
+.Em Runas_Spec ,
in which case the user may select any combination of users and groups via the
.Fl u
and
@@ -1428,11 +1435,14 @@ alan ALL = (root, bin : operator, system) ALL
.Pp
user
.Sy alan
-may run any command as either user root or bin,
+may run any command as either user
+.Sy root
+or
+.Sy bin ,
optionally setting the group to operator or system.
.Ss Option_Spec
A
-.Li Cmnd
+.Em Cmnd
may have zero or more options associated with it.
Options may consist of
.if \n(SL \{\
@@ -1446,11 +1456,11 @@ Solaris privileges sets,
.\}
start and/or end dates and command timeouts.
Once an option is set for a
-.Li Cmnd ,
+.Em Cmnd ,
subsequent
-.Li Cmnd Ns s
+.Em Cmnd Ns s
in the
-.Li Cmnd_Spec_List ,
+.Em Cmnd_Spec_List ,
inherit that option unless it is overridden by another option.
Option names are reserved words in
.Em sudoers .
@@ -1495,10 +1505,13 @@ alice ALL = (root) APPARMOR_PROFILE=my-profile ALL
.Pp
the user
.Sy alice
-may run any command as root under confinement by the profile
+may run any command as
+.Sy root
+under confinement by the profile
.Ql my-profile .
You can also stack profiles, or allow a user to run commands unconfined by
-any profile. E.g.,
+any profile.
+For example:
.Bd -literal
bob ALL = (root) APPARMOR_PROFILE=foo//&bar /usr/bin/vi
cathy ALL = (root) APPARMOR_PROFILE=unconfined /bin/ls
@@ -1510,7 +1523,9 @@ entries allow user
.Sy bob
to run
.Pa /usr/bin/vi
-as root under the stacked profiles
+as
+.Sy root
+under the stacked profiles
.Ql foo
and
.Ql bar ,
@@ -1563,15 +1578,15 @@ character.
.Ss Date_Spec
.Nm
rules can be specified with a start and end date via the
-.Li NOTBEFORE
+.Dv NOTBEFORE
and
-.Li NOTAFTER
+.Dv NOTAFTER
settings.
The time stamp must be specified in
-.Em Generalized Time
+.Dq Generalized Time
as defined by RFC 4517.
The format is effectively
-.Li yyyymmddHHMMSSZ
+.Ql yyyymmddHHMMSSZ
where the minutes and seconds are optional.
The
.Ql Z
@@ -1602,7 +1617,7 @@ minutes, and seconds with a single-letter case-insensitive suffix
that indicates the unit of time.
For example, a timeout of 7 days, 8 hours, 30 minutes, and
10 seconds would be written as
-.Li 7d8h30m10s .
+.Ql 7d8h30m10s .
If a number is specified without a unit, seconds are assumed.
Any of the days, minutes, hours, or seconds may be omitted.
The order must be from largest to smallest unit and a unit
@@ -1611,23 +1626,23 @@ may not be specified more than once.
The following are all
.Em valid
timeout values:
-.Li 7d8h30m10s ,
-.Li 14d ,
-.Li 8h30m ,
-.Li 600s ,
-.Li 3600 .
+.Ql 7d8h30m10s ,
+.Ql 14d ,
+.Ql 8h30m ,
+.Ql 600s ,
+.Ql 3600 .
The following are
.Em invalid
timeout values:
-.Li 12m2w1d ,
-.Li 30s10m4h ,
-.Li 1d2d3h .
+.Ql 12m2w1d ,
+.Ql 30s10m4h ,
+.Ql 1d2d3h .
.Pp
This setting is only supported by version 1.8.20 or higher.
.Ss Chdir_Spec
The working directory that the command will be run in can be specified
using the
-.Li CWD
+.Dv CWD
setting.
The
.Fa directory
@@ -1649,7 +1664,7 @@ directory, unless the
.Fl i
option is given.
Path names of the form
-.Li ~user/path/name
+.Pa ~user/path/name
are interpreted as being relative to the named user's home directory.
If the user name is omitted, the path will be relative to the runas
user's home directory.
@@ -1658,7 +1673,7 @@ This setting is only supported by version 1.9.3 or higher.
.Ss Chroot_Spec
The root directory that the command will be run in can be specified
using the
-.Li CHROOT
+.Dv CHROOT
setting.
The
.Fa directory
@@ -1682,7 +1697,7 @@ similar to the
.Xr chroot @mansectsu@
utility.
Path names of the form
-.Li ~user/path/name
+.Pa ~user/path/name
are interpreted as being relative to the named user's home directory.
If the user name is omitted, the path will be relative to the runas
user's home directory.
@@ -1691,46 +1706,46 @@ This setting is only supported by version 1.9.3 or higher.
.Ss Tag_Spec
A command may have zero or more tags associated with it.
The following tag values are supported:
-.Li EXEC ,
-.Li NOEXEC ,
-.Li FOLLOW ,
-.Li NOFOLLOW ,
-.Li LOG_INPUT ,
-.Li NOLOG_INPUT ,
-.Li LOG_OUTPUT ,
-.Li NOLOG_OUTPUT ,
-.Li MAIL ,
-.Li NOMAIL ,
-.Li INTERCEPT ,
-.Li NOINTERCEPT ,
-.Li PASSWD ,
-.Li NOPASSWD ,
-.Li SETENV ,
+.Dv EXEC ,
+.Dv NOEXEC ,
+.Dv FOLLOW ,
+.Dv NOFOLLOW ,
+.Dv LOG_INPUT ,
+.Dv NOLOG_INPUT ,
+.Dv LOG_OUTPUT ,
+.Dv NOLOG_OUTPUT ,
+.Dv MAIL ,
+.Dv NOMAIL ,
+.Dv INTERCEPT ,
+.Dv NOINTERCEPT ,
+.Dv PASSWD ,
+.Dv NOPASSWD ,
+.Dv SETENV ,
and
-.Li NOSETENV .
+.Dv NOSETENV .
Once a tag is set on a
-.Li Cmnd ,
+.Em Cmnd ,
subsequent
-.Li Cmnd Ns s
+.Em Cmnd Ns s
in the
-.Li Cmnd_Spec_List ,
+.Em Cmnd_Spec_List ,
inherit the tag unless it is overridden by the opposite tag (in other words,
-.Li PASSWD
+.Dv PASSWD
overrides
-.Li NOPASSWD
+.Dv NOPASSWD
and
-.Li NOEXEC
+.Dv NOEXEC
overrides
-.Li EXEC ) .
+.Dv EXEC ) .
.Bl -hang -width 0n
-.It Em EXEC No and Em NOEXEC
+.It Dv EXEC No and Dv NOEXEC
.sp
If
.Nm sudo
has been compiled with
.Em noexec
support and the underlying operating system supports it, the
-.Li NOEXEC
+.Dv NOEXEC
tag can be used to prevent a dynamically-linked executable from
running further commands itself.
.Pp
@@ -1748,18 +1763,19 @@ aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
See the
.Sx Preventing shell escapes
section below for more details on how
-.Li NOEXEC
+.Dv NOEXEC
works and whether or not it will work on your system.
-.It Em FOLLOW No and Em NOFOLLOW
+.It Dv FOLLOW No and Dv NOFOLLOW
+.sp
Starting with version 1.8.15,
.Nm sudoedit
will not open a file that is a symbolic link unless the
.Em sudoedit_follow
flag is enabled.
The
-.Em FOLLOW
+.Dv FOLLOW
and
-.Em NOFOLLOW
+.Dv NOFOLLOW
tags override the value of
.Em sudoedit_follow
and can be used to permit (or deny) the editing of symbolic links
@@ -1767,27 +1783,21 @@ on a per-command basis.
These tags are only effective for the
.Em sudoedit
command and are ignored for all other commands.
-.It Em LOG_INPUT No and Em NOLOG_INPUT
+.It Dv LOG_INPUT No and Dv NOLOG_INPUT
.sp
These tags override the value of the
.Em log_input
flag on a per-command basis.
-For more information, see the description of
-.Em log_input
-in the
-.Sx SUDOERS OPTIONS
-section below.
-.It Em LOG_OUTPUT No and Em NOLOG_OUTPUT
+For more information, see
+.Sx "I/O LOGGING" .
+.It Dv LOG_OUTPUT No and Dv NOLOG_OUTPUT
.sp
These tags override the value of the
.Em log_output
flag on a per-command basis.
-For more information, see the description of
-.Em log_output
-in the
-.Sx SUDOERS OPTIONS
-section below.
-.It Em MAIL No and Em NOMAIL
+For more information, see
+.Sx "I/O LOGGING" .
+.It Dv MAIL No and Dv NOMAIL
.sp
These tags provide fine-grained control over whether
mail will be sent when a user runs a command by
@@ -1802,7 +1812,7 @@ or
.Fl v
options.
A
-.Em NOMAIL
+.Dv NOMAIL
tag will also override the
.Em mail_always
and
@@ -1816,24 +1826,24 @@ and
in the
.Sx SUDOERS OPTIONS
section below.
-.It Em PASSWD No and Em NOPASSWD
+.It Dv PASSWD No and Dv NOPASSWD
.sp
By default,
.Nm sudo
requires that a user authenticate
before running a command.
This behavior can be modified via the
-.Li NOPASSWD
+.Dv NOPASSWD
tag.
Like a
-.Li Runas_Spec ,
+.Em Runas_Spec ,
the
-.Li NOPASSWD
+.Dv NOPASSWD
tag sets
a default for the commands that follow it in the
-.Li Cmnd_Spec_List .
+.Em Cmnd_Spec_List .
Conversely, the
-.Li PASSWD
+.Dv PASSWD
tag can be used to reverse things.
For example:
.Bd -literal
@@ -1848,7 +1858,7 @@ to run
and
.Pa /usr/bin/lprm
as
-.Sy root
+.Sy @runas_default@
on the machine
.Dq rushmore
without authenticating himself.
@@ -1863,35 +1873,35 @@ ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
.Ed
.Pp
Note, however, that the
-.Li PASSWD
+.Dv PASSWD
tag has no effect on users who are in the group specified by the
.Em exempt_group
setting.
.Pp
By default, if the
-.Li NOPASSWD
+.Dv NOPASSWD
tag is applied to any of a user's entries for the current host,
the user will be able to run
-.Dq Li sudo -l
+.Ql sudo -l
without a password.
Additionally, a user may only run
-.Dq Li sudo -v
+.Ql sudo -v
without a password if all of the user's entries for the current
host have the
-.Li NOPASSWD
+.Dv NOPASSWD
tag.
This behavior may be overridden via the
.Em verifypw
and
.Em listpw
options.
-.It Em SETENV No and Em NOSETENV
+.It Dv SETENV No and Dv NOSETENV
.sp
These tags override the value of the
.Em setenv
flag on a per-command basis.
If
-.Li SETENV
+.Dv SETENV
has been set for a command, the user may disable the
.Em env_reset
flag from the command line via the
@@ -1907,18 +1917,18 @@ As such, only trusted users should be allowed to set variables in this manner.
If the command matched is
.Sy ALL ,
the
-.Li SETENV
+.Dv SETENV
tag is implied for that command; this default may be overridden by use of the
-.Li NOSETENV
+.Dv NOSETENV
tag.
-.It Em INTERCEPT No and Em NOINTERCEPT
+.It Dv INTERCEPT No and Dv NOINTERCEPT
.sp
If
.Nm sudo
has been compiled with
.Em intercept
support and the underlying operating system supports it, the
-.Li INTERCEPT
+.Dv INTERCEPT
tag can be used to cause programs spawned by a command to be validated against
.Em sudoers
and logged just like they would be if run through
@@ -1926,6 +1936,11 @@ and logged just like they would be if run through
directly.
This is useful in conjunction with commands that allow shell escapes
such as editors, shells, and paginators.
+There is additional overhead due to the policy check that may add
+latency when running commands such as shell scripts that execute a
+large number of sub-commands.
+For interactive commands, such as a shell or editor,
+the overhead is not usually noticeable.
.Pp
In the following example, user
.Sy chuck
@@ -1939,7 +1954,7 @@ chuck research = INTERCEPT: ALL
See the
.Sx Preventing shell escapes
section below for more details on how
-.Li INTERCEPT
+.Dv INTERCEPT
works and whether or not it will work on your system.
.El
.Ss Wildcards
@@ -1957,17 +1972,17 @@ and
functions as specified by
.St -p1003.1 .
.Bl -tag -width 8n
-.It Li *
+.It *
Matches any set of zero or more characters (including white space).
-.It Li \&?
+.It \&?
Matches any single character (including white space).
-.It Li [...]
+.It [...]
Matches any character in the specified range.
-.It Li [!...]
+.It [!...]
Matches any character
.Em not
in the specified range.
-.It Li \ex
+.It \ex
For any character
.Sq x ,
evaluates to
@@ -2038,9 +2053,9 @@ below.
.Ss Exceptions to wildcard rules
The following exceptions apply to the above rules:
.Bl -tag -width 8n
-.It Li \&""
+.It \&""
If the empty string
-.Li \&""
+.Ql \&""
is the only command line argument in the
.Em sudoers
file entry it means that command is not allowed to be run with
@@ -2101,7 +2116,11 @@ In the following example, user
.Sy john
can run the
.Xr passwd 1
-command as root on any host but is not allowed to change root's password.
+command as
+.Sy @runas_default@
+on any host but is not allowed to change
+.Sy root Ns No 's
+password.
This kind of rule is impossible to express safely using wildcards.
.Bd -literal -offset 4n
john ALL = /usr/bin/passwd ^[a-zA-Z0-9_]+$,\e
@@ -2132,7 +2151,8 @@ to run the
.Pa /usr/sbin/usermod ,
and
.Pa /usr/sbin/userdel
-commands as root.
+commands as
+.Sy @runas_default@ .
.Bd -literal -offset 4n
sid ALL = ^/usr/sbin/(group|user)(add|mod|del)$
.Ed
@@ -2159,14 +2179,14 @@ It is possible to include other
files from within the
.Em sudoers
file currently being parsed using the
-.Li @include
+.Em @include
and
-.Li @includedir
+.Em @includedir
directives.
For compatibility with sudo versions prior to 1.9.1,
-.Li #include
+.Em #include
and
-.Li #includedir
+.Em #includedir
are also accepted.
.Pp
An include file can be used, for example, to keep a site-wide
@@ -2222,14 +2242,14 @@ For example, if
.Pa /etc/sudoers
contains the line:
.Bd -literal -offset 4n
-.Li @include sudoers.local
+@include sudoers.local
.Ed
.Pp
the file that will be included is
.Pa /etc/sudoers.local .
.Pp
The file name may also include the
-.Li %h
+.Ql %h
escape, signifying the short form of the host name.
In other words, if the machine's host name is
.Dq xerxes ,
@@ -2244,7 +2264,7 @@ to include the file
.Pa /etc/sudoers.xerxes .
.Pp
The
-.Li @includedir
+.Em @includedir
directive can be used to create a
.Pa sudoers.d
directory that the system package manager can drop
@@ -2264,6 +2284,7 @@ or contain a
.Ql .\&
character to avoid causing problems with package manager or editor
temporary/backup files.
+.Pp
Files are parsed in sorted lexical order.
That is,
.Pa /etc/sudoers.d/01_first
@@ -2278,14 +2299,14 @@ Using a consistent number of leading zeroes in the file names can be used
to avoid such problems.
After parsing the files in the directory, control returns to the
file that contained the
-.Li @includedir
+.Em @includedir
directive.
.Pp
Unlike files included via
-.Li @include ,
+.Em @include ,
.Nm visudo
will not edit the files in a
-.Li @includedir
+.Em @includedir
directory unless one of them contains a syntax error.
It is still possible to run
.Nm visudo
@@ -2311,11 +2332,11 @@ is a built-in
.Em alias
that always causes a match to succeed.
It can be used wherever one might otherwise use a
-.Li Cmnd_Alias ,
-.Li User_Alias ,
-.Li Runas_Alias ,
+.Em Cmnd_Alias ,
+.Em User_Alias ,
+.Em Runas_Alias ,
or
-.Li Host_Alias .
+.Em Host_Alias .
Attempting to define an
.Em alias
named
@@ -2328,22 +2349,22 @@ can be dangerous since in a command context, it allows the user to run
command on the system.
.Pp
The following option names permitted in an
-.Li Option_Spec
+.Em Option_Spec
are also considered reserved words:
-.Li CHROOT ,
+.Dv CHROOT ,
.if \n(PS \{\
-.Li PRIVS ,
-.Li LIMITPRIVS ,
+.Dv PRIVS ,
+.Dv LIMITPRIVS ,
.\}
.if \n(SL \{\
-.Li ROLE ,
-.Li TYPE ,
+.Dv ROLE ,
+.Dv TYPE ,
.\}
-.Li TIMEOUT ,
-.Li CWD ,
-.Li NOTBEFORE
+.Dv TIMEOUT ,
+.Dv CWD ,
+.Dv NOTBEFORE
and
-.Li NOTAFTER .
+.Dv NOTAFTER .
Attempting to define an
.Em alias
with the same name as one of the options will result in a syntax error.
@@ -2355,14 +2376,16 @@ can be used as a logical
operator in a list or
.Em alias
as well as in front of a
-.Li Cmnd .
+.Em Cmnd .
This allows one to exclude certain values.
For the
.Ql \&!
operator to be effective, there must be something for it to exclude.
-For example, to match all users except for root one would use:
+For example, to match all users except for
+.Sy root
+one would use:
.Bd -literal -offset 4n
-ALL,!root
+ALL, !root
.Ed
.Pp
If the
@@ -2372,7 +2395,9 @@ is omitted, as in:
!root
.Ed
.Pp
-it would explicitly deny root but not match any other users.
+it would explicitly deny
+.Sy root
+but not match any other users.
This is different from a true
.Dq negation
operator.
@@ -2415,7 +2440,7 @@ when used as part of a word (e.g., a user name or host name):
.Sh SUDOERS OPTIONS
.Nm sudo Ns 's
behavior can be modified by
-.Li Default_Entry
+.Em Default_Entry
lines, as explained earlier.
A list of all supported Defaults parameters, grouped by type, are listed below.
.Pp
@@ -2424,9 +2449,12 @@ A list of all supported Defaults parameters, grouped by type, are listed below.
.It always_query_group_plugin
If a
.Em group_plugin
-is configured, use it to resolve groups of the form %group as long
-as there is not also a system group of the same name.
-Normally, only groups of the form %:group are passed to the
+is configured, use it to resolve groups of the form
+.Ql %group
+as long as there is not also a system group of the same name.
+Normally, only groups of the form
+.Ql %:group
+are passed to the
.Em group_plugin .
This flag is
.Em off
@@ -2437,7 +2465,9 @@ If enabled,
will set the
.Ev HOME
environment variable to the home directory of the target user
-(which is the root user unless the
+(which is the
+.Em runas_default
+user unless the
.Fl u
option is used).
This flag is largely obsolete and has no effect unless the
@@ -2454,9 +2484,9 @@ by default.
If set, users must authenticate themselves via a password (or other
means of authentication) before they may run commands.
This default may be overridden via the
-.Li PASSWD
+.Dv PASSWD
and
-.Li NOPASSWD
+.Dv NOPASSWD
tags.
This flag is
.Em on
@@ -2536,10 +2566,10 @@ automatic restarting of system calls.
Unfortunately, not all operating systems do this by default,
and even those that do may have bugs.
For example, macOS fails to restart the
-.Fn tcgetattr
+.Xr tcgetattr 3
and
-.Fn tcsetattr
-system calls (this is a bug in macOS).
+.Xr tcsetattr 3
+functions (this is a bug in macOS).
Furthermore, because this behavior depends on the command stopping with the
.Dv SIGTTIN
or
@@ -2569,9 +2599,13 @@ or
.Ev EDITOR
environment variables before falling back on the default editor list.
.Nm visudo
-is typically run as root so this flag may allow a user with
+is typically run as
+.Sy root
+so this flag may allow a user with
.Nm visudo
-privileges to run arbitrary commands as root without logging.
+privileges to run arbitrary commands as
+.Sy root
+without logging.
An alternative is to place a colon-separated list of
.Dq safe
editors int the
@@ -2621,22 +2655,24 @@ Any variables in the caller's environment or in the file specified
by the
.Em restricted_env_file
setting that match the
-.Li env_keep
+.Em env_keep
and
-.Li env_check
+.Em env_check
lists are then added, followed by any variables present in the file
specified by the
.Em env_file
setting (if any).
The contents of the
-.Li env_keep
+.Em env_keep
and
-.Li env_check
+.Em env_check
lists, as modified by global Defaults parameters in
.Em sudoers ,
are displayed when
.Nm sudo
-is run by root with the
+is run by
+.Sy root
+with the
.Fl V
option.
If the
@@ -2687,7 +2723,7 @@ Most programs that require a user's password will disable echo before
reading the password to avoid displaying the plaintext password on
the screen.
However, if terminal input is being logged (see
-.Em log_input ) ,
+.Sx "I/O LOGGING" ) ,
the password will still be present in the I/O log.
If the
.Em log_passwords
@@ -2710,8 +2746,8 @@ is set), only the
first character of the password will be replaced in the I/O log.
This option has no effect unless
.Em log_input
-and
-.Em log_input
+or
+.Em log_ttyin
are also set.
This flag is
.Em on
@@ -2722,16 +2758,16 @@ This setting is only supported by version 1.9.10 or higher.
Set this flag if you want to put fully qualified host names in the
.Em sudoers
file when the local host name (as returned by the
-.Li hostname
+.Ql hostname
command) does not contain the domain name.
In other words, instead of myhost you would use myhost.mydomain.edu.
You may still use the short form if you wish (and even mix the two).
This flag is only effective when the
.Dq canonical
host name, as returned by the
-.Fn getaddrinfo
+.Xr getaddrinfo 3
or
-.Fn gethostbyname
+.Xr gethostbyname 3
function, is a fully-qualified domain name.
This is usually the case when the system is configured to use DNS
for host name resolution.
@@ -2778,13 +2814,8 @@ from the network).
Just like with the hosts file, you must use the
.Dq canonical
name as DNS knows it.
-That is, you may not use a host alias
-.Po
-.Li CNAME
-entry
-.Pc
-due to performance issues and the fact that there is no way to get all
-aliases from DNS.
+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.
.Pp
This flag is
.Em @fqdn@
@@ -2807,7 +2838,7 @@ by default.
.It ignore_dot
If set,
.Nm sudo
-will ignore "." or "" (both denoting current directory) in the
+will ignore "." or "" (both denoting the current directory) in the
.Ev PATH
environment variable; the
.Ev PATH
@@ -2843,7 +2874,7 @@ by default.
If set via LDAP, parsing of
.Pa @sysconfdir@/sudoers
will be skipped.
-This is intended for Enterprises that wish to prevent the usage of local
+This is intended for sites that wish to prevent the usage of local
sudoers files so that only LDAP is used.
This thwarts the efforts of rogue operators who would attempt to add roles to
.Pa @sysconfdir@/sudoers .
@@ -2854,7 +2885,7 @@ Since this flag tells
.Nm sudo
how to behave when no specific LDAP entries have been matched, this
sudoOption is only meaningful for the
-.Li cn=defaults
+.Ql cn=defaults
section.
This flag is
.Em off
@@ -2917,19 +2948,14 @@ by default.
.It log_input
If set,
.Nm sudo
-will run the command in a pseudo-terminal and log all user input.
-If the standard input is not connected to the user's tty, due to
-I/O redirection or because the command is part of a pipeline, that
-input is also captured and stored in a separate log file.
-Anything sent to the standard input will be consumed, regardless of
-whether or not the command run via
+will run the command in a pseudo-terminal (if
.Nm sudo
-is actually reading the standard input.
-This may have unexpected results when using
-.Nm sudo
-in a shell script that expects to process the standard input.
+was run from a terminal) and log all user input.
+If the standard input is not connected to the user's terminal, due
+to I/O redirection or because the command is part of a pipeline,
+that input is also logged.
For more information about I/O logging, see the
-.Sx "I/O LOG FILES"
+.Sx "I/O LOGGING"
section.
This flag is
.Em off
@@ -2937,12 +2963,15 @@ by default.
.It log_output
If set,
.Nm sudo
-will run the command in a pseudo-terminal and log all output that is sent
-to the screen, similar to the
-.Xr script 1
-command.
+will run the command in a pseudo-terminal (if
+.Nm sudo
+was run from a terminal) and log all output that is sent to the
+user's terminal, the standard output or the standard error.
+If the standard output or standard error is not connected to the
+user's terminal, due to I/O redirection or because the command is
+part of a pipeline, that output is also logged.
For more information about I/O logging, see the
-.Sx "I/O LOG FILES"
+.Sx "I/O LOGGING"
section.
This flag is
.Em off
@@ -2974,20 +3003,56 @@ This flag is
by default.
.Pp
This setting is only supported by version 1.9.0 or higher.
+.It log_stderr
+If set,
+.Nm sudo
+will log the standard error if it is not connected to the user's terminal.
+This can be used to log output to a pipe or redirected to a file.
+This flag is
+.Em off
+by default but is enabled when either the
+.Em log_output
+flag or the
+.Dv LOG_OUTPUT
+command tag is set.
+.It log_stdin
+If set,
+.Nm sudo
+will log the standard input if it is not connected to the user's terminal.
+This can be used to log input from a pipe or redirected from a file.
+This flag is
+.Em off
+by default but is enabled when either the
+.Em log_input
+flag or the
+.Dv LOG_INPUT
+command tag is set.
+.It log_stdout
+If set,
+.Nm sudo
+will log the standard output if it is not connected to the user's terminal.
+This can be used to log output to a pipe or redirected to a file.
+This flag is
+.Em off
+by default but is enabled when either the
+.Em log_output
+flag or the
+.Dv LOG_OUTPUT
+command tag is set.
.It log_subcmds
If set,
.Nm
will log when a command spawns a child process and executes a program
using the
-.Fn execl ,
-.Fn execle ,
-.Fn execlp ,
-.Fn execv ,
-.Fn execve ,
-.Fn execvp ,
-.Fn execvpe ,
+.Xr execve 2 ,
+.Xr execl 3 ,
+.Xr execle 3 ,
+.Xr execlp 3 ,
+.Xr execv 3 ,
+.Xr execvp 3 ,
+.Xr execvpe 3 ,
or
-.Fn system
+.Xr system 3
library functions.
For example, if a shell is run by
.Nm sudo ,
@@ -3008,6 +3073,36 @@ This setting is only supported by version 1.9.8 or higher
and is incompatible with SELinux RBAC support unless the system supports
.Xr seccomp 2
filter mode.
+.It log_ttyin
+If set,
+.Nm sudo
+will run the command in a pseudo-terminal and log user keystrokes
+sent to the user's terminal, if one is present.
+This flag is
+.Em off
+by default but is enabled when either the
+.Em log_input
+flag or the
+.Dv LOG_INPUT
+command tag is set.
+If no terminal is present, for example when running a remote command using
+.Xr ssh 1 ,
+this flag will have no effect.
+.It log_ttyout
+If set,
+.Nm sudo
+will run the command in a pseudo-terminal and log all output displayed
+on the user's terminal, if one is present.
+This flag is
+.Em off
+by default but is enabled when either the
+.Em log_output
+flag or the
+.Dv LOG_OUTPUT
+command tag is set.
+If no terminal is present, for example when running a remote command using
+.Xr ssh 1 ,
+this flag will have no effect.
.It log_year
If set, the four-digit year will be logged in the (non-syslog)
.Nm sudo
@@ -3114,7 +3209,7 @@ This works well on systems where the number of groups listed in the
.Em sudoers
file is larger than the number of groups a typical user belongs to.
On systems where group lookups are slow, where users may belong
-to a large number of groups, and where the number of groups listed
+to a large number of groups, or where the number of groups listed
in the
.Em sudoers
file is relatively small, it may be prohibitively expensive and
@@ -3160,12 +3255,12 @@ This setting is only supported by version 1.8.18 or higher.
If set, all commands run via
.Nm sudo
will behave as if the
-.Li INTERCEPT
+.Dv INTERCEPT
tag has been set, unless overridden by an
-.Li NOINTERCEPT
+.Dv NOINTERCEPT
tag.
See the description of
-.Em INTERCEPT and NOINTERCEPT
+.Dv INTERCEPT and NOINTERCEPT
above as well as the
.Sx Preventing shell escapes
section at the end of this manual.
@@ -3191,7 +3286,7 @@ is enable.
This flag has no effect unless the
.Em intercept
flag is enabled or the
-.Em INTERCEPT
+.Dv INTERCEPT
tag has been set for the command.
This flag is
.Em on
@@ -3213,22 +3308,64 @@ subsequent commands will need to be authenticated.
This flag has no effect unless the
.Em intercept
flag is enabled or the
-.Em INTERCEPT
+.Dv INTERCEPT
tag has been set for the command.
This flag is
.Em off
by default.
.Pp
This setting is only supported by version 1.9.8 or higher.
+.It intercept_verify
+If set,
+.Nm sudo
+will attempt to verify that a command run in intercept mode has
+the expected path name, command line arguments and environment.
+.Pp
+The process will be stopped after
+.Xr execve 2
+has completed but before the new command has had a chance to run.
+To verify the command,
+.Nm sudo
+will read the command's path from
+.Pa /proc/PID/exe ,
+the command line arguments and environment from the process's memory,
+and compare them against the arguments that were passed to
+.Xr execve 2 .
+In the event of a mismatch, the command will be sent a
+.Dv SIGKILL
+signal and terminated.
+.Pp
+This can help prevent a time of check versus time of use issue with
+intercept mode where the
+.Xr execve 2
+arguments could be altered after the
+.Nm
+policy check.
+The checks can only be performed if the
+.Xr proc @mansectform@
+file system is available.
+This flag has no effect unless the
+.Em intercept
+flag is enabled or the
+.Dv INTERCEPT
+tag has been set for the command and the
+.Em intercept_type
+option is set to
+.Em trace .
+This flag is
+.Em on
+by default.
+.Pp
+This setting is only supported by version 1.9.12 or higher.
.It netgroup_tuple
If set, netgroup lookups will be performed using the full netgroup
tuple: host name, user name, and domain (if one is set).
Historically,
.Nm sudo
only matched the user name and domain for netgroups used in a
-.Li User_List
+.Em User_List
and only matched the host name and domain for netgroups used in a
-.Li Host_List .
+.Em Host_List .
This flag is
.Em off
by default.
@@ -3236,12 +3373,12 @@ by default.
If set, all commands run via
.Nm sudo
will behave as if the
-.Li NOEXEC
+.Dv NOEXEC
tag has been set, unless overridden by an
-.Li EXEC
+.Dv EXEC
tag.
See the description of
-.Em EXEC and NOEXEC
+.Dv EXEC and NOEXEC
above as well as the
.Sx Preventing shell escapes
section at the end of this manual.
@@ -3438,17 +3575,23 @@ This flag is
.Em off
by default.
.It root_sudo
-If set, root is allowed to run
+If set,
+.Sy root
+is allowed to run
.Nm sudo
too.
Disabling this prevents users from
.Dq chaining
.Nm sudo
-commands to get a root shell by doing something like
-.Dq Li sudo sudo /bin/sh .
+commands to get a
+.Sy root
+shell by doing something like
+.Ql sudo sudo /bin/sh .
Note, however, that turning off
.Em root_sudo
-will also prevent root from running
+will also prevent
+.Sy root
+from running
.Nm sudoedit .
Disabling
.Em root_sudo
@@ -3459,7 +3602,9 @@ by default.
.It rootpw
If set,
.Nm sudo
-will prompt for the root password instead of the password of the invoking user
+will prompt for the
+.Sy root
+password instead of the password of the invoking user
when running a command or editing a file.
This flag is
.Em off
@@ -3468,7 +3613,7 @@ by default.
If enabled, allow matching of runas user and group IDs that are
not present in the password or group databases.
In addition to explicitly matching unknown user or group IDs in a
-.Li Runas_List ,
+.Em Runas_List ,
this option also allows the
.Sy ALL
alias to match unknown IDs.
@@ -3486,7 +3631,7 @@ If enabled,
will only run commands as a user whose shell appears in the
.Pa /etc/shells
file, even if the invoking user's
-.Li Runas_List
+.Em Runas_List
would otherwise permit it.
If no
.Pa /etc/shells
@@ -3506,7 +3651,7 @@ If set,
will prompt for the password of the user defined by the
.Em runas_default
option (defaults to
-.Li @runas_default@ )
+.Sy @runas_default@ )
instead of the password of the invoking user
when running a command or editing a file.
This flag is
@@ -3529,7 +3674,9 @@ is invoked with the
option, the
.Ev HOME
environment variable will be set to the home directory of the target
-user (which is the root user unless the
+user (which is the
+.Em runas_default
+user unless the
.Fl u
option is used).
This flag is largely obsolete and has no effect unless the
@@ -3549,7 +3696,9 @@ will set the
.Ev LOGNAME
and
.Ev USER
-environment variables to the name of the target user (usually root unless the
+environment variables to the name of the target user (the user specified by
+.Em runas_default
+unless the
.Fl u
option is given).
However, since some programs (including the RCS revision control system) use
@@ -3581,6 +3730,11 @@ A pseudo-terminal is allocated by
when it is running in a terminal and one or more of the
.Em log_input ,
.Em log_output ,
+.Em log_stdin ,
+.Em log_stdout ,
+.Em log_stderr ,
+.Em log_ttyin ,
+.Em log_ttyout ,
or
.Em use_pty
flags is enabled.
@@ -3611,7 +3765,9 @@ If set and
is invoked with no arguments it acts as if the
.Fl s
option had been given.
-That is, it runs a shell as root (the shell is determined by the
+That is, it runs a shell as
+.Sy root
+(the shell is determined by the
.Ev SHELL
environment variable if it is set, falling back on the shell listed
in the invoking user's /etc/passwd entry if not).
@@ -3622,7 +3778,9 @@ by default.
Normally, when
.Nm sudo
executes a command the real and effective user-IDs are set to the target
-user (root by default).
+user
+.Sy ( @runas_default@
+by default).
This option changes that behavior such that the real user-ID is left
as the invoking user's user-ID.
In other words, this makes
@@ -3648,7 +3806,8 @@ Symbolic links will not be followed in writable directories and
will refuse to edit a file located in a writable directory.
These restrictions are not enforced when
.Nm sudoedit
-is run by root.
+is run by
+.Sy root .
On some systems, if all directory components of the path to be edited
are not readable by the target user,
.Nm sudoedit
@@ -3671,9 +3830,9 @@ option can be enabled to allow
.Nm sudoedit
to open symbolic links.
It may be overridden on a per-command basis by the
-.Em FOLLOW
+.Dv FOLLOW
and
-.Em NOFOLLOW
+.Dv NOFOLLOW
tags.
This flag is
.Em off
@@ -3695,8 +3854,8 @@ If set,
will prompt for the password of the user specified
by the
.Fl u
-option (defaults to
-.Li root )
+option (defaults to the value of
+.Em runas_default )
instead of the password of the invoking user
when running a command or editing a file.
This flag precludes the use of a user-ID not listed in the passwd
@@ -3795,7 +3954,7 @@ If a timeout is specified both in the
.Pa sudoers
file and on the command line, the smaller of the two timeouts will be used.
See the
-.Li Timeout_Spec
+.Em Timeout_Spec
section for a description of the timeout syntax.
This flag is
.Em off
@@ -3823,7 +3982,7 @@ flag is set,
.Nm sudo
will prompt for a password even when it would be visible on the screen.
This makes it possible to run things like
-.Dq Li ssh somehost sudo ls
+.Ql ssh somehost sudo ls
since by default,
.Xr ssh 1
does
@@ -3844,13 +4003,12 @@ The
.Em closefrom
option can be used to specify a different file descriptor at which
to start closing.
-The default is
-.Li 3 .
+The default is 3.
.It command_timeout
The maximum amount of time a command is allowed to run before
it is terminated.
See the
-.Li Timeout_Spec
+.Em Timeout_Spec
section for a description of the timeout syntax.
.Pp
This setting is only supported by version 1.8.20 or higher.
@@ -3858,19 +4016,19 @@ This setting is only supported by version 1.8.20 or higher.
The maximum amount of time to wait when connecting to a log server
or waiting for a server response.
See the
-.Li Timeout_Spec
+.Em Timeout_Spec
section for a description of the timeout syntax.
The default value is 30 seconds.
.Pp
This setting is only supported by version 1.9.0 or higher.
.It maxseq
The maximum sequence number that will be substituted for the
-.Dq Li %{seq}
+.Ql %{seq}
escape in the I/O log file (see the
.Em iolog_dir
description below for more information).
While the value substituted for
-.Dq Li %{seq}
+.Ql %{seq}
is in base 36,
.Em maxseq
itself should be expressed in decimal.
@@ -3893,8 +4051,7 @@ This setting is only supported by version 1.8.7 or higher.
The number of tries a user gets to enter his/her password before
.Nm sudo
logs the failure and exits.
-The default is
-.Li @passwd_tries@ .
+The default is @passwd_tries@.
.It syslog_maxlen
On many systems,
.Xr syslog 3
@@ -3926,40 +4083,28 @@ This setting is only supported by version 1.8.19 or higher.
Number of characters per line for the file log.
This value is used to decide when to wrap lines for nicer log files.
This has no effect on the syslog log file, only the file log.
-The default is
-.Li @loglen@
-(use 0 or negate the option to disable word wrap).
+The default is @loglen@ (use 0 or negate the option to disable word wrap).
.It passwd_timeout
Number of minutes before the
.Nm sudo
-password prompt times out, or
-.Li 0
-for no timeout.
+password prompt times out, or 0 for no timeout.
The timeout may include a fractional component
-if minute granularity is insufficient, for example
-.Li 2.5 .
-The
-default is
-.Li @password_timeout@ .
+if minute granularity is insufficient, for example 2.5.
+The default is @password_timeout@.
.It timestamp_timeout
Number of minutes that can elapse before
.Nm sudo
will ask for a password again.
The timeout may include a fractional component if
-minute granularity is insufficient, for example
-.Li 2.5 .
-The default is
-.Li @timeout@ .
-Set this to
-.Li 0
-to always prompt for a password.
-If set to a value less than
-.Li 0
-the user's time stamp will not expire until the system is rebooted.
+minute granularity is insufficient, for example 2.5.
+The default is @timeout@.
+Set this to 0 to always prompt for a password.
+If set to a value less than 0 the user's time stamp will not expire
+until the system is rebooted.
This can be used to allow users to create or delete their own time stamps via
-.Dq Li sudo -v
+.Ql sudo -v
and
-.Dq Li sudo -k
+.Ql sudo -k
respectively.
.It umask
File mode creation mask to use when running the command.
@@ -3971,10 +4116,8 @@ Unless the
flag is set, the actual umask will be the union of the
user's umask and the value of the
.Em umask
-setting, which defaults to
-.Li @sudo_umask@ .
-This guarantees
-that
+setting, which defaults to @sudo_umask@.
+This guarantees that
.Nm sudo
never lowers the umask when running a command.
.Pp
@@ -4004,7 +4147,7 @@ The default
can be overridden for individual
.Em sudoers
entries by specifying the
-.Em APPARMOR_PROFILE
+.Dv APPARMOR_PROFILE
option.
This option is only available when sudo is built with AppArmor
support.
@@ -4015,16 +4158,16 @@ The message may include the
.Ql %d
escape which will expand to the number of failed password attempts.
If set, it overrides the default message,
-.Li %d incorrect password attempt(s) .
+.Dq %d incorrect password attempt(s) .
.It badpass_message
Message that is displayed if a user enters an incorrect password.
The default is
-.Li @badpass_message@
+.Dq @badpass_message@
unless insults are enabled.
.It editor
A colon
.Pq Ql :\&
-separated list of editors path names used by
+separated list of editor path names used by
.Nm sudoedit
and
.Nm visudo .
@@ -4072,15 +4215,15 @@ It has the following possible values:
.Bl -tag -width 6n
.It dso
Preload a dynamic shared object (shared library) that intercepts the
-.Fn execl ,
-.Fn execle ,
-.Fn execlp ,
-.Fn execv ,
-.Fn execve ,
-.Fn execvp ,
-.Fn execvpe ,
+.Xr execve 2 ,
+.Xr execl 3 ,
+.Xr execle 3 ,
+.Xr execlp 3 ,
+.Xr execv 3 ,
+.Xr execvp 3 ,
+.Xr execvpe 3 ,
and
-.Fn system
+.Xr system 3
library functions.
A value of
.Em dso
@@ -4122,9 +4265,9 @@ Only used if the
or
.Em log_output
options are enabled or when the
-.Li LOG_INPUT
+.Dv LOG_INPUT
or
-.Li LOG_OUTPUT
+.Dv LOG_OUTPUT
tags are present for a command.
The session sequence number, if any, is stored in the directory.
The default is
@@ -4134,23 +4277,25 @@ The following percent
.Pq Ql %
escape sequences are supported:
.Bl -tag -width 4n
-.It Li %{seq}
+.It %{seq}
expanded to a monotonically increasing base-36 sequence number, such as 0100A5,
where every two digits are used to form a new directory, e.g.,
.Pa 01/00/A5
-.It Li %{user}
+.It %{user}
expanded to the invoking user's login name
-.It Li %{group}
+.It %{group}
expanded to the name of the invoking user's real group-ID
-.It Li %{runas_user}
+.It %{runas_user}
expanded to the login name of the user the command will
-be run as (e.g., root)
-.It Li %{runas_group}
+be run as (e.g.,
+.Sy root )
+.It %{runas_group}
expanded to the group name of the user the command will
-be run as (e.g., wheel)
-.It Li %{hostname}
+be run as (e.g.,
+.Sy wheel )
+.It %{hostname}
expanded to the local host name without the domain name
-.It Li %{command}
+.It %{command}
expanded to the base name of the command being run
.El
.Pp
@@ -4171,14 +4316,14 @@ in which to store input/output logs when the
or
.Em log_output
options are enabled or when the
-.Li LOG_INPUT
+.Dv LOG_INPUT
or
-.Li LOG_OUTPUT
+.Dv LOG_OUTPUT
tags are present for a command.
.Em iolog_file
may contain directory components.
The default is
-.Dq Li %{seq} .
+.Ql %{seq} .
.Pp
See the
.Em iolog_dir
@@ -4188,9 +4333,9 @@ escape sequences.
.Pp
In addition to the escape sequences, path names that end in six or
more
-.Li X Ns s
+.Em X Ns s
will have the
-.Li X Ns s
+.Em X Ns s
replaced with a unique combination of digits and letters, similar to the
.Xr mktemp 3
function.
@@ -4204,7 +4349,7 @@ overwritten unless
.Em iolog_file
ends in six or
more
-.Li X Ns s .
+.Em X Ns s .
.It iolog_flush
If set,
.Nm sudo
@@ -4320,7 +4465,7 @@ For
.Nm sudo_logsrvd ,
client certificate validation is controlled by the
.Em tls_checkpeer
-option, which defaults to
+flag, which defaults to
.Em false .
.Pp
This setting is only supported by version 1.9.0 or higher.
@@ -4329,10 +4474,10 @@ Subject of the mail sent to the
.Em mailto
user.
The escape
-.Li %h
+.Ql %h
will expand to the host name of the machine.
Default is
-.Dq Li @mailsub@ .
+.Dq @mailsub@ .
.It noexec_file
As of
.Nm sudo
@@ -4346,9 +4491,9 @@ name used when the
.Fl A
option is specified.
The default value is either
-.Dq Li @pam_service@
+.Ql @pam_service@
or
-.Dq Li @pam_login_service@ ,
+.Ql @pam_login_service@ ,
depending on whether or not the
.Fl i
option is also specified.
@@ -4363,7 +4508,7 @@ name used when the
.Fl i
option is specified.
The default value is
-.Dq Li @pam_login_service@ .
+.Ql @pam_login_service@ .
See the description of
.Em pam_service
for more information.
@@ -4378,7 +4523,7 @@ file or a file in the
.Pa /etc/pam.d
directory.
The default value is
-.Dq Li sudo .
+.Ql sudo .
.Pp
This setting is only supported by version 1.8.8 or higher.
.It passprompt
@@ -4391,14 +4536,14 @@ The following percent
.Pq Ql %
escape sequences are supported:
.Bl -tag -width 4n
-.It Li %H
+.It %H
expanded to the local host name including the domain name
(only if the machine's host name is fully qualified or the
.Em fqdn
option is set)
-.It Li %h
+.It %h
expanded to the local host name without the domain name
-.It Li %p
+.It %p
expanded to the user whose password is being asked for (respects the
.Em rootpw ,
.Em targetpw
@@ -4406,16 +4551,17 @@ and
.Em runaspw
flags in
.Em sudoers )
-.It Li \&%U
+.It \&%U
expanded to the login name of the user the command will
-be run as (defaults to root)
-.It Li %u
+be run as (defaults to
+.Sy @runas_default@ )
+.It %u
expanded to the invoking user's login name
-.It Li %%
+.It %%
two consecutive
-.Li %
+.Ql %
characters are collapsed into a single
-.Li %
+.Ql %
character
.El
.Pp
@@ -4433,7 +4579,7 @@ The
flag can be used to change this behavior.
.Pp
The default value is
-.Dq Li "@passprompt@" .
+.Ql "@passprompt@" .
.if \n(PS \{\
.It privs
The default Solaris privileges to use when constructing a new
@@ -4468,13 +4614,13 @@ The default user to run commands as if the
.Fl u
option is not specified on the command line.
This defaults to
-.Li @runas_default@ .
+.Sy @runas_default@ .
.It sudoers_locale
Locale to use when parsing the sudoers file, logging commands, and
sending email.
Changing the locale may affect how sudoers is interpreted.
Defaults to
-.Dq Li C .
+.Ql C .
.It timestamp_type
.Nm
uses per-user time stamp files for credential caching.
@@ -4495,11 +4641,7 @@ process ID (usually the shell).
Commands run from the same shell (or other common parent process)
will not require a password for
.Em timestamp_timeout
-minutes
-.Po
-.Li @timeout@
-by default
-.Pc .
+minutes (@timeout@ by default).
Commands run via
.Nm sudo
with a different parent process ID, for example from a shell script,
@@ -4511,11 +4653,7 @@ If no terminal is present, the behavior is the same as
.Em ppid .
Commands run from the same terminal will not require a password for
.Em timestamp_timeout
-minutes
-.Po
-.Li @timeout@
-by default
-.Pc .
+minutes (@timeout@ by default).
.It kernel
The time stamp is stored in the kernel as an attribute of the terminal
device.
@@ -4544,7 +4682,7 @@ The default is
The owner of the lecture status directory, time stamp directory and all
files stored therein.
The default is
-.Li root .
+.Sy root .
.if \n(SL \{\
.It type
The default SELinux type to use when constructing a new security
@@ -4576,16 +4714,16 @@ is configured with the
.Li --enable-admin-flag
option.
The default value is
-.Li ~/.sudo_as_admin_successful .
+.Pa ~/.sudo_as_admin_successful .
.It env_file
The
.Em env_file
option specifies the fully qualified path to a file containing variables
to be set in the environment of the program being run.
Entries in this file should either be of the form
-.Dq Li VARIABLE=value
+.Ql VARIABLE=value
or
-.Dq Li export VARIABLE=value .
+.Ql export VARIABLE=value .
The value may optionally be enclosed in single or double quotes.
Variables in this file are only added if the variable does not already
exist in the environment.
@@ -4599,7 +4737,7 @@ and
.It exempt_group
Users in this group are exempt from password and PATH requirements.
The group name specified should not include a
-.Li %
+.Ql %
prefix.
This is not set by default.
.It fdexec
@@ -4646,7 +4784,7 @@ alias.
.Pp
This setting is only supported by version 1.8.20 or higher.
If the operating system does not support the
-.Fn fexecve
+.Xr fexecve 2
system call, this setting has no effect.
.It group_plugin
A string containing a
@@ -4660,6 +4798,34 @@ These arguments (if any) will be passed to the plugin's initialization function.
If arguments are present, the string must be enclosed in double quotes
.Pq \&"" .
.Pp
+On 64-bit systems, if the plugin is present but cannot be loaded,
+.Nm
+will look for a 64-bit version and, if it exists, load that as a fallback.
+The exact rules for this vary by system.
+On Solaris, if the plugin is stored in a directory ending in
+.Dq lib ,
+.Nm
+will create a fallback path by appending
+.Dq /64
+to the directory name;
+.Pa /usr/lib/sudo_plugin.so
+becomes
+.Pa /usr/lib/64/sudo_plugin.so .
+On Linux, a directory ending in
+.Dq lib
+will be transformed to
+.Dq lib64
+as the fallback path;
+.Pa /usr/lib/sudo_plugin.so
+becomes
+.Pa /usr/lib64/sudo_plugin.so .
+On all other systems, the fallback path is generated by adding a
+.Dq 64
+before the file extension;
+.Pa sudo_plugin.so
+becomes
+.Pa sudo_plugin64.so .
+.Pp
For more information see
.Sx "GROUP PROVIDER PLUGINS" .
.It lecture
@@ -4705,7 +4871,7 @@ All the user's
.Em sudoers
file entries for the current host must have
the
-.Li NOPASSWD
+.Dv NOPASSWD
flag set to avoid entering a password.
.It always
The user must always enter a password to use the
@@ -4716,7 +4882,7 @@ At least one of the user's
.Em sudoers
file entries for the current host
must have the
-.Li NOPASSWD
+.Dv NOPASSWD
flag set to avoid entering a password.
.It never
The user need never enter a password to use the
@@ -4745,7 +4911,7 @@ Due to limitations of the protocol, JSON events sent via
may be truncated.
.It sudo
Traditional sudo-style logs, see
-.Sx "LOG FORMAT"
+.Sx "EVENT LOGGING"
for a description of the log file format.
.El
.Pp
@@ -4783,7 +4949,7 @@ The address should be enclosed in double quotes
to protect against
.Nm sudo
interpreting the
-.Li @
+.Ql @
sign.
Defaults to the name of the user running
.Nm sudo .
@@ -4796,10 +4962,9 @@ The address should be enclosed in double quotes
to protect against
.Nm sudo
interpreting the
-.Li @
+.Ql @
sign.
-Defaults to
-.Li @mailto@ .
+Defaults to @mailto@.
.It rlimit_as
The maximum size to which the process's address space may grow (in bytes),
if supported by the operating system.
@@ -4865,9 +5030,9 @@ The
option specifies the fully qualified path to a file containing variables
to be set in the environment of the program being run.
Entries in this file should either be of the form
-.Dq Li VARIABLE=value
+.Ql VARIABLE=value
or
-.Dq Li export VARIABLE=value .
+.Ql export VARIABLE=value .
The value may optionally be enclosed in single or double quotes.
Variables in this file are only added if the variable does not already
exist in the environment.
@@ -4911,7 +5076,7 @@ It is only possible to use
.Em runchroot
as a command-specific Defaults setting if the command exists with
the same path both inside and outside the chroot jail.
-This restriction does not apply to generic, host, or user-based
+This restriction does not apply to global, host, or user-based
Defaults settings or to a
.Em Cmnd_Spec
that includes a
@@ -4953,8 +5118,7 @@ This option is @secure_path@ by default.
.It syslog
Syslog facility if syslog is being used for logging (negate to
disable syslog logging).
-Defaults to
-.Li @logfac@ .
+Defaults to @logfac@.
.Pp
The following syslog facilities are supported:
.Sy authpriv
@@ -4975,8 +5139,7 @@ and
.It syslog_badpri
Syslog priority to use when the user is not allowed to run a command or
when authentication is unsuccessful.
-Defaults to
-.Li @badpri@ .
+Defaults to @badpri@.
.Pp
The following syslog priorities are supported:
.Sy alert ,
@@ -4995,8 +5158,7 @@ will disable logging of unsuccessful commands.
.It syslog_goodpri
Syslog priority to use when the user is allowed to run a command and
authentication is successful.
-Defaults to
-.Li @goodpri@ .
+Defaults to @goodpri@.
.Pp
See
.Em syslog_badpri
@@ -5016,7 +5178,7 @@ It has the following possible values:
All the user's
.Em sudoers
file entries for the current host must have the
-.Li NOPASSWD
+.Dv NOPASSWD
flag set to avoid entering a password.
.It always
The user must always enter a password to use the
@@ -5026,7 +5188,7 @@ option.
At least one of the user's
.Em sudoers
file entries for the current host must have the
-.Li NOPASSWD
+.Dv NOPASSWD
flag set to avoid entering a password.
.It never
The user need never enter a password to use the
@@ -5051,7 +5213,7 @@ Environment variables to be removed from the user's environment
unless they are considered
.Dq safe .
For all variables except
-.Li TZ ,
+.Ev TZ ,
.Dq safe
means that the variable's value does not contain any
.Ql %
@@ -5061,7 +5223,7 @@ characters.
This can be used to guard against printf-style format vulnerabilities
in poorly-written programs.
The
-.Li TZ
+.Ev TZ
variable is considered unsafe if any of the following are true:
.Bl -bullet -width 1n
.It
@@ -5079,28 +5241,29 @@ path element.
It contains white space or non-printable characters.
.It
It is longer than the value of
-.Li PATH_MAX .
+.Dv PATH_MAX .
.El
.Pp
The argument may be a double-quoted, space-separated list or a
single value without double-quotes.
The list can be replaced, added to, deleted from, or disabled by using
the
-.Li = ,
-.Li += ,
-.Li -= ,
+.Ql = ,
+.Ql += ,
+.Ql -= ,
and
-.Li \&!
+.Ql \&!
operators respectively.
Regardless of whether the
-.Li env_reset
+.Em env_reset
option is enabled or disabled, variables specified by
-.Li env_check
+.Em env_check
will be preserved in the environment if they pass the aforementioned check.
The global list of environment variables to check is displayed when
.Nm sudo
-is run by root with
-the
+is run by
+.Sy root
+with the
.Fl V
option.
.It env_delete
@@ -5110,15 +5273,17 @@ option is not in effect.
The argument may be a double-quoted, space-separated list or a
single value without double-quotes.
The list can be replaced, added to, deleted from, or disabled by using the
-.Li = ,
-.Li += ,
-.Li -= ,
+.Ql = ,
+.Ql += ,
+.Ql -= ,
and
-.Li \&!
+.Ql \&!
operators respectively.
The global list of environment variables to remove is displayed when
.Nm sudo
-is run by root with the
+is run by
+.Sy root
+with the
.Fl V
option.
Many operating systems will remove potentially dangerous variables
@@ -5134,16 +5299,18 @@ processes will receive.
The argument may be a double-quoted, space-separated list or a
single value without double-quotes.
The list can be replaced, added to, deleted from, or disabled by using the
-.Li = ,
-.Li += ,
-.Li -= ,
+.Ql = ,
+.Ql += ,
+.Ql -= ,
and
-.Li \&!
+.Ql \&!
operators respectively.
The global list of variables to keep
is displayed when
.Nm sudo
-is run by root with the
+is run by
+.Sy root
+with the
.Fl V
option.
.Pp
@@ -5235,7 +5402,7 @@ plugin supports its own plugin interface to allow non-Unix
group lookups which can query a group source other
than the standard Unix group database.
This can be used to implement support for the
-.Li nonunix_group
+.Em nonunix_group
syntax described earlier.
.Pp
Group provider plugins are specified via the
@@ -5270,9 +5437,9 @@ Defaults group_plugin="group_file.so /etc/sudo-group"
The
.Em system_group
plugin supports group lookups via the standard C library functions
-.Fn getgrnam
+.Xr getgrnam 3
and
-.Fn getgrid .
+.Xr getgrid 3 .
This plugin can be used in instances where the user belongs to
groups not present in the user's supplemental group vector.
This plugin takes no options:
@@ -5283,7 +5450,7 @@ Defaults group_plugin=system_group.so
.Pp
The group provider plugin API is described in detail in
.Xr sudo_plugin @mansectform@ .
-.Sh LOG FORMAT
+.Sh EVENT LOGGING
.Nm
can log events in either JSON or
.Em sudo
@@ -5372,7 +5539,7 @@ The actual command that was executed.
Messages are logged using the locale specified by
.Em sudoers_locale ,
which defaults to the
-.Dq Li C
+.Ql C
locale.
.Ss Denied command log entries
If the user is not allowed to run the command, the reason for the denial
@@ -5455,11 +5622,11 @@ is the user-ID that owns the
.Em sudoers
file) to the end of the
.Nm
-.Li Plugin
+.Em Plugin
line in the
.Xr sudo.conf @mansectform@
file.
-.It unable to stat @sysconfdir@/sudoers
+.It unable to open @sysconfdir@/sudoers
The
.Pa @sysconfdir@/sudoers
file is missing.
@@ -5481,7 +5648,7 @@ is the user-ID that owns the
.Em sudoers
file) to the
.Nm
-.Li Plugin
+.Em Plugin
line in the
.Xr sudo.conf @mansectform@
file.
@@ -5497,7 +5664,7 @@ The default mode may be changed via the
.Dq sudoers_mode
option to the
.Nm
-.Li Plugin
+.Em Plugin
line in the
.Xr sudo.conf @mansectform@
file.
@@ -5515,7 +5682,7 @@ is the group-ID that owns the
.Em sudoers
file) to the
.Nm
-.Li Plugin
+.Em Plugin
line in the
.Xr sudo.conf @mansectform@
file.
@@ -5524,7 +5691,9 @@ file.
was unable to read or create the user's time stamp file.
This can happen when
.Em timestampowner
-is set to a user other than root and the mode on
+is set to a user other than
+.Sy root
+and the mode on
.Pa @rundir@
is not searchable by group or other.
The default mode for
@@ -5559,7 +5728,7 @@ The
and
.Em progname
fields are added by the system's
-.Fn syslog
+.Xr syslog 3
function, not
.Nm
itself.
@@ -5611,11 +5780,53 @@ option is set to 0 (or negated with a
.Ql \&! ) ,
word wrap will be disabled.
.El
-.Sh I/O LOG FILES
+.Sh I/O LOGGING
When I/O logging is enabled,
.Nm sudo
-will run the command in a pseudo-terminal and log all user input and/or output,
-depending on which options are enabled.
+will runs the command in a pseudo-terminal, logging user input
+and/or output, depending on which
+.Nm
+flags are enabled.
+There are five distinct types of I/O that can be logged, each with
+a corresponding
+.Nm
+flag.
+.Bl -column "standard output" "log_output" "command output displayed to the screen"
+.It Sy Type Ta Sy Flag Ta Sy Description
+.It terminal input Ta log_ttyin Ta keystrokes entered by the user
+.It terminal output Ta log_ttyout Ta command output displayed to the screen
+.It standard input Ta log_stdin Ta input from a pipe or a file
+.It standard output Ta log_stdout Ta output to a pipe or a file
+.It standard error Ta log_stderr Ta output to a pipe or a file
+.El
+.Pp
+In addition to flags described the above, the
+.Em log_input
+flag and
+.Dv LOG_INPUT
+command tag set both
+.Em log_ttyin
+and
+.Em log_stdin .
+The
+.Em log_output
+flag and
+.Dv LOG_OUTPUT
+command tag set
+.Em log_ttyout ,
+.Em log_stdout ,
+and
+.Em log_stderr .
+.Pp
+To capture terminal input and output,
+.Nm sudo
+run the command in a pseudo-terminal, logging the input and
+output before passing it on to the user.
+To capture the standard input, standard output or standard error,
+.Nm sudo
+uses a pipe to interpose itself between the input or output stream,
+logging the I/O before passing it to the other end of the pipe.
+.Pp
I/O can be logged either to the local machine or to a remote log server.
For local logs, I/O is logged to the directory specified by the
.Em iolog_dir
@@ -5627,7 +5838,7 @@ by default
using a unique session ID that is included in the
.Nm sudo
log line, prefixed with
-.Dq Li TSID= .
+.Ql TSID= .
The
.Em iolog_file
option may be used to control the format of the session ID.
@@ -5637,7 +5848,99 @@ setting is used to specify one or more log servers running
.Nm sudo_logsrvd
or another server that implements the protocol described by
.Xr sudo_logsrv.proto @mansectform@ .
+.Ss I/O logging pitfals
+When logging standard input, anything sent to the standard input
+will be consumed, regardless of whether or not the command run via
+.Nm sudo
+is actively reading the standard input.
+This may have unexpected results when using
+.Nm sudo
+in a shell script that expects to process the standard input.
+For example, given the following shell script:
+.Bd -literal -offset 4n
+#!/bin/sh
+sudo echo testing
+echo done
+.Ed
.Pp
+It will behave as expected when the script is passed to the shell as a
+an argument:
+.Bd -literal -offset 4n
+$ sh test.sh
+testing
+done
+.Ed
+.Pp
+However, if the script is passed to the shell on the standard input, the
+.Ql sudo echo testing
+command will consume the rest of the script.
+This means that the
+.Ql echo done
+statement is never executed.
+.Bd -literal -offset 4n
+$ sh -s < test.sh
+testing
+.Ed
+.Pp
+There are several ways to work around this problem:
+.Bl -enum
+.It
+Redirect the standard input from
+.Pa /dev/null
+when running a command via
+.Nm sudo
+that does not need to read the standard input.
+.Bd -literal -offset 4n
+sudo echo testing < /dev/null
+.Ed
+.It
+Pass the script to the shell by path name instead of via the standard input.
+.Bd -literal -offset 4n
+sh test.sh
+.Ed
+.It
+Disable logging the standard input for commands that do not need
+to read the standard input.
+.Bd -literal -offset 4n
+Defaults!/bin/echo !log_stdin
+.Ed
+.El
+.Pp
+Depending on the command, it may not be desirable to log the
+standard input or standard output.
+For example, I/O logging of commands that send or receive large
+amount of data via the standard output or standard input such as
+.Xr rsync 1
+and
+.Xr tar 1
+could fill up the log file system with superfluous data.
+It is possible to disable logging of the standard input and standard
+output for such commands as follows:
+.Bd -literal -offset 4n
+Cmnd_Alias COPY_CMDS = /usr/bin/tar, /usr/bin/cpio, /usr/bin/rsync
+
+# Log input and output but omit stdin and stdout when copying files.
+Defaults log_input, log_output
+Defaults!COPY_CMDS !log_stdin, !log_stdout
+.Ed
+.Pp
+However, be aware that using the
+.Em log_input
+flag or the
+.Dv LOG_INPUT
+command tag will also enable
+.Em log_stdin .
+Likewise, the
+.Em log_ouput
+flag or the
+.Dv LOG_OUTPUT
+command tag will enable
+.Em log_stdout
+and
+.Em log_stderr.
+Careful ordering of rules may be necessary to achieve the results
+that you expect.
+.Ss I/O log format
For both local and remote I/O logs, each log is stored in a separate
directory that contains the following files:
.Bl -tag -width 8n
@@ -5684,11 +5987,11 @@ The number of lines of the terminal the command ran on, or zero
if no terminal was present.
.It runargv
A JSON array representing the command's argument vector as passed to the
-.Fn execve
+.Xr execve 2
system call.
.It runenv
A JSON array representing the command's environment as passed to the
-.Fn execve
+.Xr execve 2
system call.
.It rungid
The group ID the command ran as.
@@ -5747,6 +6050,13 @@ command suspend or resume, signal received
.El
.It Pa ttyin
Raw input from the user's terminal, exactly as it was received.
+This file is only present if the
+.Em log_input
+or
+.Em log_ttyin
+flags are set and
+.Nm sudo
+was run from a terminal.
No post-processing is performed.
For manual viewing, you may wish to convert carriage return characters
in the log to line feeds.
@@ -5755,16 +6065,39 @@ For example:
.It Pa stdin
The standard input when no terminal is present, or input redirected from
a pipe or file.
+This file is only present if the
+.Em log_input
+or
+.Em log_stdin
+flags are set and the standard input is not connected to a terminal.
.It Pa ttyout
Output from the pseudo-terminal (what the command writes to the screen).
Terminal-specific post-processing is performed before the data is logged.
This means that, for example, line feeds are usually converted to
line feed/carriage return pairs and tabs may be expanded to spaces.
+This file is only present if the
+.Em log_output
+or
+.Em log_ttyout
+flags are set and
+.Nm sudo
+was run from a terminal.
.It Pa stdout
The standard output when no terminal is present, or output redirected to
a pipe or file.
+This file is only present if the
+.Em log_output
+or
+.Em log_stdout
+flags are set and the standard output is not connected to a terminal.
.It Pa stderr
-The standard error redirected to a pipe or file.
+The standard error when no terminal is present, or output redirected to
+a pipe or file.
+This file is only present if the
+.Em log_output
+or
+.Em log_stderr
+flags are set and the standard error is not connected to a terminal.
.El
.Pp
All files other than
@@ -5791,8 +6124,11 @@ log file unencrypted.
In most cases, logging the command output via
.Em log_output
or
-.Li LOG_OUTPUT
+.Dv LOG_OUTPUT
is all that is required.
+When logging input, consider disabling the
+.Em log_passwords
+flag.
.Pp
Since each session's I/O logs are stored in a separate directory,
traditional log rotation utilities cannot be used to limit the
@@ -5903,14 +6239,15 @@ need not provide a password and we don't want to reset the
.Ev LOGNAME
or
.Ev USER
-environment variables when running commands as root.
+environment variables when running commands as
+.Sy root .
Additionally, on the machines in the
-.Em SERVERS
-.Li Host_Alias ,
+.Dv SERVERS
+.Em Host_Alias ,
we keep an additional local log file and make sure we log the year
in each log line since the log entries will be kept around for several years.
Lastly, we disable shell escapes for the commands in the PAGERS
-.Li Cmnd_Alias
+.Em Cmnd_Alias
.Po
.Pa /usr/bin/more ,
.Pa /usr/bin/pg
@@ -5967,7 +6304,7 @@ and
.Sy crawl )
may run any command on any host but they must authenticate themselves
first (since the entry lacks the
-.Li NOPASSWD
+.Dv NOPASSWD
tag).
.Bd -literal
jack CSNETS = ALL
@@ -5976,17 +6313,12 @@ jack CSNETS = ALL
The user
.Sy jack
may run any command on the machines in the
-.Em CSNETS
-alias (the networks
-.Li 128.138.243.0 ,
-.Li 128.138.204.0 ,
-and
-.Li 128.138.242.0 ) .
-Of those networks, only
-.Li 128.138.204.0
-has an explicit netmask (in CIDR notation) indicating it is a class C network.
+.Dv CSNETS
+alias (the networks 128.138.243.0, 128.138.204.0, and 128.138.242.0).
+Of those networks, only 128.138.204.0 has an explicit netmask (in
+CIDR notation) indicating it is a class C network.
For the other networks in
-.Em CSNETS ,
+.Dv CSNETS ,
the local machine's netmask will be used during matching.
.Bd -literal
lisa CUNETS = ALL
@@ -5995,9 +6327,8 @@ lisa CUNETS = ALL
The user
.Sy lisa
may run any command on any host in the
-.Em CUNETS
-alias (the class B network
-.Li 128.138.0.0 ) .
+.Dv CUNETS
+alias (the class B network 128.138.0.0).
.Bd -literal
operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\e
sudoedit /etc/printcap, /usr/oper/bin/
@@ -6011,7 +6342,7 @@ printing system, shutting down the system, and any commands in the
directory
.Pa /usr/oper/bin/ .
One command in the
-.Li DUMPS
+.Dv DUMPS
Cmnd_Alias includes a sha224 digest,
.Pa /home/operator/bin/start_backups .
This is because the directory containing the script is writable by the
@@ -6040,8 +6371,8 @@ group may run commands in
.Pa /usr/sbin/
as themselves
with any group in the
-.Em ADMINGRP
-.Li Runas_Alias
+.Dv ADMINGRP
+.Em Runas_Alias
(the
.Sy adm
and
@@ -6051,8 +6382,9 @@ groups).
The user
.Sy pete
is allowed to change anyone's password except for
-root on the
-.Em HPPA
+.Sy root
+on the
+.Dv HPPA
machines.
Because command line arguments are matched as a single,
concatenated string, the
@@ -6081,12 +6413,12 @@ bob SPARC = (OP) ALL : SGI = (OP) ALL
The user
.Sy bob
may run anything on the
-.Em SPARC
+.Dv SPARC
and
-.Em SGI
+.Dv SGI
machines as any user listed in the
-.Em OP
-.Li Runas_Alias
+.Dv OP
+.Em Runas_Alias
.Po
.Sy root
and
@@ -6122,8 +6454,8 @@ fred ALL = (DB) NOPASSWD: ALL
The user
.Sy fred
can run commands as any user in the
-.Em DB
-.Li Runas_Alias
+.Dv DB
+.Em Runas_Alias
.Po
.Sy oracle
or
@@ -6135,11 +6467,12 @@ john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
.Ed
.Pp
On the
-.Em ALPHA
+.Dv ALPHA
machines, user
.Sy john
-may su to anyone except root but he is not allowed to specify any options
-to the
+may su to anyone except
+.Sy root
+but he is not allowed to specify any options to the
.Xr su 1
command.
.Bd -literal
@@ -6149,29 +6482,29 @@ jen ALL, !SERVERS = ALL
The user
.Sy jen
may run any command on any machine except for those in the
-.Em SERVERS
-.Li Host_Alias
+.Dv SERVERS
+.Em Host_Alias
(primary, mail, www, and ns).
.Bd -literal
jill SERVERS = /usr/bin/, !SU, !SHELLS
.Ed
.Pp
For any machine in the
-.Em SERVERS
-.Li Host_Alias ,
+.Dv SERVERS
+.Em Host_Alias ,
.Sy jill
may run
any commands in the directory
.Pa /usr/bin/
except for those commands
belonging to the
-.Em SU
+.Dv SU
and
-.Em SHELLS
-.Li Cmnd_Aliases .
+.Dv SHELLS
+.Em Cmnd_Aliases .
While not specifically mentioned in the rule, the commands in the
-.Em PAGERS
-.Li Cmnd_Alias
+.Dv PAGERS
+.Em Cmnd_Alias
all reside in
.Pa /usr/bin
and have the
@@ -6197,8 +6530,8 @@ WEBADMIN www = (www) ALL, (root) /usr/bin/su www
.Ed
.Pp
On the host www, any user in the
-.Em WEBADMIN
-.Li User_Alias
+.Dv WEBADMIN
+.Em User_Alias
(will, wendy, and wim), may run any command as user www (which owns the
web pages) or simply
.Xr su 1
@@ -6209,7 +6542,7 @@ ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\e
.Ed
.Pp
Any user may mount or unmount a CD-ROM on the machines in the CDROM
-.Li Host_Alias
+.Em Host_Alias
(orion, perseus, hercules) without entering a password.
This is a bit tedious for users to type, so it is a prime candidate
for encapsulating in a shell script.
@@ -6232,9 +6565,9 @@ bill ALL = ALL, !SU, !SHELLS
Doesn't really prevent
.Sy bill
from running the commands listed in
-.Em SU
+.Dv SU
or
-.Em SHELLS
+.Dv SHELLS
since he can simply copy those commands to a different name, or use
a shell escape from an editor or other program.
Therefore, these kind of restrictions should be considered
@@ -6243,7 +6576,9 @@ advisory at best (and reinforced by policy).
In general, if a user has sudo
.Sy ALL
there is nothing to prevent them from creating their own program that gives
-them a root shell (or making their own copy of a shell) regardless of any
+them a
+.Sy root
+shell (or making their own copy of a shell) regardless of any
.Ql !\&
elements in the user specification.
.Ss Security implications of Em fast_glob
@@ -6268,13 +6603,13 @@ john ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,\e
User
.Sy john
can still run
-.Li /usr/bin/passwd root
+.Ql /usr/bin/passwd root
if
.Em fast_glob
is enabled by changing to
.Pa /usr/bin
and running
-.Li ./passwd root
+.Ql ./passwd root
instead.
.Pp
Another potential issue is that when
@@ -6369,12 +6704,7 @@ Due to the large number of programs that
offer shell escapes, restricting users to the set of programs that
do not is often unworkable.
.It intercept
-Many systems that support shared libraries have the ability to
-override default library functions by pointing an environment
-variable (usually
-.Ev LD_PRELOAD )
-to an alternate shared library.
-On such systems,
+On most systems,
.Nm sudo Ns 's
.Em intercept
functionality can be used to transparently intercept an attempt to
@@ -6382,79 +6712,93 @@ run a new command, allow or deny it based on
.Em sudoers
rules, and log the result.
For example, this can be used to restrict the commands run from
-within a privileged shell.
+within a privileged shell or editor.
+.Pp
+There are two underlying mechanisms that may be used to implement
+.Em intercept
+mode:
+.Em dso
+and
+.Em trace .
+The
+.Em intercept_type
+setting can be used to select between them.
+.Pp
+The first mechanism,
+.Em dso ,
+overrides the standard C library functions that are used to execute a
+command.
+It does this by setting an environment variable (usually
+.Ev LD_PRELOAD )
+to the path of a dynamic shared object, or shared library,
+containing custom versions of the
+.Xr execve 2 ,
+.Xr execl 3 ,
+.Xr execle 3 ,
+.Xr execlp 3 ,
+.Xr execv 3 ,
+.Xr execvp 3 ,
+.Xr execvpe 3 ,
+and
+.Xr system 3
+library functions that connect back to
+.Nm sudo
+for a policy decision.
Note, however, that this applies only to dynamically-linked
executables.
It is not possible to intercept commands for statically-linked executables
-or executables that run under binary emulation.
-This implementation of the
+or executables that run under binary emulation this way.
+Because most dynamic loaders ignore
+.Ev LD_PRELOAD
+(or the equivalent) when running set-user-ID and set-group-ID programs,
+.Nm
+will not permit such programs to be run in
.Em intercept
-functionality is incompatible with
+mode by default.
+The
+.Em dso
+mechanism is incompatible with
.Nm sudo Ns 's
SELinux RBAC support (but see below).
SELinux disables
.Ev LD_PRELOAD
-by default and interferes with file descriptor inheritance.
+by default and interferes with file descriptor inheritance, which
+.Nm sudo
+relies on.
.Pp
-Linux systems that support
+The second mechanism,
+.Em trace ,
+is available on Linux systems that support
.Xr seccomp 2
-filtering can use a different method involving
+filtering.
+It uses
.Xr ptrace 2
-instead of pre-loading a shared library.
-This method supports both static and dynamic executables as well as
+and
+.Xr seccomp 2
+to intercept the
+.Xr execve 2
+system call instead of pre-loading a dynamic shared object.
+Both static and dynamic executables are supported and it is compatible with
.Nm sudo Ns 's
SELinux RBAC mode.
-Because it operates at the system call level, not the library function level,
-it is possible to intercept all calls to
-.Xr execve 2 .
Functions utilizing the
.Xr execveat 2
system call, such as
.Xr fexecve 3 ,
are not currently intercepted.
.Pp
-The shared library-based
-.Em intercept
-functionality only works for programs that use the
-.Fn execl ,
-.Fn execle ,
-.Fn execlp ,
-.Fn execv ,
-.Fn execve ,
-.Fn execvp ,
-.Fn execvpe ,
-or
-.Fn system
-library functions to run the new command.
-This may be expanded in a future release of
-.Nm sudo .
-Because most dynamic loaders ignore
-.Ev LD_PRELOAD
-(or the equivalent) when running set-user-ID and set-group-ID programs,
-.Nm
-will not permit such programs to be run in
-.Em intercept
-mode.
-The Linux
-.Xr seccomp 2 Ns \- Ns based
-implementation does not share these restrictions.
-.Pp
The
.Em intercept
feature is known to work on Solaris, *BSD, Linux, macOS, HP-UX 11.x
and AIX 5.3 and above.
It should be supported on most operating systems that support the
.Ev LD_PRELOAD
-environment variable.
-Check your operating system's manual pages for the dynamic linker
-(usually ld.so, ld.so.1, dyld, dld.sl, rld, or loader) to see if
-.Ev LD_PRELOAD
-is supported.
+environment variable or an equivalent.
It is not possible to intercept shell built-in commands or restrict
the ability to read or write sensitive files from within a shell.
.Pp
To enable intercept mode on a per-command basis, use the
-.Li INTERCEPT
+.Dv INTERCEPT
tag as documented in the User Specification section above.
Here is that example again:
.Bd -literal
@@ -6474,6 +6818,28 @@ you can always just try it out and check whether or not external
commands run via a shell are logged when
.Em intercept
is enabled.
+.Pp
+There is an inherent race condition between when a command is checked against
+.Nm
+rules and when it is actually executed.
+If a user is allowed to run arbitrary commands, they may be able
+to change the
+.Xr execve 2
+arguments in the program after the
+.Nm
+policy check has completed but before the new command is executed.
+Starting with version 1.9.12, the
+.Em trace
+method will verify that the command and its arguments have not
+changed after
+.Xr execve 2
+has completed but before execution of the new program has had a chance to run.
+This is not the case with the
+.Em dso
+method.
+See the description of the
+.Em intercept_verify
+setting for more information.
.It log
There are two separate but related ways to log additional commands.
The first is to enable I/O logging using the
@@ -6511,26 +6877,26 @@ The
.Em noexec
functionality
is capable of blocking execution of commands run via the
-.Fn execl ,
-.Fn execle ,
-.Fn execlp ,
-.Fn exect ,
-.Fn execv ,
-.Fn execve ,
-.Fn execveat ,
-.Fn execvP ,
-.Fn execvp ,
-.Fn execvpe ,
-.Fn fexecve ,
-.Fn popen ,
-.Fn posix_spawn ,
-.Fn posix_spawnp ,
-.Fn system ,
+.Xr execve 2 ,
+.Xr execl 3 ,
+.Xr execle 3 ,
+.Xr execlp 3 ,
+.Xr exect 3 ,
+.Xr execv 3 ,
+.Xr execveat 3 ,
+.Xr execvP 3 ,
+.Xr execvp 3 ,
+.Xr execvpe 3 ,
+.Xr fexecve 3 ,
+.Xr popen 3 ,
+.Xr posix_spawn 3 ,
+.Xr posix_spawnp 3 ,
+.Xr system 3 ,
and
-.Fn wordexp
+.Xr wordexp 3
functions.
On Linux, a
-.Fn seccomp
+.Xr seccomp 2
filter is used to implement
.Em noexec .
On Solaris 10 and higher,
@@ -6542,7 +6908,7 @@ environment variable.
To enable
.Em noexec
for a command, use the
-.Li NOEXEC
+.Dv NOEXEC
tag as documented in the User Specification section above.
Here is that example again:
.Bd -literal
@@ -6568,9 +6934,11 @@ is enabled.
.El
.Pp
Restricting shell escapes is not a panacea.
-Programs running as root are still capable of many potentially hazardous
-operations (such as changing or overwriting files) that could lead
-to unintended privilege escalation.
+Programs running as
+.Sy root
+are still capable of many potentially hazardous operations (such
+as changing or overwriting files) that could lead to unintended
+privilege escalation.
In the specific case of an editor, a safer approach is to give the
user permission to run
.Nm sudoedit
@@ -6617,7 +6985,9 @@ as follows:
$ sudoedit /etc/motd
.Ed
.Pp
-The editor will run as the operator user, not root, on a temporary copy of
+The editor will run as the operator user, not
+.Sy @runas_default@ ,
+on a temporary copy of
.Pa /etc/motd .
After the file has been edited,
.Pa /etc/motd
@@ -6638,7 +7008,8 @@ not be followed in writable directories and
will refuse to edit a file located in a writable directory
unless the
.Em sudoedit_checkdir
-option has been disabled or the invoking user is root.
+option has been disabled or the invoking user is
+.Sy root .
Additionally, in version 1.8.15 and higher,
.Nm sudoedit
will refuse to open a symbolic link unless either the
@@ -6646,7 +7017,7 @@ will refuse to open a symbolic link unless either the
option is enabled or the
.Em sudoedit
command is prefixed with the
-.Li FOLLOW
+.Dv FOLLOW
tag in the
.Em sudoers
file.
@@ -6657,8 +7028,10 @@ will check the ownership of its time stamp directory
.Pa @rundir@/ts
by default
.Pc
-and ignore the directory's contents if it is not owned by root or
-if it is writable by a user other than root.
+and ignore the directory's contents if it is not owned by
+.Sy root
+or if it is writable by a user other than
+.Sy root .
Older versions of
.Nm sudo
stored time stamp files in
@@ -6697,7 +7070,7 @@ if the system supports it.
.Nm
will not honor time stamps set far in the future.
Time stamps with a date greater than current_time + 2 *
-.Li TIMEOUT
+.Dv TIMEOUT
will be ignored and
.Nm
will log and complain.
@@ -6765,11 +7138,11 @@ The following subsystems are used by the
plugin:
.Bl -tag -width 8n
.It Em alias
-.Li User_Alias ,
-.Li Runas_Alias ,
-.Li Host_Alias
+.Em User_Alias ,
+.Em Runas_Alias ,
+.Em Host_Alias
and
-.Li Cmnd_Alias
+.Em Cmnd_Alias
processing
.It Em all
matches every subsystem
@@ -6879,7 +7252,7 @@ When using netgroups of machines (as opposed to users), if you
store fully qualified host name in the netgroup (as is usually the
case), you either need to have the machine's host name be fully qualified
as returned by the
-.Li hostname
+.Em hostname
command or use the
.Em fqdn
option in
diff --git a/docs/sudoers_timestamp.man.in b/docs/sudoers_timestamp.man.in
index ca5c30916..e824029a2 100644
--- a/docs/sudoers_timestamp.man.in
+++ b/docs/sudoers_timestamp.man.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "SUDOERS_TIMESTAMP" "@mansectform@" "February 16, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDOERS_TIMESTAMP" "@mansectform@" "September 13, 2022" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -29,7 +29,7 @@ plugin uses per-user time stamp files for credential caching.
Once a user has been authenticated, they may use
\fBsudo\fR
without a password for a short period of time
-(\fR@timeout@\fR
+(\fI@timeout@\fR
minutes unless overridden by the
\fItimestamp_timeout\fR
option)
diff --git a/docs/sudoers_timestamp.mdoc.in b/docs/sudoers_timestamp.mdoc.in
index 1dbfeac62..633cc7555 100644
--- a/docs/sudoers_timestamp.mdoc.in
+++ b/docs/sudoers_timestamp.mdoc.in
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd February 16, 2022
+.Dd September 13, 2022
.Dt SUDOERS_TIMESTAMP @mansectform@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -29,7 +29,7 @@ Once a user has been authenticated, they may use
.Nm sudo
without a password for a short period of time
.Po
-.Li @timeout@
+.Em @timeout@
minutes unless overridden by the
.Em timestamp_timeout
option
@@ -94,19 +94,19 @@ same file but are not inter-operable.
The size of the record in bytes.
.It type
The record type, currently
-.Li TS_GLOBAL ,
-.Li TS_TTY ,
+.Dv TS_GLOBAL ,
+.Dv TS_TTY ,
or
-.Li TS_PPID .
+.Dv TS_PPID .
.It flags
Zero or more record flags which can be bit-wise ORed together.
Supported flags are
-.Li TS_DISABLED ,
+.Dv TS_DISABLED ,
for records disabled via
.Nm sudo
.Fl k
and
-.Li TS_ANYUID ,
+.Dv TS_ANYUID ,
which is used only when matching records.
.It auth_uid
The user-ID that was used for authentication.
@@ -120,12 +120,12 @@ the default runas user or the target user.
.It sid
The ID of the user's terminal session, if present.
The session ID is only used when matching records of type
-.Li TS_TTY .
+.Dv TS_TTY .
.It start_time
The start time of the session leader for records of type
-.Li TS_TTY
+.Dv TS_TTY
or of the parent process for records of type
-.Li TS_PPID .
+.Dv TS_PPID .
The
.Em start_time
is used to help prevent re-use of a time stamp record after a
@@ -157,10 +157,10 @@ option, no password is required.
.It u.ttydev
The device number of the terminal associated with the session for
records of type
-.Li TS_TTY .
+.Dv TS_TTY .
.It u.ppid
The ID of the parent process for records of type
-.Li TS_PPID .
+.Dv TS_PPID .
.El
.Sh LOCKING
In
@@ -174,7 +174,7 @@ of the entire file and the lock is held for a longer period of time.
This scheme is described below.
.Pp
The first record in the time stamp file is of type
-.Li TS_LOCKEXCL
+.Dv TS_LOCKEXCL
and is used as a
.Em lock
record to prevent more than one
@@ -182,7 +182,7 @@ record to prevent more than one
process from adding a new record at the same time.
Once the desired time stamp record has been located or created (and
locked), the
-.Li TS_LOCKEXCL
+.Dv TS_LOCKEXCL
record is unlocked.
The lock on the individual time stamp record, however, is held until
authentication is complete.
@@ -192,7 +192,7 @@ to avoid prompting for a password multiple times when it
is used more than once in a pipeline.
.Pp
Records of type
-.Li TS_GLOBAL
+.Dv TS_GLOBAL
cannot be locked for a long period of time since doing so would
interfere with other
.Nm sudo
diff --git a/docs/sudoreplay.man.in b/docs/sudoreplay.man.in
index 9b1b4c5a0..34d4f3013 100644
--- a/docs/sudoreplay.man.in
+++ b/docs/sudoreplay.man.in
@@ -16,7 +16,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.TH "SUDOREPLAY" "@mansectsu@" "February 16, 2022" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
+.TH "SUDOREPLAY" "@mansectsu@" "September 13, 2022" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -50,7 +50,7 @@ The
\fIID\fR
should either be a six character sequence of digits and
upper case letters, e.g.,
-\fR0100A5\fR
+\(lq0100A5\(rq
or a path name.
The
\fIID\fR
@@ -76,8 +76,10 @@ with
enabled in the
\fIsudoers\fR
file, a
-\fRTSID=ID\fR
-string is logged via syslog or to the
+\(lqTSID=ID\(rq
+string is logged via
+syslog(3)
+or to the
\fBsudo\fR
log file.
The
@@ -400,7 +402,7 @@ This will be addressed in a future version of
\fBsudoreplay\fR
versions 1.8.4 and higher support a flexible debugging framework
that is configured via
-\fRDebug\fR
+\fIDebug\fR
lines in the
sudo.conf(@mansectform@)
file.
diff --git a/docs/sudoreplay.mdoc.in b/docs/sudoreplay.mdoc.in
index b9e8086fe..518e34551 100644
--- a/docs/sudoreplay.mdoc.in
+++ b/docs/sudoreplay.mdoc.in
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd February 16, 2022
+.Dd September 13, 2022
.Dt SUDOREPLAY @mansectsu@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -48,7 +48,7 @@ The
.Em ID
should either be a six character sequence of digits and
upper case letters, e.g.,
-.Li 0100A5
+.Dq 0100A5
or a path name.
The
.Em ID
@@ -74,8 +74,10 @@ with
enabled in the
.Em sudoers
file, a
-.Li TSID=ID
-string is logged via syslog or to the
+.Dq TSID=ID
+string is logged via
+.Xr syslog 3
+or to the
.Nm sudo
log file.
The
@@ -363,7 +365,7 @@ This will be addressed in a future version of
.Nm
versions 1.8.4 and higher support a flexible debugging framework
that is configured via
-.Li Debug
+.Em Debug
lines in the
.Xr sudo.conf @mansectform@
file.
diff --git a/docs/visudo.man.in b/docs/visudo.man.in
index b64ec2532..d239808af 100644
--- a/docs/visudo.man.in
+++ b/docs/visudo.man.in
@@ -21,7 +21,7 @@
.\" Agency (DARPA) and Air Force Research Laboratory, Air Force
.\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
.\"
-.TH "VISUDO" "@mansectsu@" "April 23, 2022" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
+.TH "VISUDO" "@mansectsu@" "October 4, 2022" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
.nh
.if n .ad l
.SH "NAME"
@@ -30,7 +30,7 @@
.SH "SYNOPSIS"
.HP 7n
\fBvisudo\fR
-[\fB\-chOPqsV\fR]
+[\fB\-chIOPqsV\fR]
[[\fB\-f\fR]\ \fIsudoers\fR]
.SH "DESCRIPTION"
\fBvisudo\fR
@@ -208,6 +208,24 @@ option.
\fB\-h\fR, \fB\--help\fR
Display a short help message to the standard output and exit.
.TP 12n
+\fB\-I\fR, \fB\--no-includes\fR
+Disable the editing of include files unless there is a pre-existing
+syntax error.
+By default,
+\fBvisudo\fR
+will edit the main
+\fIsudoers\fR
+file and any files included via
+\fI@include\fR
+or
+\fI#include\fR
+directives.
+Files included via
+\fI@includedir\fR
+or
+\fI#includedir\fR
+are never edited unless they contain a syntax error.
+.TP 12n
\fB\-O\fR, \fB\--owner\fR
Enforce the default ownership (user and group) of the
\fIsudoers\fR
@@ -289,7 +307,7 @@ include file for syntax errors.
\fBvisudo\fR
versions 1.8.4 and higher support a flexible debugging framework
that is configured via
-\fRDebug\fR
+\fIDebug\fR
lines in the
sudo.conf(@mansectform@)
file.
@@ -450,7 +468,7 @@ file.
The
\fIsudoers\fR
file contains a
-\fRDefaults\fR
+\fIDefaults\fR
setting not recognized by
\fBvisudo\fR.
.SH "SEE ALSO"
diff --git a/docs/visudo.mdoc.in b/docs/visudo.mdoc.in
index 725e71cfc..33ebfaa53 100644
--- a/docs/visudo.mdoc.in
+++ b/docs/visudo.mdoc.in
@@ -20,7 +20,7 @@
.\" Agency (DARPA) and Air Force Research Laboratory, Air Force
.\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
.\"
-.Dd April 23, 2022
+.Dd October 4, 2022
.Dt VISUDO @mansectsu@
.Os Sudo @PACKAGE_VERSION@
.Sh NAME
@@ -28,7 +28,7 @@
.Nd edit the sudoers file
.Sh SYNOPSIS
.Nm visudo
-.Op Fl chOPqsV
+.Op Fl chIOPqsV
.Op Bo Fl f Bc Ar sudoers
.Sh DESCRIPTION
.Nm
@@ -203,6 +203,23 @@ path can be specified without using the
option.
.It Fl h , -help
Display a short help message to the standard output and exit.
+.It Fl I , -no-includes
+Disable the editing of include files unless there is a pre-existing
+syntax error.
+By default,
+.Nm
+will edit the main
+.Ar sudoers
+file and any files included via
+.Em @include
+or
+.Em #include
+directives.
+Files included via
+.Em @includedir
+or
+.Em #includedir
+are never edited unless they contain a syntax error.
.It Fl O , -owner
Enforce the default ownership (user and group) of the
.Em sudoers
@@ -281,7 +298,7 @@ include file for syntax errors.
.Nm
versions 1.8.4 and higher support a flexible debugging framework
that is configured via
-.Li Debug
+.Em Debug
lines in the
.Xr sudo.conf @mansectform@
file.
@@ -430,7 +447,7 @@ file.
The
.Em sudoers
file contains a
-.Li Defaults
+.Em Defaults
setting not recognized by
.Nm .
.El
diff --git a/etc/codespell.exclude b/etc/codespell.exclude
index b74f1560e..ec46ef6ae 100644
--- a/etc/codespell.exclude
+++ b/etc/codespell.exclude
@@ -10,7 +10,7 @@
(TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \
(TAG_SET((nt).send_mail) && (nt).send_mail != (ot).send_mail))
sv sw ta te tg th tr uk ur vi wa wo zh_CN zh_HK
- if (!PyArg_ParseTupleAndKeywords(py_args ? py_args : py_empty, py_kwargs, "Ois|i:sudo.ConvMessage", keywords,
+ if (!PyArg_ParseTupleAndKeywords(py_args ? py_args : py_empty, py_kwargs, "Ois|i:sudo.ConvMessage", (char **)keywords,
$ans = <STDIN>;
if ($ans =~ /^[yY]/) {
.nr BA @BAMAN@
diff --git a/etc/codespell.ignore b/etc/codespell.ignore
index 1fd87a90b..d242e622e 100644
--- a/etc/codespell.ignore
+++ b/etc/codespell.ignore
@@ -1,4 +1,3 @@
-Ois
SOM
VAS
alloced
@@ -8,8 +7,10 @@ ist
numer
pleas
sav
+statics
thur
toke
vas
wit
-statics
+siz
+clen
diff --git a/include/intercept.pb-c.h b/include/intercept.pb-c.h
index 9d6390b8b..2ea168329 100644
--- a/include/intercept.pb-c.h
+++ b/include/intercept.pb-c.h
@@ -72,6 +72,7 @@ struct InterceptHello
/*
* Sudo response to an InterceptHello from sudo_intercept.so.
* The client uses the port number and token to connect back to sudo.
+ * If log_only is set there is no InterceptResponse to a PolicyCheckRequest.
*/
struct HelloResponse
{
@@ -79,10 +80,11 @@ struct HelloResponse
uint64_t token_lo;
uint64_t token_hi;
int32_t portno;
+ protobuf_c_boolean log_only;
};
#define HELLO_RESPONSE__INIT \
{ PROTOBUF_C_MESSAGE_INIT (&hello_response__descriptor) \
- , 0, 0, 0 }
+ , 0, 0, 0, 0 }
/*
diff --git a/include/protobuf-c/protobuf-c.h b/include/protobuf-c/protobuf-c.h
index 71c928fdb..442abf61d 100644
--- a/include/protobuf-c/protobuf-c.h
+++ b/include/protobuf-c/protobuf-c.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008-2018, Dave Benson and the protobuf-c authors.
+ * Copyright (c) 2008-2022, Dave Benson and the protobuf-c authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -794,13 +794,13 @@ protobuf_c_version_number(void);
* The version of the protobuf-c headers, represented as a string using the same
* format as protobuf_c_version().
*/
-#define PROTOBUF_C_VERSION "1.4.0"
+#define PROTOBUF_C_VERSION "1.4.1"
/**
* The version of the protobuf-c headers, represented as an integer using the
* same format as protobuf_c_version_number().
*/
-#define PROTOBUF_C_VERSION_NUMBER 1004000
+#define PROTOBUF_C_VERSION_NUMBER 1004001
/**
* The minimum protoc-c version which works with the current version of the
diff --git a/include/sudo_compat.h b/include/sudo_compat.h
index ee3c22962..63dd9916c 100644
--- a/include/sudo_compat.h
+++ b/include/sudo_compat.h
@@ -37,45 +37,6 @@
* 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
-
#ifdef HAVE_FALLTHROUGH_ATTRIBUTE
# define FALLTHROUGH __attribute__((__fallthrough__))
#else
@@ -484,22 +445,22 @@ sudo_dso_public int sudo_futimens(int fd, const struct timespec *times);
# define futimens(_a, _b) sudo_futimens((_a), (_b))
#endif /* HAVE_FUTIMENS */
#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-sudo_dso_public int sudo_snprintf(char *str, size_t n, char const *fmt, ...) __printflike(3, 4);
+sudo_dso_public int sudo_snprintf(char *str, size_t n, char const *fmt, ...) sudo_printflike(3, 4);
# undef snprintf
# define snprintf sudo_snprintf
#endif /* HAVE_SNPRINTF */
#if !defined(HAVE_VSNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-sudo_dso_public int sudo_vsnprintf(char *str, size_t n, const char *fmt, va_list ap) __printflike(3, 0);
+sudo_dso_public int sudo_vsnprintf(char *str, size_t n, const char *fmt, va_list ap) sudo_printflike(3, 0);
# undef vsnprintf
# define vsnprintf sudo_vsnprintf
#endif /* HAVE_VSNPRINTF */
#if !defined(HAVE_ASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-sudo_dso_public int sudo_asprintf(char **str, char const *fmt, ...) __printflike(2, 3);
+sudo_dso_public int sudo_asprintf(char **str, char const *fmt, ...) sudo_printflike(2, 3);
# undef asprintf
# define asprintf sudo_asprintf
#endif /* HAVE_ASPRINTF */
#if !defined(HAVE_VASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-sudo_dso_public int sudo_vasprintf(char **str, const char *fmt, va_list ap) __printflike(2, 0);
+sudo_dso_public int sudo_vasprintf(char **str, const char *fmt, va_list ap) sudo_printflike(2, 0);
# undef vasprintf
# define vasprintf sudo_vasprintf
#endif /* HAVE_VASPRINTF */
@@ -523,6 +484,11 @@ sudo_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_FCHOWNAT
+sudo_dso_public int sudo_fchownat(int dfd, const char *path, uid_t uid, gid_t gid, int flag);
+# undef fchownat
+# define fchownat(_a, _b, _c, _d, _e) sudo_fchownat((_a), (_b), (_c), (_d), (_e))
+#endif /* HAVE_FCHOWNAT */
#ifndef HAVE_MEMRCHR
sudo_dso_public void *sudo_memrchr(const void *s, int c, size_t n);
# undef memrchr
@@ -533,14 +499,30 @@ sudo_dso_public int sudo_mkdirat(int dfd, const char *path, mode_t mode);
# undef mkdirat
# define mkdirat(_a, _b, _c) sudo_mkdirat((_a), (_b), (_c))
#endif /* HAVE_MKDIRAT */
-#if !defined(HAVE_MKDTEMP) || !defined(HAVE_MKSTEMPS)
+#if !defined(HAVE_MKDTEMPAT) || !defined(HAVE_MKOSTEMPSAT)
+# if defined(HAVE_MKDTEMPAT_NP) && defined(HAVE_MKOSTEMPSAT_NP)
+# undef mkdtempat
+# define mkdtempat mkdtempat_np
+# undef mkostempsat
+# define mkostempsat mkostempsat_np
+# else
sudo_dso_public char *sudo_mkdtemp(char *path);
-# undef mkdtemp
-# define mkdtemp(_a) sudo_mkdtemp((_a))
+# undef mkdtemp
+# define mkdtemp(_a) sudo_mkdtemp((_a))
+sudo_dso_public char *sudo_mkdtempat(int dfd, char *path);
+# undef mkdtempat
+# define mkdtempat(_a, _b) sudo_mkdtempat((_a), (_b))
+sudo_dso_public int sudo_mkostempsat(int dfd, char *path, int slen, int flags);
+# undef mkostempsat
+# define mkostempsat(_a, _b, _c, _d) sudo_mkostempsat((_a), (_b), (_c), (_d))
+sudo_dso_public int sudo_mkstemp(char *path);
+# undef mkstemp
+# define mkstemp(_a) sudo_mkstemp((_a))
sudo_dso_public int sudo_mkstemps(char *path, int slen);
-# undef mkstemps
-# define mkstemps(_a, _b) sudo_mkstemps((_a), (_b))
-#endif /* !HAVE_MKDTEMP || !HAVE_MKSTEMPS */
+# undef mkstemps
+# define mkstemps(_a, _b) sudo_mkstemps((_a), (_b))
+# endif /* HAVE_MKDTEMPAT_NP || HAVE_MKOSTEMPSAT_NP */
+#endif /* !HAVE_MKDTEMPAT || !HAVE_MKOSTEMPSAT */
#ifndef HAVE_NANOSLEEP
sudo_dso_public int sudo_nanosleep(const struct timespec *timeout, struct timespec *remainder);
#undef nanosleep
diff --git a/include/sudo_debug.h b/include/sudo_debug.h
index 399602b8f..5ee5cc18d 100644
--- a/include/sudo_debug.h
+++ b/include/sudo_debug.h
@@ -265,13 +265,13 @@ sudo_dso_public int sudo_debug_get_active_instance_v1(void);
sudo_dso_public int sudo_debug_get_fds_v1(unsigned char **fds);
sudo_dso_public int sudo_debug_get_instance_v1(const char *program);
sudo_dso_public int sudo_debug_parse_flags_v1(struct sudo_conf_debug_file_list *debug_files, const char *entry);
-sudo_dso_public void sudo_debug_printf2_v1(const char *func, const char *file, int line, int level, const char *fmt, ...) __printf0like(5, 6);
-sudo_dso_public void sudo_debug_printf_nvm_v1(int pri, const char *fmt, ...) __printf0like(2, 3);
+sudo_dso_public void sudo_debug_printf2_v1(const char *func, const char *file, int line, int level, const char *fmt, ...) sudo_printf0like(5, 6);
+sudo_dso_public void sudo_debug_printf_nvm_v1(int pri, const char *fmt, ...) sudo_printf0like(2, 3);
sudo_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);
sudo_dso_public int sudo_debug_register_v2(const char *program, const char *const subsystems[], unsigned int ids[], struct sudo_conf_debug_file_list *debug_files, int minfd);
sudo_dso_public int sudo_debug_set_active_instance_v1(int inst);
sudo_dso_public void sudo_debug_update_fd_v1(int ofd, int nfd);
-sudo_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);
+sudo_dso_public void sudo_debug_vprintf2_v1(const char *func, const char *file, int line, int level, const char *fmt, va_list ap) sudo_printf0like(5, 0);
sudo_dso_public void sudo_debug_write2_v1(int fd, const char *func, const char *file, int line, const char *str, int len, int errnum);
sudo_dso_public bool sudo_debug_needed_v1(int level);
diff --git a/include/sudo_event.h b/include/sudo_event.h
index 12bb89478..67dfb20bd 100644
--- a/include/sudo_event.h
+++ b/include/sudo_event.h
@@ -192,6 +192,9 @@ sudo_dso_public bool sudo_ev_got_break_v1(struct sudo_event_base *base);
/* Return the base an event is associated with or NULL. */
#define sudo_ev_get_base(_ev) ((_ev) ? (_ev)->base : NULL)
+/* Set the base an event is associated with. */
+#define sudo_ev_set_base(_ev, _b) ((_ev)->base = (_b))
+
/* Magic pointer value to use self pointer as callback arg. */
#define sudo_ev_self_cbarg() ((void *)-1)
diff --git a/include/sudo_eventlog.h b/include/sudo_eventlog.h
index 457f519dc..b4552f2e6 100644
--- a/include/sudo_eventlog.h
+++ b/include/sudo_eventlog.h
@@ -132,7 +132,7 @@ bool eventlog_accept(const struct eventlog *evlog, int flags, eventlog_json_call
bool eventlog_exit(const struct eventlog *evlog, int flags);
bool eventlog_alert(const struct eventlog *evlog, int flags, struct timespec *alert_time, const char *reason, const char *errstr);
bool eventlog_reject(const struct eventlog *evlog, int flags, const char *reason, eventlog_json_callback_t info_cb, void *info);
-bool eventlog_store_json(struct json_container *json, const struct eventlog *evlog);
+bool eventlog_store_json(struct json_container *jsonc, const struct eventlog *evlog);
size_t eventlog_writeln(FILE *fp, char *line, size_t len, size_t maxlen);
void eventlog_free(struct eventlog *evlog);
void eventlog_set_type(int type);
diff --git a/include/sudo_fatal.h b/include/sudo_fatal.h
index 37ac9defc..35881257a 100644
--- a/include/sudo_fatal.h
+++ b/include/sudo_fatal.h
@@ -164,20 +164,20 @@ typedef bool (*sudo_warn_setlocale_t)(bool, int *);
sudo_dso_public int sudo_fatal_callback_deregister_v1(sudo_fatal_callback_t func);
sudo_dso_public int sudo_fatal_callback_register_v1(sudo_fatal_callback_t func);
-sudo_dso_public char *sudo_warn_gettext_v1(const char *domainname, const char *msgid) __format_arg(2);
+sudo_dso_public char *sudo_warn_gettext_v1(const char *domainname, const char *msgid) sudo_attr_fmt_arg(2);
sudo_dso_public void sudo_warn_set_locale_func_v1(sudo_warn_setlocale_t func);
-sudo_dso_public void sudo_fatal_nodebug_v1(const char *fmt, ...) __printf0like(1, 2) __attribute__((__noreturn__));
-sudo_dso_public void sudo_fatalx_nodebug_v1(const char *fmt, ...) __printflike(1, 2) __attribute__((__noreturn__));
-sudo_dso_public void sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...) __printflike(2, 3) __attribute__((__noreturn__));
-sudo_dso_public void sudo_vfatal_nodebug_v1(const char *fmt, va_list ap) __printf0like(1, 0) __attribute__((__noreturn__));
-sudo_dso_public void sudo_vfatalx_nodebug_v1(const char *fmt, va_list ap) __printflike(1, 0) __attribute__((__noreturn__));
-sudo_dso_public void sudo_gai_vfatal_nodebug_v1(int errnum, const char *fmt, va_list ap) __printflike(2, 0) __attribute__((__noreturn__));
-sudo_dso_public void sudo_warn_nodebug_v1(const char *fmt, ...) __printf0like(1, 2);
-sudo_dso_public void sudo_warnx_nodebug_v1(const char *fmt, ...) __printflike(1, 2);
-sudo_dso_public void sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...) __printflike(2, 3);
-sudo_dso_public void sudo_vwarn_nodebug_v1(const char *fmt, va_list ap) __printf0like(1, 0);
-sudo_dso_public void sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap) __printflike(1, 0);
-sudo_dso_public void sudo_gai_vwarn_nodebug_v1(int errnum, const char *fmt, va_list ap) __printflike(2, 0);
+sudo_dso_public sudo_noreturn void sudo_fatal_nodebug_v1(const char *fmt, ...) sudo_printf0like(1, 2);
+sudo_dso_public sudo_noreturn void sudo_fatalx_nodebug_v1(const char *fmt, ...) sudo_printflike(1, 2);
+sudo_dso_public sudo_noreturn void sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...) sudo_printflike(2, 3);
+sudo_dso_public sudo_noreturn void sudo_vfatal_nodebug_v1(const char *fmt, va_list ap) sudo_printf0like(1, 0);
+sudo_dso_public sudo_noreturn void sudo_vfatalx_nodebug_v1(const char *fmt, va_list ap) sudo_printflike(1, 0);
+sudo_dso_public sudo_noreturn void sudo_gai_vfatal_nodebug_v1(int errnum, const char *fmt, va_list ap) sudo_printflike(2, 0);
+sudo_dso_public void sudo_warn_nodebug_v1(const char *fmt, ...) sudo_printf0like(1, 2);
+sudo_dso_public void sudo_warnx_nodebug_v1(const char *fmt, ...) sudo_printflike(1, 2);
+sudo_dso_public void sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...) sudo_printflike(2, 3);
+sudo_dso_public void sudo_vwarn_nodebug_v1(const char *fmt, va_list ap) sudo_printf0like(1, 0);
+sudo_dso_public void sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap) sudo_printflike(1, 0);
+sudo_dso_public void sudo_gai_vwarn_nodebug_v1(int errnum, const char *fmt, va_list ap) sudo_printflike(2, 0);
sudo_dso_public void sudo_warn_set_conversation_v1(sudo_conv_t conv);
#define sudo_fatal_callback_deregister(_a) sudo_fatal_callback_deregister_v1((_a))
diff --git a/include/sudo_iolog.h b/include/sudo_iolog.h
index 027285ecf..599424184 100644
--- a/include/sudo_iolog.h
+++ b/include/sudo_iolog.h
@@ -95,7 +95,7 @@ struct iolog_path_escape {
};
/* host_port.c */
-bool iolog_parse_host_port(char *str, char **hostp, char **portp, bool *tlsp, char *defport, char *defport_tls);
+bool iolog_parse_host_port(char *str, char **hostp, char **portp, bool *tlsp, const char *defport, const char *defport_tls);
/* iolog_path.c */
bool expand_iolog_path(const char *inpath, char *path, size_t pathlen, const struct iolog_path_escape *escapes, void *closure);
@@ -143,10 +143,10 @@ void iolog_set_maxseq(unsigned int maxval);
void iolog_set_mode(mode_t mode);
void iolog_set_owner(uid_t uid, uid_t gid);
bool iolog_swapids(bool restore);
-bool iolog_mkdirs(char *path);
+bool iolog_mkdirs(const char *path);
/* iolog_filter.c */
-void *iolog_pwfilt_alloc();
+void *iolog_pwfilt_alloc(void);
bool iolog_pwfilt_add(void *handle, const char *pattern);
void iolog_pwfilt_free(void *handle);
bool iolog_pwfilt_remove(void *handle, const char *pattern);
diff --git a/include/sudo_json.h b/include/sudo_json.h
index ff942d276..d40118c18 100644
--- a/include/sudo_json.h
+++ b/include/sudo_json.h
@@ -65,34 +65,34 @@ struct json_container {
bool need_comma;
};
-sudo_dso_public bool sudo_json_init_v1(struct json_container *json, int indent, bool minimal, bool memfatal);
+sudo_dso_public bool sudo_json_init_v1(struct json_container *jsonc, int indent, bool minimal, bool memfatal);
#define sudo_json_init(_a, _b, _c, _d) sudo_json_init_v1((_a), (_b), (_c), (_d))
-sudo_dso_public void sudo_json_free_v1(struct json_container *json);
+sudo_dso_public void sudo_json_free_v1(struct json_container *jsonc);
#define sudo_json_free(_a) sudo_json_free_v1((_a))
-sudo_dso_public bool sudo_json_open_object_v1(struct json_container *json, const char *name);
+sudo_dso_public bool sudo_json_open_object_v1(struct json_container *jsonc, const char *name);
#define sudo_json_open_object(_a, _b) sudo_json_open_object_v1((_a), (_b))
-sudo_dso_public bool sudo_json_close_object_v1(struct json_container *json);
+sudo_dso_public bool sudo_json_close_object_v1(struct json_container *jsonc);
#define sudo_json_close_object(_a) sudo_json_close_object_v1((_a))
-sudo_dso_public bool sudo_json_open_array_v1(struct json_container *json, const char *name);
+sudo_dso_public bool sudo_json_open_array_v1(struct json_container *jsonc, const char *name);
#define sudo_json_open_array(_a, _b) sudo_json_open_array_v1((_a), (_b))
-sudo_dso_public bool sudo_json_close_array_v1(struct json_container *json);
+sudo_dso_public bool sudo_json_close_array_v1(struct json_container *jsonc);
#define sudo_json_close_array(_a) sudo_json_close_array_v1((_a))
-sudo_dso_public bool sudo_json_add_value_v1(struct json_container *json, const char *name, struct json_value *value);
+sudo_dso_public bool sudo_json_add_value_v1(struct json_container *jsonc, const char *name, struct json_value *value);
#define sudo_json_add_value(_a, _b, _c) sudo_json_add_value_v1((_a), (_b), (_c))
-sudo_dso_public bool sudo_json_add_value_as_object_v1(struct json_container *json, const char *name, struct json_value *value);
+sudo_dso_public bool sudo_json_add_value_as_object_v1(struct json_container *jsonc, const char *name, struct json_value *value);
#define sudo_json_add_value_as_object(_a, _b, _c) sudo_json_add_value_as_object_v1((_a), (_b), (_c))
-sudo_dso_public char *sudo_json_get_buf_v1(struct json_container *json);
+sudo_dso_public char *sudo_json_get_buf_v1(struct json_container *jsonc);
#define sudo_json_get_buf(_a) sudo_json_get_buf_v1((_a))
-sudo_dso_public unsigned int sudo_json_get_len_v1(struct json_container *json);
+sudo_dso_public unsigned int sudo_json_get_len_v1(struct json_container *jsonc);
#define sudo_json_get_len(_a) sudo_json_get_len_v1((_a))
#endif /* SUDO_JSON_H */
diff --git a/include/sudo_lbuf.h b/include/sudo_lbuf.h
index c0a20c5f7..c12be48bb 100644
--- a/include/sudo_lbuf.h
+++ b/include/sudo_lbuf.h
@@ -38,8 +38,8 @@ typedef int (*sudo_lbuf_output_t)(const char *);
sudo_dso_public void sudo_lbuf_init_v1(struct sudo_lbuf *lbuf, sudo_lbuf_output_t output, int indent, const char *continuation, int cols);
sudo_dso_public void sudo_lbuf_destroy_v1(struct sudo_lbuf *lbuf);
-sudo_dso_public bool sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...) __printflike(2, 3);
-sudo_dso_public bool sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...) __printflike(3, 4);
+sudo_dso_public bool sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...) sudo_printflike(2, 3);
+sudo_dso_public bool sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...) sudo_printflike(3, 4);
sudo_dso_public void sudo_lbuf_print_v1(struct sudo_lbuf *lbuf);
sudo_dso_public bool sudo_lbuf_error_v1(struct sudo_lbuf *lbuf);
sudo_dso_public void sudo_lbuf_clearerr_v1(struct sudo_lbuf *lbuf);
diff --git a/include/sudo_plugin.h b/include/sudo_plugin.h
index 032a5fd48..261763833 100644
--- a/include/sudo_plugin.h
+++ b/include/sudo_plugin.h
@@ -21,7 +21,7 @@
/* API version major/minor */
#define SUDO_API_VERSION_MAJOR 1
-#define SUDO_API_VERSION_MINOR 19
+#define SUDO_API_VERSION_MINOR 20
#define SUDO_API_MKVERSION(x, y) (((x) << 16) | (y))
#define SUDO_API_VERSION SUDO_API_MKVERSION(SUDO_API_VERSION_MAJOR, SUDO_API_VERSION_MINOR)
@@ -165,7 +165,7 @@ struct policy_plugin {
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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], char * const user_env[],
char * const plugin_options[], const char **errstr);
void (*close)(int exit_status, int error); /* wait status or error */
@@ -174,9 +174,9 @@ struct policy_plugin {
char *env_add[], char **command_info[],
char **argv_out[], char **user_env_out[], const char **errstr);
int (*list)(int argc, char * const argv[], int verbose,
- const char *list_user, const char **errstr);
+ const char *user, const char **errstr);
int (*validate)(const char **errstr);
- void (*invalidate)(int remove);
+ void (*invalidate)(int rmcred);
int (*init_session)(struct passwd *pwd, char **user_env_out[],
const char **errstr);
void (*register_hooks)(int version, int (*register_hook)(struct sudo_hook *hook));
@@ -190,7 +190,7 @@ struct io_plugin {
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[],
+ sudo_printf_t sudo_plugin_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[], const char **errstr);
@@ -223,7 +223,7 @@ struct audit_plugin {
unsigned int type; /* always SUDO_AUDIT_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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -249,7 +249,7 @@ struct approval_plugin {
unsigned int type; /* always SUDO_APPROVAL_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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int submit_optind,
char * const submit_argv[], char * const submit_envp[],
char * const plugin_options[], const char **errstr);
@@ -279,7 +279,8 @@ struct approval_plugin {
*/
struct sudoers_group_plugin {
unsigned int version;
- int (*init)(int version, sudo_printf_t sudo_printf, char *const argv[]);
+ int (*init)(int version, sudo_printf_t sudo_plugin_printf,
+ char *const argv[]);
void (*cleanup)(void);
int (*query)(const char *user, const char *group, const struct passwd *pwd);
};
diff --git a/include/sudo_util.h b/include/sudo_util.h
index ece8c2ed5..8dc2744fe 100644
--- a/include/sudo_util.h
+++ b/include/sudo_util.h
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2013-2018 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2013-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -247,6 +247,24 @@ sudo_dso_public const char *sudo_logpri2str_v1(int num);
/* mkdir_parents.c */
sudo_dso_public bool sudo_mkdir_parents_v1(const char *path, uid_t uid, gid_t gid, mode_t mode, bool quiet);
#define sudo_mkdir_parents(_a, _b, _c, _d, _e) sudo_mkdir_parents_v1((_a), (_b), (_c), (_d), (_e))
+sudo_dso_public int sudo_open_parent_dir_v1(const char *path, uid_t uid, gid_t gid, mode_t mode, bool quiet);
+#define sudo_open_parent_dir(_a, _b, _c, _d, _e) sudo_open_parent_dir_v1((_a), (_b), (_c), (_d), (_e))
+
+/* mmap_alloc.c */
+sudo_dso_public void *sudo_mmap_alloc_v1(size_t size) sudo_malloclike;
+#define sudo_mmap_alloc(_a) sudo_mmap_alloc_v1(_a)
+sudo_dso_public void *sudo_mmap_allocarray_v1(size_t count, size_t size) sudo_malloclike;
+#define sudo_mmap_allocarray(_a, _b) sudo_mmap_allocarray_v1((_a), (_b))
+sudo_dso_public char *sudo_mmap_strdup_v1(const char *str);
+#define sudo_mmap_strdup(_a) sudo_mmap_strdup_v1(_a)
+sudo_dso_public void sudo_mmap_free_v1(void *ptr);
+#define sudo_mmap_free(_a) sudo_mmap_free_v1(_a)
+sudo_dso_public int sudo_mmap_protect_v1(void *ptr);
+#define sudo_mmap_protect(_a) sudo_mmap_protect_v1(_a)
+
+/* multiarch.c */
+sudo_dso_public char *sudo_stat_multiarch_v1(const char *path, struct stat *sb);
+#define sudo_stat_multiarch(_a, _b) sudo_stat_multiarch_v1((_a), (_b))
/* parseln.c */
sudo_dso_public ssize_t sudo_parseln_v1(char **buf, size_t *bufsize, unsigned int *lineno, FILE *fp);
@@ -259,7 +277,7 @@ sudo_dso_public void initprogname2(const char *, const char * const *);
/* rcstr.c */
sudo_dso_public char *sudo_rcstr_dup(const char *src);
-sudo_dso_public char *sudo_rcstr_alloc(size_t len);
+sudo_dso_public char *sudo_rcstr_alloc(size_t len) sudo_malloclike;
sudo_dso_public char *sudo_rcstr_addref(const char *s);
sudo_dso_public void sudo_rcstr_delref(const char *s);
@@ -279,10 +297,14 @@ sudo_dso_public unsigned int sudo_pow2_roundup_v1(unsigned int len);
#define SUDO_PATH_WORLD_WRITABLE -4
#define SUDO_PATH_GROUP_WRITABLE -5
struct stat;
-sudo_dso_public int sudo_secure_dir_v1(const char *path, uid_t uid, gid_t gid, struct stat *sbp);
+sudo_dso_public int sudo_secure_dir_v1(const char *path, uid_t uid, gid_t gid, struct stat *sb);
#define sudo_secure_dir(_a, _b, _c, _d) sudo_secure_dir_v1((_a), (_b), (_c), (_d))
-sudo_dso_public int sudo_secure_file_v1(const char *path, uid_t uid, gid_t gid, struct stat *sbp);
+sudo_dso_public int sudo_secure_file_v1(const char *path, uid_t uid, gid_t gid, struct stat *sb);
#define sudo_secure_file(_a, _b, _c, _d) sudo_secure_file_v1((_a), (_b), (_c), (_d))
+sudo_dso_public int sudo_secure_open_file_v1(const char *path, uid_t uid, gid_t gid, struct stat *sb, int *error);
+#define sudo_secure_open_file(_a, _b, _c, _d, _e) sudo_secure_open_file_v1((_a), (_b), (_c), (_d), (_e))
+sudo_dso_public int sudo_secure_open_dir_v1(const char *path, uid_t uid, gid_t gid, struct stat *sb, int *error);
+#define sudo_secure_open_dir(_a, _b, _c, _d, _e) sudo_secure_open_dir_v1((_a), (_b), (_c), (_d), (_e))
/* setgroups.c */
sudo_dso_public int sudo_setgroups_v1(int ngids, const GETGROUPS_T *gids);
@@ -299,6 +321,8 @@ sudo_dso_public int sudo_strtobool_v1(const char *str);
/* strtonum.c */
/* Not versioned for historical reasons. */
sudo_dso_public long long sudo_strtonum(const char *, long long, long long, const char **);
+/* Not currently exported. */
+long long sudo_strtonumx(const char *str, long long minval, long long maxval, char **endp, const char **errstrp);
/* strtoid.c */
sudo_dso_public id_t sudo_strtoid_v1(const char *str, const char *sep, char **endp, const char **errstr);
@@ -325,6 +349,8 @@ sudo_dso_public bool sudo_term_raw_v1(int fd, int isig);
#define sudo_term_raw(_a, _b) sudo_term_raw_v1((_a), (_b))
sudo_dso_public bool sudo_term_restore_v1(int fd, bool flush);
#define sudo_term_restore(_a, _b) sudo_term_restore_v1((_a), (_b))
+sudo_dso_public bool sudo_term_is_raw_v1(int fd);
+#define sudo_term_is_raw(_a) sudo_term_is_raw_v1((_a))
/* ttyname_dev.c */
sudo_dso_public char *sudo_ttyname_dev_v1(dev_t tdev, char *name, size_t namelen);
diff --git a/lib/eventlog/Makefile.in b/lib/eventlog/Makefile.in
index 68fdcfc9e..45b9ad2e9 100644
--- a/lib/eventlog/Makefile.in
+++ b/lib/eventlog/Makefile.in
@@ -33,6 +33,7 @@ incdir = $(top_srcdir)/include
# Compiler & tools to use
CC = @CC@
LIBTOOL = @LIBTOOL@
+GREP = @GREP@
# C preprocessor flags
CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(srcdir) -I$(top_srcdir) @CPPFLAGS@
@@ -93,11 +94,6 @@ CHECK_WRAP_OBJS = check_wrap.lo logwrap.lo
all: libsudo_eventlog.la
-pvs-log-files: $(POBJS)
-
-pvs-studio: $(POBJS)
- plog-converter $(PVS_LOG_OPTS) $(POBJS)
-
depend:
$(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \
--builddir=$(abs_top_builddir) lib/eventlog/Makefile.in
@@ -147,13 +143,16 @@ cppcheck:
pvs-log-files: $(POBJS)
+pvs-studio: $(POBJS)
+ plog-converter $(PVS_LOG_OPTS) $(POBJS)
+
fuzz:
check-fuzzer:
check: $(TEST_PROGS) check-fuzzer
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
diff --git a/lib/eventlog/eventlog.c b/lib/eventlog/eventlog.c
index 223ab8a69..4621487d6 100644
--- a/lib/eventlog/eventlog.c
+++ b/lib/eventlog/eventlog.c
@@ -349,14 +349,14 @@ closefrom_nodebug(int lowfd)
#define MAX_MAILFLAGS 63
-static void __attribute__((__noreturn__))
+static sudo_noreturn void
exec_mailer(int pipein)
{
const struct eventlog_config *evl_conf = eventlog_getconf();
char *last, *mflags, *p, *argv[MAX_MAILFLAGS + 1];
const char *mpath = evl_conf->mailerpath;
int i;
- char * const root_envp[] = {
+ const char * const root_envp[] = {
"HOME=/",
"PATH=/usr/bin:/bin:/usr/sbin:/sbin",
"LOGNAME=root",
@@ -409,7 +409,7 @@ exec_mailer(int pipein)
}
sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
if (evl_conf->mailuid == ROOT_UID)
- execve(mpath, argv, root_envp);
+ execve(mpath, argv, (char **)root_envp);
else
execv(mpath, argv);
syslog(LOG_ERR, _("unable to execute %s: %m"), mpath); // -V618
@@ -627,24 +627,24 @@ send_mail(const struct eventlog *evlog, const char *fmt, ...)
}
static bool
-json_add_timestamp(struct json_container *json, const char *name,
+json_add_timestamp(struct json_container *jsonc, const char *name,
const struct timespec *ts, bool format_timestamp)
{
struct json_value json_value;
int len;
debug_decl(json_add_timestamp, SUDO_DEBUG_PLUGIN);
- if (!sudo_json_open_object(json, name))
+ if (!sudo_json_open_object(jsonc, name))
goto oom;
json_value.type = JSON_NUMBER;
json_value.u.number = ts->tv_sec;
- if (!sudo_json_add_value(json, "seconds", &json_value))
+ if (!sudo_json_add_value(jsonc, "seconds", &json_value))
goto oom;
json_value.type = JSON_NUMBER;
json_value.u.number = ts->tv_nsec;
- if (!sudo_json_add_value(json, "nanoseconds", &json_value))
+ if (!sudo_json_add_value(jsonc, "nanoseconds", &json_value))
goto oom;
if (format_timestamp) {
@@ -660,7 +660,7 @@ json_add_timestamp(struct json_container *json, const char *name,
if (len != 0 && timebuf[sizeof(timebuf) - 1] == '\0') {
json_value.type = JSON_STRING;
json_value.u.string = timebuf; // -V507
- if (!sudo_json_add_value(json, "iso8601", &json_value))
+ if (!sudo_json_add_value(jsonc, "iso8601", &json_value))
goto oom;
}
}
@@ -671,13 +671,13 @@ json_add_timestamp(struct json_container *json, const char *name,
if (len != 0 && timebuf[sizeof(timebuf) - 1] == '\0') {
json_value.type = JSON_STRING;
json_value.u.string = timebuf; // -V507
- if (!sudo_json_add_value(json, "localtime", &json_value))
+ if (!sudo_json_add_value(jsonc, "localtime", &json_value))
goto oom;
}
}
}
- if (!sudo_json_close_object(json))
+ if (!sudo_json_close_object(jsonc))
goto oom;
debug_return_bool(true);
@@ -693,7 +693,7 @@ oom:
* be stored and formatted by the caller.
*/
bool
-eventlog_store_json(struct json_container *json, const struct eventlog *evlog)
+eventlog_store_json(struct json_container *jsonc, const struct eventlog *evlog)
{
struct json_value json_value;
size_t i;
@@ -712,112 +712,112 @@ eventlog_store_json(struct json_container *json, const struct eventlog *evlog)
json_value.type = JSON_STRING;
json_value.u.string = evlog->submituser;
- if (!sudo_json_add_value(json, "submituser", &json_value))
+ if (!sudo_json_add_value(jsonc, "submituser", &json_value))
goto oom;
if (evlog->command != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->command;
- if (!sudo_json_add_value(json, "command", &json_value))
+ if (!sudo_json_add_value(jsonc, "command", &json_value))
goto oom;
}
if (evlog->runuser != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->runuser;
- if (!sudo_json_add_value(json, "runuser", &json_value))
+ if (!sudo_json_add_value(jsonc, "runuser", &json_value))
goto oom;
}
if (evlog->rungroup != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->rungroup;
- if (!sudo_json_add_value(json, "rungroup", &json_value))
+ if (!sudo_json_add_value(jsonc, "rungroup", &json_value))
goto oom;
}
if (evlog->runchroot != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->runchroot;
- if (!sudo_json_add_value(json, "runchroot", &json_value))
+ if (!sudo_json_add_value(jsonc, "runchroot", &json_value))
goto oom;
}
if (evlog->runcwd != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->runcwd;
- if (!sudo_json_add_value(json, "runcwd", &json_value))
+ if (!sudo_json_add_value(jsonc, "runcwd", &json_value))
goto oom;
}
if (evlog->ttyname != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->ttyname;
- if (!sudo_json_add_value(json, "ttyname", &json_value))
+ if (!sudo_json_add_value(jsonc, "ttyname", &json_value))
goto oom;
}
if (evlog->submithost != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->submithost;
- if (!sudo_json_add_value(json, "submithost", &json_value))
+ if (!sudo_json_add_value(jsonc, "submithost", &json_value))
goto oom;
}
if (evlog->cwd != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->cwd;
- if (!sudo_json_add_value(json, "submitcwd", &json_value))
+ if (!sudo_json_add_value(jsonc, "submitcwd", &json_value))
goto oom;
}
if (evlog->rungroup!= NULL && evlog->rungid != (gid_t)-1) {
json_value.type = JSON_ID;
json_value.u.id = evlog->rungid;
- if (!sudo_json_add_value(json, "rungid", &json_value))
+ if (!sudo_json_add_value(jsonc, "rungid", &json_value))
goto oom;
}
if (evlog->runuid != (uid_t)-1) {
json_value.type = JSON_ID;
json_value.u.id = evlog->runuid;
- if (!sudo_json_add_value(json, "runuid", &json_value))
+ if (!sudo_json_add_value(jsonc, "runuid", &json_value))
goto oom;
}
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->columns;
- if (!sudo_json_add_value(json, "columns", &json_value))
+ if (!sudo_json_add_value(jsonc, "columns", &json_value))
goto oom;
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->lines;
- if (!sudo_json_add_value(json, "lines", &json_value))
+ if (!sudo_json_add_value(jsonc, "lines", &json_value))
goto oom;
if (evlog->argv != NULL) {
- if (!sudo_json_open_array(json, "runargv"))
+ if (!sudo_json_open_array(jsonc, "runargv"))
goto oom;
for (i = 0; (cp = evlog->argv[i]) != NULL; i++) {
json_value.type = JSON_STRING;
json_value.u.string = cp;
- if (!sudo_json_add_value(json, NULL, &json_value))
+ if (!sudo_json_add_value(jsonc, NULL, &json_value))
goto oom;
}
- if (!sudo_json_close_array(json))
+ if (!sudo_json_close_array(jsonc))
goto oom;
}
if (evlog->envp != NULL) {
- if (!sudo_json_open_array(json, "runenv"))
+ if (!sudo_json_open_array(jsonc, "runenv"))
goto oom;
for (i = 0; (cp = evlog->envp[i]) != NULL; i++) {
json_value.type = JSON_STRING;
json_value.u.string = cp;
- if (!sudo_json_add_value(json, NULL, &json_value))
+ if (!sudo_json_add_value(jsonc, NULL, &json_value))
goto oom;
}
- if (!sudo_json_close_array(json))
+ if (!sudo_json_close_array(jsonc))
goto oom;
}
@@ -829,9 +829,9 @@ oom:
}
static bool
-default_json_cb(struct json_container *json, void *v)
+default_json_cb(struct json_container *jsonc, void *v)
{
- return eventlog_store_json(json, v);
+ return eventlog_store_json(jsonc, v);
}
static char *
@@ -840,7 +840,7 @@ format_json(int event_type, struct eventlog_args *args,
{
eventlog_json_callback_t info_cb = args->json_info_cb;
void *info = args->json_info;
- struct json_container json = { 0 };
+ struct json_container jsonc = { 0 };
struct json_value json_value;
const char *time_str, *type_str;
struct timespec now;
@@ -880,15 +880,15 @@ format_json(int event_type, struct eventlog_args *args,
debug_return_str(NULL);
}
- if (!sudo_json_init(&json, 4, compact, false))
+ if (!sudo_json_init(&jsonc, 4, compact, false))
goto bad;
- if (!sudo_json_open_object(&json, type_str))
+ if (!sudo_json_open_object(&jsonc, type_str))
goto bad;
if (evlog != NULL && evlog->uuid_str[0] != '\0') {
json_value.type = JSON_STRING;
json_value.u.string = evlog->uuid_str;
- if (!sudo_json_add_value(&json, "uuid", &json_value))
+ if (!sudo_json_add_value(&jsonc, "uuid", &json_value))
goto bad;
}
@@ -907,7 +907,7 @@ format_json(int event_type, struct eventlog_args *args,
}
json_value.type = JSON_STRING;
json_value.u.string = ereason ? ereason : args->reason;
- if (!sudo_json_add_value(&json, "reason", &json_value)) {
+ if (!sudo_json_add_value(&jsonc, "reason", &json_value)) {
free(ereason);
goto bad;
}
@@ -915,7 +915,7 @@ format_json(int event_type, struct eventlog_args *args,
}
/* Log event time on server (set earlier) */
- if (!json_add_timestamp(&json, "server_time", &now, true)) {
+ if (!json_add_timestamp(&jsonc, "server_time", &now, true)) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable format timestamp");
goto bad;
@@ -923,7 +923,7 @@ format_json(int event_type, struct eventlog_args *args,
/* Log event time from client */
if (args->event_time != NULL) {
- if (!json_add_timestamp(&json, time_str, args->event_time, true)) {
+ if (!json_add_timestamp(&jsonc, time_str, args->event_time, true)) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable format timestamp");
goto bad;
@@ -938,7 +938,7 @@ format_json(int event_type, struct eventlog_args *args,
}
if (sudo_timespecisset(&evlog->run_time)) {
- if (!json_add_timestamp(&json, "run_time", &evlog->run_time, false)) {
+ if (!json_add_timestamp(&jsonc, "run_time", &evlog->run_time, false)) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable format timestamp");
goto bad;
@@ -947,17 +947,17 @@ format_json(int event_type, struct eventlog_args *args,
if (evlog->signal_name != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->signal_name;
- if (!sudo_json_add_value(&json, "signal", &json_value))
+ if (!sudo_json_add_value(&jsonc, "signal", &json_value))
goto bad;
json_value.type = JSON_BOOL;
json_value.u.boolean = evlog->dumped_core;
- if (!sudo_json_add_value(&json, "dumped_core", &json_value))
+ if (!sudo_json_add_value(&jsonc, "dumped_core", &json_value))
goto bad;
}
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->exit_value;
- if (!sudo_json_add_value(&json, "exit_value", &json_value))
+ if (!sudo_json_add_value(&jsonc, "exit_value", &json_value))
goto bad;
}
@@ -966,18 +966,18 @@ format_json(int event_type, struct eventlog_args *args,
if (evlog->peeraddr != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->peeraddr;
- if (!sudo_json_add_value(&json, "peeraddr", &json_value))
+ if (!sudo_json_add_value(&jsonc, "peeraddr", &json_value))
goto bad;
}
if (evlog->iolog_path != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->iolog_path;
- if (!sudo_json_add_value(&json, "iolog_path", &json_value))
+ if (!sudo_json_add_value(&jsonc, "iolog_path", &json_value))
goto bad;
if (sudo_timespecisset(&evlog->iolog_offset)) {
- if (!json_add_timestamp(&json, "iolog_offset", &evlog->iolog_offset, false)) {
+ if (!json_add_timestamp(&jsonc, "iolog_offset", &evlog->iolog_offset, false)) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable format timestamp");
goto bad;
@@ -988,23 +988,23 @@ format_json(int event_type, struct eventlog_args *args,
/* Write log info. */
if (info != NULL) {
- if (!info_cb(&json, info))
+ if (!info_cb(&jsonc, info))
goto bad;
}
- if (!sudo_json_close_object(&json))
+ if (!sudo_json_close_object(&jsonc))
goto bad;
/* Caller is responsible for freeing the buffer. */
- debug_return_str(sudo_json_get_buf(&json));
+ debug_return_str(sudo_json_get_buf(&jsonc));
bad:
- sudo_json_free(&json);
+ sudo_json_free(&jsonc);
debug_return_str(NULL);
}
/*
- * Log a message to syslog, pre-pending the username and splitting the
+ * Log a message to syslog, prepending the username and splitting the
* message into parts if it is longer than syslog_maxlen.
*/
static bool
diff --git a/lib/eventlog/logwrap.c b/lib/eventlog/logwrap.c
index 615598230..2e6994804 100644
--- a/lib/eventlog/logwrap.c
+++ b/lib/eventlog/logwrap.c
@@ -35,7 +35,7 @@
size_t
eventlog_writeln(FILE *fp, char *line, size_t linelen, size_t maxlen)
{
- char *indent = "";
+ const char *indent = "";
char *beg = line;
char *end;
int len;
diff --git a/lib/eventlog/regress/logwrap/check_wrap.c b/lib/eventlog/regress/logwrap/check_wrap.c
index 19f6b890f..d14448825 100644
--- a/lib/eventlog/regress/logwrap/check_wrap.c
+++ b/lib/eventlog/regress/logwrap/check_wrap.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <limits.h>
+#include <unistd.h>
#define SUDO_ERROR_WRAP 0
diff --git a/lib/fuzzstub/Makefile.in b/lib/fuzzstub/Makefile.in
index 76baf2eb5..8c472b5cd 100644
--- a/lib/fuzzstub/Makefile.in
+++ b/lib/fuzzstub/Makefile.in
@@ -88,11 +88,6 @@ POBJS = $(IOBJS:.i=.plog)
all: libsudo_fuzzstub.la
-pvs-log-files: $(POBJS)
-
-pvs-studio: $(POBJS)
- plog-converter $(PVS_LOG_OPTS) $(POBJS)
-
depend:
$(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \
--builddir=$(abs_top_builddir) lib/fuzzstub/Makefile.in
@@ -139,6 +134,9 @@ cppcheck:
pvs-log-files: $(POBJS)
+pvs-studio: $(POBJS)
+ plog-converter $(PVS_LOG_OPTS) $(POBJS)
+
fuzz:
check-fuzzer:
diff --git a/lib/iolog/Makefile.in b/lib/iolog/Makefile.in
index 780a9c220..2dde029d0 100644
--- a/lib/iolog/Makefile.in
+++ b/lib/iolog/Makefile.in
@@ -35,6 +35,7 @@ cross_compiling = @CROSS_COMPILING@
CC = @CC@
LIBTOOL = @LIBTOOL@
SHA1SUM = @SHA1SUM@
+GREP = @GREP@
SED = @SED@
# Libraries
@@ -140,11 +141,6 @@ FUZZ_IOLOG_TIMING_CORPUS = $(srcdir)/regress/corpus/seed/timing/timing.*
all: libsudo_iolog.la
-pvs-log-files: $(POBJS)
-
-pvs-studio: $(POBJS)
- plog-converter $(PVS_LOG_OPTS) $(POBJS)
-
depend:
$(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \
--builddir=$(abs_top_builddir) lib/iolog/Makefile.in
@@ -204,7 +200,7 @@ fuzz_iolog_json_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_iolog_json: fuzz_iolog_json
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -231,7 +227,7 @@ fuzz_iolog_legacy_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_iolog_legacy: fuzz_iolog_legacy
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -258,7 +254,7 @@ fuzz_iolog_timing_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_iolog_timing: fuzz_iolog_timing
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -305,11 +301,14 @@ cppcheck:
pvs-log-files: $(POBJS)
+pvs-studio: $(POBJS)
+ plog-converter $(PVS_LOG_OPTS) $(POBJS)
+
fuzz: run-fuzz_iolog_json run-fuzz_iolog_legacy run-fuzz_iolog_timing
check-fuzzer: $(FUZZ_PROGS)
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -328,7 +327,7 @@ check-fuzzer: $(FUZZ_PROGS)
check: $(TEST_PROGS) check-fuzzer
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -498,13 +497,15 @@ fuzz_iolog_timing.plog: fuzz_iolog_timing.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/fuzz/fuzz_iolog_timing.c --i-file $< --output-file $@
host_port.lo: $(srcdir)/host_port.c $(incdir)/compat/stdbool.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
- $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \
- $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/host_port.c
host_port.i: $(srcdir)/host_port.c $(incdir)/compat/stdbool.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
- $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \
- $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
$(CC) -E -o $@ $(CPPFLAGS) $<
host_port.plog: host_port.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/host_port.c --i-file $< --output-file $@
diff --git a/lib/iolog/host_port.c b/lib/iolog/host_port.c
index b16c65867..0622f4c44 100644
--- a/lib/iolog/host_port.c
+++ b/lib/iolog/host_port.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
@@ -30,6 +35,7 @@
#include "sudo_debug.h"
#include "sudo_gettext.h"
#include "sudo_util.h"
+#include "sudo_iolog.h"
/*
* Parse a string in the form host[:port] where host can also be
@@ -38,7 +44,7 @@
*/
bool
iolog_parse_host_port(char *str, char **hostp, char **portp, bool *tlsp,
- char *defport, char *defport_tls)
+ const char *defport, const char *defport_tls)
{
char *flags, *port, *host = str;
bool ret = false;
@@ -87,7 +93,7 @@ iolog_parse_host_port(char *str, char **hostp, char **portp, bool *tlsp,
}
if (port == NULL)
- port = tls ? defport_tls : defport;
+ port = tls ? (char *)defport_tls : (char *)defport;
else if (*port == '\0')
goto done;
diff --git a/lib/iolog/hostcheck.c b/lib/iolog/hostcheck.c
index fc664cf71..d23514e8b 100644
--- a/lib/iolog/hostcheck.c
+++ b/lib/iolog/hostcheck.c
@@ -19,7 +19,7 @@
* PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
*/
-#include "config.h"
+#include <config.h>
#if defined(HAVE_OPENSSL)
# if defined(HAVE_WOLFSSL)
@@ -188,7 +188,7 @@ matches_common_name(const char *hostname, const char *ipaddr, const X509 *cert,
{
X509_NAME_ENTRY *common_name_entry = NULL;
ASN1_STRING *common_name_asn1 = NULL;
- int common_name_loc = -1;
+ int common_name_loc;
debug_decl(matches_common_name, SUDO_DEBUG_UTIL);
/* Find the position of the CN field in the Subject field of the certificate */
@@ -268,7 +268,7 @@ matches_subject_alternative_name(const char *hostname, const char *ipaddr, const
{
HostnameValidationResult result = MatchNotFound;
int i;
- int san_names_nb = -1;
+ int san_names_nb;
STACK_OF(GENERAL_NAME) *san_names = NULL;
debug_decl(matches_subject_alternative_name, SUDO_DEBUG_UTIL);
diff --git a/lib/iolog/iolog_loginfo.c b/lib/iolog/iolog_loginfo.c
index 68b922454..26902593d 100644
--- a/lib/iolog/iolog_loginfo.c
+++ b/lib/iolog/iolog_loginfo.c
@@ -153,34 +153,34 @@ iolog_write_info_file_legacy(int dfd, struct eventlog *evlog)
static bool
iolog_write_info_file_json(int dfd, struct eventlog *evlog)
{
- struct json_container json;
+ struct json_container jsonc;
struct json_value json_value;
bool ret = false;
FILE *fp = NULL;
int fd = -1;
debug_decl(iolog_write_info_file_json, SUDO_DEBUG_UTIL);
- if (!sudo_json_init(&json, 4, false, false))
+ if (!sudo_json_init(&jsonc, 4, false, false))
debug_return_bool(false);
/* Timestamp */
- if (!sudo_json_open_object(&json, "timestamp"))
+ if (!sudo_json_open_object(&jsonc, "timestamp"))
goto oom;
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->submit_time.tv_sec;
- if (!sudo_json_add_value(&json, "seconds", &json_value))
+ if (!sudo_json_add_value(&jsonc, "seconds", &json_value))
goto oom;
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->submit_time.tv_nsec;
- if (!sudo_json_add_value(&json, "nanoseconds", &json_value))
+ if (!sudo_json_add_value(&jsonc, "nanoseconds", &json_value))
goto oom;
- if (!sudo_json_close_object(&json))
+ if (!sudo_json_close_object(&jsonc))
goto oom;
- if (!eventlog_store_json(&json, evlog))
+ if (!eventlog_store_json(&jsonc, evlog))
goto done;
fd = iolog_openat(dfd, "log.json", O_CREAT|O_TRUNC|O_WRONLY);
@@ -197,7 +197,7 @@ iolog_write_info_file_json(int dfd, struct eventlog *evlog)
}
fd = -1;
- fprintf(fp, "{%s\n}\n", sudo_json_get_buf(&json));
+ fprintf(fp, "{%s\n}\n", sudo_json_get_buf(&jsonc));
fflush(fp);
if (ferror(fp)) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
@@ -211,7 +211,7 @@ iolog_write_info_file_json(int dfd, struct eventlog *evlog)
oom:
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
done:
- sudo_json_free(&json);
+ sudo_json_free(&jsonc);
if (fp != NULL)
fclose(fp);
if (fd != -1)
diff --git a/lib/iolog/iolog_mkdirs.c b/lib/iolog/iolog_mkdirs.c
index baa9eba00..c9ab980c4 100644
--- a/lib/iolog/iolog_mkdirs.c
+++ b/lib/iolog/iolog_mkdirs.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -46,7 +46,7 @@
* Create directory and any parent directories as needed.
*/
bool
-iolog_mkdirs(char *path)
+iolog_mkdirs(const char *path)
{
const mode_t iolog_filemode = iolog_get_file_mode();
const mode_t iolog_dirmode = iolog_get_dir_mode();
@@ -96,29 +96,33 @@ iolog_mkdirs(char *path)
/* umask must not be more restrictive than the file modes. */
omask = umask(ACCESSPERMS & ~(iolog_filemode|iolog_dirmode));
- ok = sudo_mkdir_parents(path, iolog_uid, iolog_gid, iolog_dirmode, true);
- if (!ok && errno == EACCES) {
+ ok = false;
+ if (dfd != -1)
+ close(dfd);
+ dfd = sudo_open_parent_dir(path, iolog_uid, iolog_gid, iolog_dirmode, true);
+ if (dfd == -1 && errno == EACCES) {
/* Try again as the I/O log owner (for NFS). */
uid_changed = iolog_swapids(false);
if (uid_changed)
- ok = sudo_mkdir_parents(path, -1, -1, iolog_dirmode, false);
+ dfd = sudo_open_parent_dir(path, -1, -1, iolog_dirmode, false);
}
- if (ok) {
+ if (dfd != -1) {
/* Create final path component. */
+ const char *base = sudo_basename(path);
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;
+ ok = mkdirat(dfd, base, iolog_dirmode) == 0 || errno == EEXIST;
if (!ok) {
if (errno == EACCES && !uid_changed) {
/* Try again as the I/O log owner (for NFS). */
uid_changed = iolog_swapids(false);
if (uid_changed)
- ok = mkdir(path, iolog_dirmode) == 0 || errno == EEXIST;
+ ok = mkdirat(dfd, base, iolog_dirmode) == 0 || errno == EEXIST;
}
if (!ok)
sudo_warn(U_("unable to mkdir %s"), path);
} else {
- if (chown(path, iolog_uid, iolog_gid) != 0) {
+ if (fchownat(dfd, base, iolog_uid, iolog_gid, AT_SYMLINK_NOFOLLOW) != 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);
diff --git a/lib/iolog/iolog_mkdtemp.c b/lib/iolog/iolog_mkdtemp.c
index e7904e312..ea83f555a 100644
--- a/lib/iolog/iolog_mkdtemp.c
+++ b/lib/iolog/iolog_mkdtemp.c
@@ -52,36 +52,40 @@ iolog_mkdtemp(char *path)
const mode_t iolog_dirmode = iolog_get_dir_mode();
const uid_t iolog_uid = iolog_get_uid();
const gid_t iolog_gid = iolog_get_gid();
- bool ok, uid_changed = false;
+ bool ok = false, uid_changed = false;
mode_t omask;
+ int dfd;
debug_decl(iolog_mkdtemp, SUDO_DEBUG_UTIL);
/* umask must not be more restrictive than the file modes. */
omask = umask(ACCESSPERMS & ~(iolog_filemode|iolog_dirmode));
- ok = sudo_mkdir_parents(path, iolog_uid, iolog_gid, iolog_dirmode, true);
- if (!ok && errno == EACCES) {
+ dfd = sudo_open_parent_dir(path, iolog_uid, iolog_gid, iolog_dirmode, true);
+ if (dfd == -1 && errno == EACCES) {
/* Try again as the I/O log owner (for NFS). */
uid_changed = iolog_swapids(false);
if (uid_changed)
- ok = sudo_mkdir_parents(path, -1, -1, iolog_dirmode, false);
+ dfd = sudo_open_parent_dir(path, -1, -1, iolog_dirmode, false);
}
- if (ok) {
+ if (dfd != -1) {
/* Create final path component. */
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"mkdtemp %s", path);
/* We cannot retry mkdtemp() so always open as iolog user */
if (!uid_changed)
uid_changed = iolog_swapids(false);
- if (mkdtemp(path) == NULL) {
+ if (mkdtempat(dfd, path) == NULL) {
sudo_warn(U_("unable to mkdir %s"), path);
ok = false;
} else {
if (chmod(path, iolog_dirmode) != 0) {
+ /* Not a fatal error, pre-existing mode is 0700. */
sudo_warn(U_("unable to change mode of %s to 0%o"),
path, (unsigned int)iolog_dirmode);
}
+ ok = true;
}
+ close(dfd);
}
umask(omask);
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_json.c b/lib/iolog/regress/fuzz/fuzz_iolog_json.c
index 1ea3536a7..ec1e428b0 100644
--- a/lib/iolog/regress/fuzz/fuzz_iolog_json.c
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_json.c
@@ -36,6 +36,8 @@
#include "iolog_json.h"
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
static FILE *
open_data(const uint8_t *data, size_t size)
{
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_legacy.c b/lib/iolog/regress/fuzz/fuzz_iolog_legacy.c
index d2ced37bd..a52bf56af 100644
--- a/lib/iolog/regress/fuzz/fuzz_iolog_legacy.c
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_legacy.c
@@ -34,6 +34,8 @@
#include "sudo_plugin.h"
#include "sudo_util.h"
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
static FILE *
open_data(const uint8_t *data, size_t size)
{
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_timing.c b/lib/iolog/regress/fuzz/fuzz_iolog_timing.c
index 785f3839f..cf894973a 100644
--- a/lib/iolog/regress/fuzz/fuzz_iolog_timing.c
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_timing.c
@@ -41,6 +41,8 @@
#include "sudo_plugin.h"
#include "sudo_util.h"
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
static int
fuzz_conversation(int num_msgs, const struct sudo_conv_message msgs[],
struct sudo_conv_reply replies[], struct sudo_conv_callback *callback)
diff --git a/lib/iolog/regress/host_port/host_port_test.c b/lib/iolog/regress/host_port/host_port_test.c
index 065e216e7..9b504e1fe 100644
--- a/lib/iolog/regress/host_port/host_port_test.c
+++ b/lib/iolog/regress/host_port/host_port_test.c
@@ -45,8 +45,8 @@ struct host_port_test {
const char *host; /* parsed host */
const char *port; /* parsed port */
bool tls; /* parsed TLS flag */
- char *defport; /* default port */
- char *defport_tls; /* default port */
+ const char *defport; /* default port */
+ const char *defport_tls; /* default port */
bool ret; /* return value */
};
diff --git a/lib/iolog/regress/iolog_json/check_iolog_json.c b/lib/iolog/regress/iolog_json/check_iolog_json.c
index df6841135..b50caca1a 100644
--- a/lib/iolog/regress/iolog_json/check_iolog_json.c
+++ b/lib/iolog/regress/iolog_json/check_iolog_json.c
@@ -34,8 +34,8 @@
sudo_dso_public int main(int argc, char *argv[]);
-bool
-json_print_object(struct json_container *json, struct json_object *object)
+static bool
+json_print_object(struct json_container *jsonc, struct json_object *object)
{
struct json_item *item;
struct json_value json_value;
@@ -46,40 +46,40 @@ json_print_object(struct json_container *json, struct json_object *object)
case JSON_STRING:
json_value.type = JSON_STRING;
json_value.u.string = item->u.string;
- if (!sudo_json_add_value(json, item->name, &json_value))
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
goto oom;
break;
case JSON_NUMBER:
json_value.type = JSON_NUMBER;
json_value.u.number = item->u.number;
- if (!sudo_json_add_value(json, item->name, &json_value))
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
goto oom;
break;
case JSON_OBJECT:
- if (!sudo_json_open_object(json, item->name))
+ if (!sudo_json_open_object(jsonc, item->name))
goto oom;
- if (!json_print_object(json, &item->u.child))
+ if (!json_print_object(jsonc, &item->u.child))
goto done;
- if (!sudo_json_close_object(json))
+ if (!sudo_json_close_object(jsonc))
goto oom;
break;
case JSON_ARRAY:
- if (!sudo_json_open_array(json, item->name))
+ if (!sudo_json_open_array(jsonc, item->name))
goto oom;
- if (!json_print_object(json, &item->u.child))
+ if (!json_print_object(jsonc, &item->u.child))
goto done;
- if (!sudo_json_close_array(json))
+ if (!sudo_json_close_array(jsonc))
goto oom;
break;
case JSON_BOOL:
json_value.type = JSON_BOOL;
json_value.u.boolean = item->u.boolean;
- if (!sudo_json_add_value(json, item->name, &json_value))
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
goto oom;
break;
case JSON_NULL:
json_value.type = JSON_NULL;
- if (!sudo_json_add_value(json, item->name, &json_value))
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
goto oom;
break;
default:
@@ -98,7 +98,7 @@ done:
}
static bool
-json_format(struct json_container *json, struct json_object *object)
+json_format(struct json_container *jsonc, struct json_object *object)
{
struct json_item *item;
bool ret = false;
@@ -111,7 +111,7 @@ json_format(struct json_container *json, struct json_object *object)
}
object = &item->u.child;
- if (!json_print_object(json, object))
+ if (!json_print_object(jsonc, object))
goto done;
ret = true;
@@ -129,7 +129,7 @@ usage(void)
}
static bool
-compare(FILE *fp, const char *infile, struct json_container *json)
+compare(FILE *fp, const char *infile, struct json_container *jsonc)
{
const char *cp;
unsigned int lineno = 0;
@@ -137,7 +137,7 @@ compare(FILE *fp, const char *infile, struct json_container *json)
char *line = NULL;
ssize_t len;
- cp = sudo_json_get_buf(json);
+ cp = sudo_json_get_buf(jsonc);
while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) {
lineno++;
@@ -192,7 +192,7 @@ main(int argc, char *argv[])
usage();
for (i = 0; i < argc; i++) {
- struct json_container json;
+ struct json_container jsonc;
const char *infile = argv[i];
const char *outfile = argv[i];
const char *cp;
@@ -202,7 +202,7 @@ main(int argc, char *argv[])
ntests++;
- if (!sudo_json_init(&json, 4, false, true)) {
+ if (!sudo_json_init(&jsonc, 4, false, true)) {
errors++;
continue;
}
@@ -219,7 +219,7 @@ main(int argc, char *argv[])
}
/* Format as pretty-printed JSON */
- if (!json_format(&json, &root)) {
+ if (!json_format(&jsonc, &root)) {
errors++;
goto next;
}
@@ -237,18 +237,18 @@ main(int argc, char *argv[])
/* Compare output to expected output. */
rewind(outfp);
- if (!compare(outfp, outfile, &json))
+ if (!compare(outfp, outfile, &jsonc))
errors++;
/* Write the formatted output to stdout for -c (cat) */
if (cat) {
- fprintf(stdout, "{%s\n}\n", sudo_json_get_buf(&json));
+ fprintf(stdout, "{%s\n}\n", sudo_json_get_buf(&jsonc));
fflush(stdout);
}
next:
free_json_items(&root.items);
- sudo_json_free(&json);
+ sudo_json_free(&jsonc);
if (infp != NULL)
fclose(infp);
if (outfp != NULL && outfp != infp)
diff --git a/lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c b/lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c
index 5d05f8239..f0ece1a09 100644
--- a/lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c
+++ b/lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c
@@ -66,7 +66,7 @@ int
main(int argc, char *argv[])
{
char testdir[] = "mkpath.XXXXXX";
- char *rmargs[] = { "rm", "-rf", NULL, NULL };
+ const char *rmargs[] = { "rm", "-rf", NULL, NULL };
int ch, status, ntests = 0, errors = 0;
initprogname(argc > 0 ? argv[0] : "check_iolog_mkpath");
@@ -97,7 +97,7 @@ main(int argc, char *argv[])
}
/* Clean up (avoid running via shell) */
- execvp("rm", rmargs);
+ execvp("rm", (char **)rmargs);
wait(&status);
return errors;
diff --git a/lib/iolog/regress/iolog_timing/check_iolog_timing.c b/lib/iolog/regress/iolog_timing/check_iolog_timing.c
index e0db4167e..915b60473 100644
--- a/lib/iolog/regress/iolog_timing/check_iolog_timing.c
+++ b/lib/iolog/regress/iolog_timing/check_iolog_timing.c
@@ -49,7 +49,7 @@ static struct parse_delay_test {
/*
* Test iolog_parse_delay()
*/
-void
+static void
test_parse_delay(int *ntests, int *nerrors)
{
unsigned int i;
@@ -106,7 +106,7 @@ static struct adjust_delay_test {
/*
* Test iolog_adjust_delay()
*/
-void
+static void
test_adjust_delay(int *ntests, int *nerrors)
{
unsigned int i;
diff --git a/lib/logsrv/Makefile.in b/lib/logsrv/Makefile.in
index 119ebf05a..f81698fa9 100644
--- a/lib/logsrv/Makefile.in
+++ b/lib/logsrv/Makefile.in
@@ -86,11 +86,6 @@ GENERATED = log_server.pb-c.h log_server.pb-c.c
all: liblogsrv.la
-pvs-log-files: $(POBJS)
-
-pvs-studio: $(POBJS)
- plog-converter $(PVS_LOG_OPTS) $(POBJS)
-
depend:
$(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \
--builddir=$(abs_top_builddir) lib/logsrv/Makefile.in
@@ -149,7 +144,9 @@ splint:
cppcheck:
cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c
-pvs-log-files: $(POBJS)
+pvs-log-files:
+
+pvs-studio:
fuzz:
@@ -185,8 +182,5 @@ cleandir: realclean
log_server.pb-c.lo: $(srcdir)/log_server.pb-c.c $(incdir)/log_server.pb-c.h \
$(incdir)/protobuf-c/protobuf-c.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/log_server.pb-c.c
-log_server.pb-c.i: $(srcdir)/log_server.pb-c.c $(incdir)/log_server.pb-c.h \
- $(incdir)/protobuf-c/protobuf-c.h
- $(CC) -E -o $@ $(CPPFLAGS) $<
-log_server.pb-c.plog: log_server.pb-c.i
- rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/log_server.pb-c.c --i-file $< --output-file $@
+log_server.pb-c.plog: $(srcdir)/log_server.pb-c.c
+ touch $@
diff --git a/lib/protobuf-c/Makefile.in b/lib/protobuf-c/Makefile.in
index 89846b4e4..49b1e9d9d 100644
--- a/lib/protobuf-c/Makefile.in
+++ b/lib/protobuf-c/Makefile.in
@@ -81,11 +81,6 @@ POBJS = $(IOBJS:.i=.plog)
all: libprotobuf-c.la
-pvs-log-files: $(POBJS)
-
-pvs-studio: $(POBJS)
- plog-converter $(PVS_LOG_OPTS) $(POBJS)
-
depend:
$(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \
--builddir=$(abs_top_builddir) lib/protobuf-c/Makefile.in
@@ -144,7 +139,9 @@ splint:
cppcheck:
cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c
-pvs-log-files: $(POBJS)
+pvs-log-files:
+
+pvs-studio:
fuzz:
@@ -173,11 +170,11 @@ cleandir: realclean
.PHONY: clean mostlyclean distclean cleandir clobber realclean
# Autogenerated dependencies, do not modify
-protobuf-c.lo: $(srcdir)/protobuf-c.c $(incdir)/protobuf-c/protobuf-c.h \
- $(top_builddir)/config.h
+protobuf-c.lo: $(srcdir)/protobuf-c.c $(incdir)/compat/endian.h \
+ $(incdir)/protobuf-c/protobuf-c.h $(top_builddir)/config.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/protobuf-c.c
-protobuf-c.i: $(srcdir)/protobuf-c.c $(incdir)/protobuf-c/protobuf-c.h \
- $(top_builddir)/config.h
+protobuf-c.i: $(srcdir)/protobuf-c.c $(incdir)/compat/endian.h \
+ $(incdir)/protobuf-c/protobuf-c.h $(top_builddir)/config.h
$(CC) -E -o $@ $(CPPFLAGS) $<
protobuf-c.plog: protobuf-c.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/protobuf-c.c --i-file $< --output-file $@
diff --git a/lib/protobuf-c/protobuf-c.c b/lib/protobuf-c/protobuf-c.c
index 3cc22c5f0..56f8dc8f1 100644
--- a/lib/protobuf-c/protobuf-c.c
+++ b/lib/protobuf-c/protobuf-c.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008-2015, Dave Benson and the protobuf-c authors.
+ * Copyright (c) 2008-2022, Dave Benson and the protobuf-c authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -2618,14 +2618,14 @@ parse_required_member(ScannedMember *scanned_member,
return FALSE;
def_mess = scanned_member->field->default_value;
- if (len >= pref_len) {
+ if (len >= pref_len)
subm = protobuf_c_message_unpack(scanned_member->field->descriptor,
allocator,
len - pref_len,
data + pref_len);
- } else {
+ else
subm = NULL;
- }
+
if (maybe_clear &&
*pmessage != NULL &&
*pmessage != def_mess)
@@ -3246,6 +3246,9 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
/* allocate space for repeated fields, also check that all required fields have been set */
for (f = 0; f < desc->n_fields; f++) {
const ProtobufCFieldDescriptor *field = desc->fields + f;
+ if (field == NULL) {
+ continue;
+ }
if (field->label == PROTOBUF_C_LABEL_REPEATED) {
size_t siz =
sizeof_elt_in_repeated_array(field->type);
diff --git a/lib/util/Makefile.in b/lib/util/Makefile.in
index 856ee1e27..ad97748f8 100644
--- a/lib/util/Makefile.in
+++ b/lib/util/Makefile.in
@@ -55,6 +55,7 @@ CPP = @CPP@
HOSTCPP = @CPP_FOR_BUILD@
LIBTOOL = @LIBTOOL@
SHA1SUM = @SHA1SUM@
+GREP = @GREP@
SED = @SED@
AWK = @AWK@
@@ -110,10 +111,10 @@ 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 \
+TEST_PROGS = conf_test hltq_test parseln_test progname_test parse_gids_test \
+ getgids getgrouplist_test multiarch_test open_parent_dir_test \
strsplit_test strtobool_test strtoid_test strtomode_test \
- strtonum_test parse_gids_test getgids getgrouplist_test \
- uuid_test @COMPAT_TEST_PROGS@
+ strtonum_test uuid_test @COMPAT_TEST_PROGS@
TEST_LIBS = @LIBS@
TEST_LDFLAGS = @LDFLAGS@
TEST_VERBOSE =
@@ -143,11 +144,11 @@ SHELL = @SHELL@
LTOBJS = basename.lo @DIGEST@ event.lo fatal.lo key_val.lo gethostname.lo \
gettime.lo getgrouplist.lo gidlist.lo json.lo lbuf.lo locking.lo \
- logfac.lo logpri.lo mkdir_parents.lo parseln.lo progname.lo rcstr.lo \
- regex.lo roundup.lo secure_path.lo setgroups.lo strsplit.lo \
- strtobool.lo strtoid.lo strtomode.lo strtonum.lo sudo_conf.lo \
- sudo_debug.lo sudo_dso.lo term.lo ttyname_dev.lo \
- ttysize.lo uuid.lo @COMMON_OBJS@ @LTLIBOBJS@
+ logfac.lo logpri.lo mkdir_parents.lo mmap_alloc.lo multiarch.lo \
+ parseln.lo progname.lo rcstr.lo regex.lo roundup.lo secure_path.lo \
+ setgroups.lo strsplit.lo strtobool.lo strtoid.lo strtomode.lo \
+ strtonum.lo sudo_conf.lo sudo_debug.lo sudo_dso.lo term.lo \
+ ttyname_dev.lo ttysize.lo uuid.lo @COMMON_OBJS@ @LTLIBOBJS@
IOBJS = $(LTOBJS:.lo=.i)
@@ -171,6 +172,10 @@ GLOBTEST_OBJS = globtest.lo glob.lo
GETDELIM_TEST_OBJS = getdelim_test.lo getdelim.lo
+MULTIARCH_TEST_OBJS = multiarch_test.lo multiarch.lo
+
+OPEN_PARENT_DIR_TEST_OBJS = open_parent_dir_test.lo mkdir_parents.lo
+
STRTOBOOL_TEST_OBJS = strtobool_test.lo strtobool.lo
STRTOMODE_TEST_OBJS = strtomode_test.lo strtomode.lo
@@ -197,11 +202,6 @@ FUZZ_SUDO_CONF_CORPUS = $(srcdir)/regress/corpus/seed/sudo_conf/sudo.conf.*
all: libsudo_util.la
-pvs-log-files: $(POBJS)
-
-pvs-studio: $(POBJS)
- plog-converter $(PVS_LOG_OPTS) $(POBJS)
-
depend: siglist.c signame.c
$(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \
--builddir=$(abs_top_builddir) lib/util/Makefile.in
@@ -287,6 +287,12 @@ hltq_test: $(HLTQ_TEST_OBJS) libsudo_util.la
mktemp_test: $(MKTEMP_TEST_OBJS) libsudo_util.la
$(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(MKTEMP_TEST_OBJS) libsudo_util.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+multiarch_test: $(MULTIARCH_TEST_OBJS) libsudo_util.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(MULTIARCH_TEST_OBJS) libsudo_util.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
+open_parent_dir_test: $(OPEN_PARENT_DIR_TEST_OBJS) libsudo_util.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(OPEN_PARENT_DIR_TEST_OBJS) libsudo_util.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
parseln_test: $(PARSELN_TEST_OBJS) libsudo_util.la
$(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(PARSELN_TEST_OBJS) libsudo_util.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
@@ -336,7 +342,7 @@ fuzz_sudo_conf_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_sudo_conf: fuzz_sudo_conf
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -395,11 +401,14 @@ cppcheck:
pvs-log-files: $(POBJS)
+pvs-studio: $(POBJS)
+ plog-converter $(PVS_LOG_OPTS) $(POBJS)
+
fuzz: run-fuzz_sudo_conf
check-fuzzer: $(FUZZ_PROGS)
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -415,7 +424,7 @@ check-fuzzer: $(FUZZ_PROGS)
# Note: some regress checks are run from srcdir for consistent error messages
check: $(TEST_PROGS) check-fuzzer
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -440,9 +449,9 @@ check: $(TEST_PROGS) check-fuzzer
if test -f globtest; then \
mkdir -p `$(SED) 's@/[^/]*$$@@' $(srcdir)/regress/glob/files | sort -u`; \
touch `cat $(srcdir)/regress/glob/files`; \
- chmod 0755 `grep '/r[^/]*$$' $(srcdir)/regress/glob/files`; \
- chmod 0444 `grep '/s[^/]*$$' $(srcdir)/regress/glob/files`; \
- chmod 0711 `grep '/t[^/]*$$' $(srcdir)/regress/glob/files`; \
+ chmod 0755 `$(GREP) '/r[^/]*$$' $(srcdir)/regress/glob/files`; \
+ chmod 0444 `$(GREP) '/s[^/]*$$' $(srcdir)/regress/glob/files`; \
+ chmod 0711 `$(GREP) '/t[^/]*$$' $(srcdir)/regress/glob/files`; \
./globtest $(srcdir)/regress/glob/globtest.in || rval=`expr $$rval + $$?`; \
rm -rf fake; \
fi; \
@@ -456,6 +465,8 @@ check: $(TEST_PROGS) check-fuzzer
./strsig_test || rval=`expr $$rval + $$?`; \
fi; \
./getgrouplist_test || rval=`expr $$rval + $$?`; \
+ ./multiarch_test || rval=`expr $$rval + $$?`; \
+ ./open_parent_dir_test || rval=`expr $$rval + $$?`; \
./strtobool_test || rval=`expr $$rval + $$?`; \
./strtoid_test || rval=`expr $$rval + $$?`; \
./strtomode_test || rval=`expr $$rval + $$?`; \
@@ -704,6 +715,14 @@ fchmodat.i: $(srcdir)/fchmodat.c $(incdir)/sudo_compat.h \
$(CC) -E -o $@ $(CPPFLAGS) $<
fchmodat.plog: fchmodat.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/fchmodat.c --i-file $< --output-file $@
+fchownat.lo: $(srcdir)/fchownat.c $(incdir)/sudo_compat.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/fchownat.c
+fchownat.i: $(srcdir)/fchownat.c $(incdir)/sudo_compat.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+fchownat.plog: fchownat.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/fchownat.c --i-file $< --output-file $@
fnm_test.lo: $(srcdir)/regress/fnmatch/fnm_test.c $(incdir)/compat/fnmatch.h \
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_util.h $(top_builddir)/config.h
@@ -1088,6 +1107,38 @@ mktemp_test.i: $(srcdir)/regress/mktemp/mktemp_test.c \
$(CC) -E -o $@ $(CPPFLAGS) $<
mktemp_test.plog: mktemp_test.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/mktemp/mktemp_test.c --i-file $< --output-file $@
+mmap_alloc.lo: $(srcdir)/mmap_alloc.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/mmap_alloc.c
+mmap_alloc.i: $(srcdir)/mmap_alloc.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+mmap_alloc.plog: mmap_alloc.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/mmap_alloc.c --i-file $< --output-file $@
+multiarch.lo: $(srcdir)/multiarch.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/multiarch.c
+multiarch.i: $(srcdir)/multiarch.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+multiarch.plog: multiarch.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/multiarch.c --i-file $< --output-file $@
+multiarch_test.lo: $(srcdir)/regress/multiarch/multiarch_test.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
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/multiarch/multiarch_test.c
+multiarch_test.i: $(srcdir)/regress/multiarch/multiarch_test.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) $<
+multiarch_test.plog: multiarch_test.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/multiarch/multiarch_test.c --i-file $< --output-file $@
nanosleep.lo: $(srcdir)/nanosleep.c $(incdir)/compat/stdbool.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
$(top_builddir)/config.h
@@ -1098,6 +1149,20 @@ nanosleep.i: $(srcdir)/nanosleep.c $(incdir)/compat/stdbool.h \
$(CC) -E -o $@ $(CPPFLAGS) $<
nanosleep.plog: nanosleep.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/nanosleep.c --i-file $< --output-file $@
+open_parent_dir_test.lo: \
+ $(srcdir)/regress/open_parent_dir/open_parent_dir_test.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
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/open_parent_dir/open_parent_dir_test.c
+open_parent_dir_test.i: \
+ $(srcdir)/regress/open_parent_dir/open_parent_dir_test.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) $<
+open_parent_dir_test.plog: open_parent_dir_test.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/open_parent_dir/open_parent_dir_test.c --i-file $< --output-file $@
openat.lo: $(srcdir)/openat.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/openat.c
openat.i: $(srcdir)/openat.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
@@ -1276,10 +1341,12 @@ signame.i: signame.c
$(CC) -E -o $@ $(CPPFLAGS) $<
signame.plog: signame.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file signame.c --i-file $< --output-file $@
-snprintf.lo: $(srcdir)/snprintf.c $(incdir)/sudo_compat.h \
+snprintf.lo: $(srcdir)/snprintf.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
$(top_builddir)/config.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/snprintf.c
-snprintf.i: $(srcdir)/snprintf.c $(incdir)/sudo_compat.h \
+snprintf.i: $(srcdir)/snprintf.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
$(top_builddir)/config.h
$(CC) -E -o $@ $(CPPFLAGS) $<
snprintf.plog: snprintf.i
@@ -1488,11 +1555,13 @@ sudo_debug.i: $(srcdir)/sudo_debug.c $(incdir)/compat/stdbool.h \
$(CC) -E -o $@ $(CPPFLAGS) $<
sudo_debug.plog: sudo_debug.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_debug.c --i-file $< --output-file $@
-sudo_dso.lo: $(srcdir)/sudo_dso.c $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \
- $(top_builddir)/config.h
+sudo_dso.lo: $(srcdir)/sudo_dso.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/sudo_dso.c
-sudo_dso.i: $(srcdir)/sudo_dso.c $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \
- $(top_builddir)/config.h
+sudo_dso.i: $(srcdir)/sudo_dso.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
$(CC) -E -o $@ $(CPPFLAGS) $<
sudo_dso.plog: sudo_dso.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_dso.c --i-file $< --output-file $@
diff --git a/lib/util/aix.c b/lib/util/aix.c
index 495637315..8a1c7505a 100644
--- a/lib/util/aix.c
+++ b/lib/util/aix.c
@@ -52,8 +52,8 @@
struct aix_limit {
int resource;
- char *soft;
- char *hard;
+ const char *soft;
+ const char *hard;
int factor;
};
@@ -68,11 +68,11 @@ static struct aix_limit aix_limits[] = {
};
static int
-aix_getlimit(char *user, char *lim, int *valp)
+aix_getlimit(const char *user, const char *lim, int *valp)
{
debug_decl(aix_getlimit, SUDO_DEBUG_UTIL);
- if (getuserattr(user, lim, valp, SEC_INT) != 0)
+ if (getuserattr((char *)user, (char *)lim, valp, SEC_INT) != 0)
debug_return_int(-1);
debug_return_int(0);
}
@@ -169,7 +169,7 @@ aix_getauthregistry_v1(char *user, char *saved_registry)
sudo_warn("%s", U_("unable to open userdb"));
goto done;
}
- ret = getuserattr(user, S_REGISTRY, &registry, SEC_CHAR);
+ ret = getuserattr(user, (char *)S_REGISTRY, &registry, SEC_CHAR);
if (ret == 0) {
/* sizeof(authdb_t) is guaranteed to be 16 */
if (strlcpy(saved_registry, registry, 16) >= 16) {
diff --git a/lib/util/arc4random.c b/lib/util/arc4random.c
index fa892fb60..4002645d1 100644
--- a/lib/util/arc4random.c
+++ b/lib/util/arc4random.c
@@ -143,14 +143,14 @@ _rs_rekey(unsigned char *dat, size_t datlen)
}
/* immediately reinit for backtracking resistance */
_rs_init(rs_buf, KEYSZ + IVSZ);
- memset(rs_buf, 0, KEYSZ + IVSZ); // -V512
+ memset(rs_buf, 0, KEYSZ + IVSZ); // -V::512, 1086
rs_have = sizeof(rs_buf) - KEYSZ - IVSZ;
}
static inline void
_rs_random_buf(void *_buf, size_t n)
{
- unsigned char *buf = (unsigned char *)_buf;
+ unsigned char *buf = _buf;
unsigned char *keystream;
size_t m;
diff --git a/lib/util/digest_gcrypt.c b/lib/util/digest_gcrypt.c
index 3ec715228..075e27227 100644
--- a/lib/util/digest_gcrypt.c
+++ b/lib/util/digest_gcrypt.c
@@ -23,6 +23,11 @@
#include <config.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
#include <stdlib.h>
#include <string.h>
#include <errno.h>
@@ -33,6 +38,8 @@
#include "sudo_debug.h"
#include "sudo_digest.h"
+#define SUDO_LIBGCRYPT_VERSION_MIN "1.3.0"
+
struct sudo_digest {
int gcry_digest_type;
unsigned int digest_len;
@@ -61,9 +68,21 @@ struct sudo_digest *
sudo_digest_alloc_v1(int digest_type)
{
debug_decl(sudo_digest_alloc, SUDO_DEBUG_UTIL);
+ static bool initialized = false;
struct sudo_digest *dig;
int gcry_digest_type;
+ if (!initialized) {
+ if (!gcry_check_version(SUDO_LIBGCRYPT_VERSION_MIN)) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "libgcrypt too old (need %s, have %s)",
+ SUDO_LIBGCRYPT_VERSION_MIN, gcry_check_version(NULL));
+ debug_return_ptr(NULL);
+ }
+ gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
+ initialized = true;
+ }
+
gcry_digest_type = sudo_digest_type_to_gcry(digest_type);
if (gcry_digest_type == -1) {
errno = EINVAL;
diff --git a/lib/util/fatal.c b/lib/util/fatal.c
index 455168c5c..cf2303ffc 100644
--- a/lib/util/fatal.c
+++ b/lib/util/fatal.c
@@ -239,7 +239,7 @@ warning(const char *errstr, const char *fmt, va_list ap)
fputs(": ", stderr);
fputs(errstr, stderr);
}
- if (isatty(fileno(stderr)))
+ if (sudo_term_is_raw(fileno(stderr)))
putc('\r', stderr);
putc('\n', stderr);
}
diff --git a/lib/util/fchownat.c b/lib/util/fchownat.c
new file mode 100644
index 000000000..545a21e66
--- /dev/null
+++ b/lib/util/fchownat.c
@@ -0,0 +1,67 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * 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 <config.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+
+#ifndef HAVE_FCHOWNAT
+int
+sudo_fchownat(int dfd, const char *path, uid_t uid, gid_t gid, int flags)
+{
+ int odfd, ret;
+
+ if (dfd == AT_FDCWD) {
+ if (flags & AT_SYMLINK_NOFOLLOW)
+ return lchown(path, uid, gid);
+ else
+ return chown(path, uid, gid);
+ }
+
+ /* Save cwd */
+ if ((odfd = open(".", O_RDONLY)) == -1)
+ return -1;
+
+ if (fchdir(dfd) == -1) {
+ close(odfd);
+ return -1;
+ }
+
+ if (flags & AT_SYMLINK_NOFOLLOW)
+ ret = lchown(path, uid, gid);
+ else
+ ret = chown(path, uid, gid);
+
+ /* Restore cwd */
+ if (fchdir(odfd) == -1) {
+ /* Should not happen */
+ ret = -1;
+ }
+ close(odfd);
+
+ return ret;
+}
+#endif /* HAVE_FCHOWNAT */
diff --git a/lib/util/getentropy.c b/lib/util/getentropy.c
index 056c12217..dc5c91c02 100644
--- a/lib/util/getentropy.c
+++ b/lib/util/getentropy.c
@@ -20,6 +20,11 @@
* http://man.openbsd.org/getentropy.2
*/
+/*
+ * 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 <config.h>
#ifndef HAVE_GETENTROPY
diff --git a/lib/util/getgrouplist.c b/lib/util/getgrouplist.c
index 125d49460..b6170c6ce 100644
--- a/lib/util/getgrouplist.c
+++ b/lib/util/getgrouplist.c
@@ -238,7 +238,7 @@ str2grp(const char *instr, int inlen, void *ent, char *buf, int buflen)
/* Check for YP inclusion/exclusion entries. */
if (*cp == '+' || *cp == '-') {
/* Only the name is required for YP inclusion/exclusion entries. */
- grp->gr_passwd = "";
+ grp->gr_passwd = (char *)"";
grp->gr_gid = 0;
grp->gr_mem = NULL;
yp = 1;
diff --git a/lib/util/getopt_long.c b/lib/util/getopt_long.c
index 3a48f0ebb..15b04eef9 100644
--- a/lib/util/getopt_long.c
+++ b/lib/util/getopt_long.c
@@ -96,7 +96,7 @@ int optreset; /* reset getopt */
#define BADARG ((*options == ':') ? (int)':' : (int)'?')
#define INORDER (int)1
-#define EMSG ""
+#define EMSG (char *)""
#ifdef GNU_COMPATIBLE
#define NO_PREFIX (-1)
@@ -202,7 +202,7 @@ parse_long_options(char * const *nargv, const char *options,
{
char *current_argv, *has_equal;
#ifdef GNU_COMPATIBLE
- char *current_dash;
+ const char *current_dash;
#endif
size_t current_argv_len;
int i, match, exact_match, second_partial_match;
diff --git a/lib/util/json.c b/lib/util/json.c
index 6fac63f4e..266129dca 100644
--- a/lib/util/json.c
+++ b/lib/util/json.c
@@ -44,13 +44,13 @@
* Returns true on success, false if out of memory.
*/
static bool
-json_expand_buf(struct json_container *json)
+json_expand_buf(struct json_container *jsonc)
{
char *newbuf;
debug_decl(json_expand_buf, SUDO_DEBUG_UTIL);
- if ((newbuf = reallocarray(json->buf, 2, json->bufsize)) == NULL) {
- if (json->memfatal) {
+ if ((newbuf = reallocarray(jsonc->buf, 2, jsonc->bufsize)) == NULL) {
+ if (jsonc->memfatal) {
sudo_fatalx(U_("%s: %s"),
__func__, U_("unable to allocate memory"));
}
@@ -58,8 +58,8 @@ json_expand_buf(struct json_container *json)
"%s: %s", __func__, "unable to allocate memory");
debug_return_bool(false);
}
- json->buf = newbuf;
- json->bufsize *= 2;
+ jsonc->buf = newbuf;
+ jsonc->bufsize *= 2;
debug_return_bool(true);
}
@@ -69,24 +69,24 @@ json_expand_buf(struct json_container *json)
* Append "indent" number of blank characters.
*/
static bool
-json_new_line(struct json_container *json)
+json_new_line(struct json_container *jsonc)
{
- int indent = json->indent_level;
+ int indent = jsonc->indent_level;
debug_decl(json_new_line, SUDO_DEBUG_UTIL);
/* No non-essential white space in minimal mode. */
- if (json->minimal)
+ if (jsonc->minimal)
debug_return_bool(true);
- while (json->buflen + 1 + indent >= json->bufsize) {
- if (!json_expand_buf(json))
+ while (jsonc->buflen + 1 + indent >= jsonc->bufsize) {
+ if (!json_expand_buf(jsonc))
debug_return_bool(false);
}
- json->buf[json->buflen++] = '\n';
+ jsonc->buf[jsonc->buflen++] = '\n';
while (indent--) {
- json->buf[json->buflen++] = ' ';
+ jsonc->buf[jsonc->buflen++] = ' ';
}
- json->buf[json->buflen] = '\0';
+ jsonc->buf[jsonc->buflen] = '\0';
debug_return_bool(true);
}
@@ -96,20 +96,20 @@ json_new_line(struct json_container *json)
* Does not perform any quoting.
*/
static bool
-json_append_buf(struct json_container *json, const char *str)
+json_append_buf(struct json_container *jsonc, const char *str)
{
size_t len;
debug_decl(json_append_buf, SUDO_DEBUG_UTIL);
len = strlen(str);
- while (json->buflen + len >= json->bufsize) {
- if (!json_expand_buf(json))
+ while (jsonc->buflen + len >= jsonc->bufsize) {
+ if (!json_expand_buf(jsonc))
debug_return_bool(false);
}
- memcpy(json->buf + json->buflen, str, len);
- json->buflen += len;
- json->buf[json->buflen] = '\0';
+ memcpy(jsonc->buf + jsonc->buflen, str, len);
+ jsonc->buflen += len;
+ jsonc->buf[jsonc->buflen] = '\0';
debug_return_bool(true);
}
@@ -119,12 +119,12 @@ json_append_buf(struct json_container *json, const char *str)
* Does not support unicode escapes.
*/
static bool
-json_append_string(struct json_container *json, const char *str)
+json_append_string(struct json_container *jsonc, const char *str)
{
char ch;
debug_decl(json_append_string, SUDO_DEBUG_UTIL);
- if (!json_append_buf(json, "\""))
+ if (!json_append_buf(jsonc, "\""))
debug_return_bool(false);
while ((ch = *str++) != '\0') {
char buf[3], *cp = buf;
@@ -157,29 +157,29 @@ json_append_string(struct json_container *json, const char *str)
}
*cp++ = ch;
*cp++ = '\0';
- if (!json_append_buf(json, buf))
+ if (!json_append_buf(jsonc, buf))
debug_return_bool(false);
}
- if (!json_append_buf(json, "\""))
+ if (!json_append_buf(jsonc, "\""))
debug_return_bool(false);
debug_return_bool(true);
}
bool
-sudo_json_init_v1(struct json_container *json, int indent, bool minimal,
+sudo_json_init_v1(struct json_container *jsonc, int indent, bool minimal,
bool memfatal)
{
debug_decl(sudo_json_init, SUDO_DEBUG_UTIL);
- memset(json, 0, sizeof(*json));
- json->indent_level = indent;
- json->indent_increment = indent;
- json->minimal = minimal;
- json->memfatal = memfatal;
- json->buf = malloc(64 * 1024);
- if (json->buf == NULL) {
- if (json->memfatal) {
+ memset(jsonc, 0, sizeof(*jsonc));
+ jsonc->indent_level = indent;
+ jsonc->indent_increment = indent;
+ jsonc->minimal = minimal;
+ jsonc->memfatal = memfatal;
+ jsonc->buf = malloc(64 * 1024);
+ if (jsonc->buf == NULL) {
+ if (jsonc->memfatal) {
sudo_fatalx(U_("%s: %s"),
__func__, U_("unable to allocate memory"));
}
@@ -187,162 +187,162 @@ sudo_json_init_v1(struct json_container *json, int indent, bool minimal,
"%s: %s", __func__, "unable to allocate memory");
debug_return_bool(false);
}
- *json->buf = '\0';
- json->bufsize = 64 * 1024;
+ *jsonc->buf = '\0';
+ jsonc->bufsize = 64 * 1024;
debug_return_bool(true);
}
void
-sudo_json_free_v1(struct json_container *json)
+sudo_json_free_v1(struct json_container *jsonc)
{
debug_decl(sudo_json_free, SUDO_DEBUG_UTIL);
- free(json->buf);
- memset(json, 0, sizeof(*json));
+ free(jsonc->buf);
+ memset(jsonc, 0, sizeof(*jsonc));
debug_return;
}
bool
-sudo_json_open_object_v1(struct json_container *json, const char *name)
+sudo_json_open_object_v1(struct json_container *jsonc, const char *name)
{
debug_decl(sudo_json_open_object, SUDO_DEBUG_UTIL);
/* Add comma if we are continuing an object/array. */
- if (json->need_comma) {
- if (!json_append_buf(json, ","))
+ if (jsonc->need_comma) {
+ if (!json_append_buf(jsonc, ","))
debug_return_bool(false);
}
- if (!json_new_line(json))
+ if (!json_new_line(jsonc))
debug_return_bool(false);
if (name != NULL) {
- json_append_string(json, name);
- if (!json_append_buf(json, json->minimal ? ":{" : ": {"))
+ json_append_string(jsonc, name);
+ if (!json_append_buf(jsonc, jsonc->minimal ? ":{" : ": {"))
debug_return_bool(false);
} else {
- if (!json_append_buf(json, "{"))
+ if (!json_append_buf(jsonc, "{"))
debug_return_bool(false);
}
- json->indent_level += json->indent_increment;
- json->need_comma = false;
+ jsonc->indent_level += jsonc->indent_increment;
+ jsonc->need_comma = false;
debug_return_bool(true);
}
bool
-sudo_json_close_object_v1(struct json_container *json)
+sudo_json_close_object_v1(struct json_container *jsonc)
{
debug_decl(sudo_json_close_object, SUDO_DEBUG_UTIL);
- if (!json->minimal) {
- json->indent_level -= json->indent_increment;
- if (!json_new_line(json))
+ if (!jsonc->minimal) {
+ jsonc->indent_level -= jsonc->indent_increment;
+ if (!json_new_line(jsonc))
debug_return_bool(false);
}
- if (!json_append_buf(json, "}"))
+ if (!json_append_buf(jsonc, "}"))
debug_return_bool(false);
debug_return_bool(true);
}
bool
-sudo_json_open_array_v1(struct json_container *json, const char *name)
+sudo_json_open_array_v1(struct json_container *jsonc, const char *name)
{
debug_decl(sudo_json_open_array, SUDO_DEBUG_UTIL);
/* Add comma if we are continuing an object/array. */
- if (json->need_comma) {
- if (!json_append_buf(json, ","))
+ if (jsonc->need_comma) {
+ if (!json_append_buf(jsonc, ","))
debug_return_bool(false);
}
- if (!json_new_line(json))
+ if (!json_new_line(jsonc))
debug_return_bool(false);
if (name != NULL) {
- json_append_string(json, name);
- if (!json_append_buf(json, json->minimal ? ":[" : ": ["))
+ json_append_string(jsonc, name);
+ if (!json_append_buf(jsonc, jsonc->minimal ? ":[" : ": ["))
debug_return_bool(false);
} else {
- if (!json_append_buf(json, "["))
+ if (!json_append_buf(jsonc, "["))
debug_return_bool(false);
}
- json->indent_level += json->indent_increment;
- json->need_comma = false;
+ jsonc->indent_level += jsonc->indent_increment;
+ jsonc->need_comma = false;
debug_return_bool(true);
}
bool
-sudo_json_close_array_v1(struct json_container *json)
+sudo_json_close_array_v1(struct json_container *jsonc)
{
debug_decl(sudo_json_close_array, SUDO_DEBUG_UTIL);
- if (!json->minimal) {
- json->indent_level -= json->indent_increment;
- if (!json_new_line(json))
+ if (!jsonc->minimal) {
+ jsonc->indent_level -= jsonc->indent_increment;
+ if (!json_new_line(jsonc))
debug_return_bool(false);
}
- if (!json_append_buf(json, "]"))
+ if (!json_append_buf(jsonc, "]"))
debug_return_bool(false);
debug_return_bool(true);
}
static bool
-sudo_json_add_value_int(struct json_container *json, const char *name,
+sudo_json_add_value_int(struct json_container *jsonc, const char *name,
struct json_value *value, bool as_object)
{
char numbuf[(((sizeof(long long) * 8) + 2) / 3) + 2];
debug_decl(sudo_json_add_value, SUDO_DEBUG_UTIL);
/* Add comma if we are continuing an object/array. */
- if (json->need_comma) {
- if (!json_append_buf(json, ","))
+ if (jsonc->need_comma) {
+ if (!json_append_buf(jsonc, ","))
debug_return_bool(false);
}
- if (!json_new_line(json))
+ if (!json_new_line(jsonc))
debug_return_bool(false);
- json->need_comma = true;
+ jsonc->need_comma = true;
if (as_object) {
- if (!json_append_buf(json, json->minimal ? "{" : "{ "))
+ if (!json_append_buf(jsonc, jsonc->minimal ? "{" : "{ "))
debug_return_bool(false);
}
/* name */
if (name != NULL) {
- if (!json_append_string(json, name))
+ if (!json_append_string(jsonc, name))
debug_return_bool(false);
- if (!json_append_buf(json, json->minimal ? ":" : ": "))
+ if (!json_append_buf(jsonc, jsonc->minimal ? ":" : ": "))
debug_return_bool(false);
}
/* value */
switch (value->type) {
case JSON_STRING:
- if (!json_append_string(json, value->u.string))
+ if (!json_append_string(jsonc, value->u.string))
debug_return_bool(false);
break;
case JSON_ID:
snprintf(numbuf, sizeof(numbuf), "%u", (unsigned int)value->u.id);
- if (!json_append_buf(json, numbuf))
+ if (!json_append_buf(jsonc, numbuf))
debug_return_bool(false);
break;
case JSON_NUMBER:
snprintf(numbuf, sizeof(numbuf), "%lld", value->u.number);
- if (!json_append_buf(json, numbuf))
+ if (!json_append_buf(jsonc, numbuf))
debug_return_bool(false);
break;
case JSON_NULL:
- if (!json_append_buf(json, "null"))
+ if (!json_append_buf(jsonc, "null"))
debug_return_bool(false);
break;
case JSON_BOOL:
- if (!json_append_buf(json, value->u.boolean ? "true" : "false"))
+ if (!json_append_buf(jsonc, value->u.boolean ? "true" : "false"))
debug_return_bool(false);
break;
case JSON_ARRAY:
@@ -354,7 +354,7 @@ sudo_json_add_value_int(struct json_container *json, const char *name,
}
if (as_object) {
- if (!json_append_buf(json, json->minimal ? "}" : " }"))
+ if (!json_append_buf(jsonc, jsonc->minimal ? "}" : " }"))
debug_return_bool(false);
}
@@ -362,27 +362,27 @@ sudo_json_add_value_int(struct json_container *json, const char *name,
}
bool
-sudo_json_add_value_v1(struct json_container *json, const char *name,
+sudo_json_add_value_v1(struct json_container *jsonc, const char *name,
struct json_value *value)
{
- return sudo_json_add_value_int(json, name, value, false);
+ return sudo_json_add_value_int(jsonc, name, value, false);
}
bool
-sudo_json_add_value_as_object_v1(struct json_container *json, const char *name,
+sudo_json_add_value_as_object_v1(struct json_container *jsonc, const char *name,
struct json_value *value)
{
- return sudo_json_add_value_int(json, name, value, true);
+ return sudo_json_add_value_int(jsonc, name, value, true);
}
char *
-sudo_json_get_buf_v1(struct json_container *json)
+sudo_json_get_buf_v1(struct json_container *jsonc)
{
- return json->buf;
+ return jsonc->buf;
}
unsigned int
-sudo_json_get_len_v1(struct json_container *json)
+sudo_json_get_len_v1(struct json_container *jsonc)
{
- return json->buflen;
+ return jsonc->buflen;
}
diff --git a/lib/util/lbuf.c b/lib/util/lbuf.c
index f17ae0ca5..735598cc3 100644
--- a/lib/util/lbuf.c
+++ b/lib/util/lbuf.c
@@ -96,7 +96,7 @@ sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *
{
int len, saved_len = lbuf->len;
bool ret = false;
- char *cp, *s;
+ const char *cp, *s;
va_list ap;
debug_decl(sudo_lbuf_append_quoted, SUDO_DEBUG_UTIL);
@@ -155,7 +155,7 @@ 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;
+ const char *s;
debug_decl(sudo_lbuf_append, SUDO_DEBUG_UTIL);
if (sudo_lbuf_error(lbuf))
diff --git a/lib/util/logfac.c b/lib/util/logfac.c
index 97a80d965..5a97ac3b1 100644
--- a/lib/util/logfac.c
+++ b/lib/util/logfac.c
@@ -39,7 +39,7 @@
* For converting between syslog numbers and strings.
*/
struct strmap {
- char *name;
+ const char *name;
int num;
};
diff --git a/lib/util/logpri.c b/lib/util/logpri.c
index 34d060295..a6503bd76 100644
--- a/lib/util/logpri.c
+++ b/lib/util/logpri.c
@@ -39,7 +39,7 @@
* For converting between syslog numbers and strings.
*/
struct strmap {
- char *name;
+ const char *name;
int num;
};
diff --git a/lib/util/mkdir_parents.c b/lib/util/mkdir_parents.c
index 0b93aa5f1..ba46b3968 100644
--- a/lib/util/mkdir_parents.c
+++ b/lib/util/mkdir_parents.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -76,16 +76,17 @@ is_dir(int dfd, const char *name, int namelen, bool quiet)
}
/*
- * Create any parent directories needed by path (but not path itself).
+ * Create any parent directories needed by path (but not path itself)
+ * and return an open fd for the parent directory or -1 on error.
*/
-bool
-sudo_mkdir_parents_v1(const char *path, uid_t uid, gid_t gid, mode_t mode, bool quiet)
+int
+sudo_open_parent_dir_v1(const char *path, uid_t uid, gid_t gid, mode_t mode,
+ bool quiet)
{
const char *cp, *ep, *pathend;
char name[PATH_MAX];
- bool ret = false;
int parentfd;
- debug_decl(sudo_mkdir_parents, SUDO_DEBUG_UTIL);
+ debug_decl(sudo_open_parent_dir, SUDO_DEBUG_UTIL);
/* Starting parent dir is either root or cwd. */
cp = path;
@@ -100,25 +101,27 @@ sudo_mkdir_parents_v1(const char *path, uid_t uid, gid_t gid, mode_t mode, bool
if (parentfd == -1) {
if (!quiet)
sudo_warn(U_("unable to open %s"), *path == '/' ? "/" : ".");
- debug_return_bool(false);
+ debug_return_int(-1);
}
/* Iterate over path components, skipping the last one. */
pathend = cp + strlen(cp);
- for (cp = sudo_strsplit(cp, pathend, "/", &ep); cp != NULL && ep != NULL;
+ for (cp = sudo_strsplit(cp, pathend, "/", &ep); cp != NULL && *ep != '\0';
cp = sudo_strsplit(NULL, pathend, "/", &ep)) {
- int dfd, len;
+ size_t len = (size_t)(ep - cp);
+ int dfd;
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
- "mkdir %.*s, mode 0%o, uid %d, gid %d", (int)(ep - path),
- path, (unsigned int)mode, (int)uid, (int)gid);
- len = snprintf(name, sizeof(name), "%.*s", (int)(ep - cp), cp);
- if (len >= ssizeof(name)) {
+ "mkdir %.*s, mode 0%o, uid %d, gid %d", (int)(ep - path), path,
+ (unsigned int)mode, (int)uid, (int)gid);
+ if (len >= sizeof(name)) {
errno = ENAMETOOLONG;
if (!quiet)
- sudo_warn(U_("unable to open %.*s"), (int)(ep - path), path);
- goto done;
+ sudo_warn(U_("unable to mkdir %.*s"), (int)(ep - path), path);
+ goto bad;
}
+ memcpy(name, cp, len);
+ name[len] = '\0';
reopen:
dfd = openat(parentfd, name, O_RDONLY|O_NONBLOCK, 0);
if (dfd == -1) {
@@ -127,7 +130,7 @@ reopen:
sudo_warn(U_("unable to open %.*s"),
(int)(ep - path), path);
}
- goto done;
+ goto bad;
}
if (mkdirat(parentfd, name, mode) == 0) {
dfd = openat(parentfd, name, O_RDONLY|O_NONBLOCK|O_NOFOLLOW, 0);
@@ -136,12 +139,12 @@ reopen:
sudo_warn(U_("unable to open %.*s"),
(int)(ep - path), path);
}
- goto done;
+ goto bad;
}
/* Make sure the path we created is still a directory. */
if (!is_dir(dfd, path, ep - path, quiet)) {
close(dfd);
- goto done;
+ goto bad;
}
if (uid != (uid_t)-1 && gid != (gid_t)-1) {
if (fchown(dfd, uid, gid) != 0) {
@@ -157,22 +160,40 @@ reopen:
sudo_warn(U_("unable to mkdir %.*s"),
(int)(ep - path), path);
}
- goto done;
+ goto bad;
}
} else {
/* Already exists, make sure it is a directory. */
if (!is_dir(dfd, path, ep - path, quiet)) {
close(dfd);
- goto done;
+ goto bad;
}
}
close(parentfd);
parentfd = dfd;
}
- ret = true;
-done:
+ debug_return_int(parentfd);
+bad:
if (parentfd != -1)
close(parentfd);
- debug_return_bool(ret);
+ debug_return_int(-1);
+}
+
+/*
+ * Create any parent directories needed by path (but not path itself).
+ * Not currently used.
+ */
+bool
+sudo_mkdir_parents_v1(const char *path, uid_t uid, gid_t gid, mode_t mode,
+ bool quiet)
+{
+ int fd;
+ debug_decl(sudo_mkdir_parents, SUDO_DEBUG_UTIL);
+
+ fd = sudo_open_parent_dir(path, uid, gid, mode, quiet);
+ if (fd == -1)
+ debug_return_bool(false);
+ close(fd);
+ debug_return_bool(true);
}
diff --git a/lib/util/mktemp.c b/lib/util/mktemp.c
index c4ac2b3e0..1540e511e 100644
--- a/lib/util/mktemp.c
+++ b/lib/util/mktemp.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2001, 2003, 2004, 2008-2011, 2013, 2015, 2017, 2018
+ * Copyright (c) 2001, 2003, 2004, 2008-2011, 2013, 2015, 2017, 2018, 2022
* Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -24,7 +24,8 @@
#include <config.h>
-#if !defined(HAVE_MKSTEMPS) || !defined(HAVE_MKDTEMP)
+#if (!defined(HAVE_MKDTEMPAT) && !defined(HAVE_MKDTEMPAT_NP)) || \
+ (!defined(HAVE_MKOSTEMPSAT) && !defined(HAVE_MKOSTEMPSAT_NP))
#include <sys/stat.h>
@@ -32,9 +33,7 @@
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif /* HAVE_STDLIB_H */
+#include <stdlib.h>
#if defined(HAVE_STDINT_H)
# include <stdint.h>
#elif defined(HAVE_INTTYPES_H)
@@ -55,12 +54,14 @@
#define NUM_CHARS (sizeof(TEMPCHARS) - 1)
#define MIN_X 6
+#define MKOTEMP_FLAGS (O_APPEND | O_CLOEXEC | O_SYNC)
+
static int
-mktemp_internal(char *path, int slen, int mode)
+mktemp_internal(int dfd, char *path, int slen, int mode, int flags)
{
char *start, *cp, *ep;
const char tempchars[] = TEMPCHARS;
- unsigned int r, tries;
+ unsigned int tries;
size_t len;
int fd;
@@ -71,31 +72,43 @@ mktemp_internal(char *path, int slen, int mode)
}
ep = path + len - slen;
- tries = 1;
- for (start = ep; start > path && start[-1] == 'X'; start--) {
- if (tries < INT_MAX / NUM_CHARS)
- tries *= NUM_CHARS;
- }
- tries *= 2;
+ for (start = ep; start > path && start[-1] == 'X'; start--)
+ ;
if (ep - start < MIN_X) {
errno = EINVAL;
return -1;
}
+ if (flags & ~MKOTEMP_FLAGS) {
+ errno = EINVAL;
+ return -1;
+ }
+ flags |= O_CREAT | O_EXCL | O_RDWR;
+
+ tries = INT_MAX;
do {
- for (cp = start; cp != ep; cp++) {
- r = arc4random_uniform(NUM_CHARS);
- *cp = tempchars[r];
- }
+ cp = start;
+ do {
+ unsigned short rbuf[16];
+ unsigned int i;
+
+ /*
+ * Avoid lots of arc4random() calls by using
+ * a buffer sized for up to 16 Xs at a time.
+ */
+ arc4random_buf(rbuf, sizeof(rbuf));
+ for (i = 0; i < nitems(rbuf) && cp != ep; i++)
+ *cp++ = tempchars[rbuf[i] % NUM_CHARS];
+ } while (cp != ep);
switch (mode) {
case MKTEMP_FILE:
- fd = open(path, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
+ fd = openat(dfd, path, flags, S_IRUSR|S_IWUSR);
if (fd != -1 || errno != EEXIST)
return fd;
break;
case MKTEMP_DIR:
- if (mkdir(path, S_IRWXU) == 0)
+ if (mkdirat(dfd, path, S_IRWXU) == 0)
return 0;
if (errno != EEXIST)
return -1;
@@ -107,17 +120,53 @@ mktemp_internal(char *path, int slen, int mode)
return -1;
}
-int
-sudo_mkstemps(char *path, int slen)
+char *
+sudo_mkdtemp(char *path)
{
- return mktemp_internal(path, slen, MKTEMP_FILE);
+ if (mktemp_internal(AT_FDCWD, path, 0, MKTEMP_DIR, 0) == -1)
+ return NULL;
+ return path;
}
char *
-sudo_mkdtemp(char *path)
+sudo_mkdtempat(int dfd, char *path)
{
- if (mktemp_internal(path, 0, MKTEMP_DIR) == -1)
+ if (mktemp_internal(dfd, path, 0, MKTEMP_DIR, 0) == -1)
return NULL;
return path;
}
-#endif /* !HAVE_MKSTEMPS || !HAVE_MKDTEMP */
+
+int
+sudo_mkostempsat(int dfd, char *path, int slen, int flags)
+{
+ return mktemp_internal(dfd, path, slen, MKTEMP_FILE, flags);
+}
+
+#ifdef notyet
+int
+sudo_mkostemps(char *path, int slen, int flags)
+{
+ return mktemp_internal(AT_FDCWD, path, slen, MKTEMP_FILE, flags);
+}
+#endif
+
+int
+sudo_mkstemp(char *path)
+{
+ return mktemp_internal(AT_FDCWD, path, 0, MKTEMP_FILE, 0);
+}
+
+#ifdef notyet
+int
+sudo_mkostemp(char *path, int flags)
+{
+ return mktemp_internal(AT_FDCWD, path, 0, MKTEMP_FILE, flags);
+}
+#endif
+
+int
+sudo_mkstemps(char *path, int slen)
+{
+ return mktemp_internal(AT_FDCWD, path, slen, MKTEMP_FILE, 0);
+}
+#endif /* !HAVE_MKDTEMPAT || !HAVE_MKOSTEMPSAT */
diff --git a/lib/util/mmap_alloc.c b/lib/util/mmap_alloc.c
new file mode 100644
index 000000000..df3d4cbcc
--- /dev/null
+++ b/lib/util/mmap_alloc.c
@@ -0,0 +1,158 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
+ * Copyright (c) 2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * 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 <config.h>
+
+#include <sys/types.h>
+#include <sys/mman.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+
+#include "sudo_compat.h"
+#include "sudo_util.h"
+
+#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
+# define MAP_ANON MAP_ANONYMOUS
+#endif
+
+#ifndef MAP_FAILED
+# define MAP_FAILED ((void *)-1)
+#endif
+
+/*
+ * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
+ * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
+ */
+#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
+
+/*
+ * Allocate "size" bytes via mmap().
+ * Space is allocated to store the size for later unmapping.
+ */
+void *
+sudo_mmap_alloc_v1(size_t size)
+{
+ void *ptr;
+ unsigned long *ulp;
+#ifndef MAP_ANON
+ int fd;
+
+ /* SunOS-style mmap allocation using /dev/zero. */
+ if ((fd = open("/dev/zero", O_RDWR)) == -1)
+ return NULL;
+ size += sizeof(unsigned long);
+ ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+ close(fd);
+#else
+ size += sizeof(unsigned long);
+ ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+#endif
+ if (ptr == MAP_FAILED) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ /* Store size before the actual data. */
+ ulp = (unsigned long *)ptr;
+ ulp[0] = size;
+ return (void *)&ulp[1];
+}
+
+/*
+ * Allocate "nmemb" elements of "size" bytes via mmap().
+ * If overflow would occur, errno is set to ENOMEM and
+ * NULL is returned.
+ */
+void *
+sudo_mmap_allocarray_v1(size_t nmemb, size_t size)
+{
+ if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
+ nmemb > 0 && SIZE_MAX / nmemb < size) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ return sudo_mmap_alloc_v1(nmemb * size);
+}
+
+/*
+ * Make a copy of "str" via mmap() and return it.
+ */
+char *
+sudo_mmap_strdup_v1(const char *str)
+{
+ size_t len = strlen(str);
+ char *newstr;
+
+ if (len == SIZE_MAX) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ newstr = sudo_mmap_alloc_v1(len + 1);
+ memcpy(newstr, str, len);
+ newstr[len] = '\0';
+
+ return newstr;
+}
+
+/*
+ * Set the page permissions for the allocation represented by "ptr" to
+ * read-only. Returns 0 on success, -1 on failure.
+ */
+int
+sudo_mmap_protect_v1(void *ptr)
+{
+ if (ptr != NULL) {
+ unsigned long *ulp = ptr;
+ const unsigned long size = ulp[-1];
+ return mprotect((void *)&ulp[-1], size, PROT_READ);
+ }
+
+ /* Can't protect NULL. */
+ errno = EINVAL;
+ return -1;
+}
+
+/*
+ * Free "ptr" allocated by sudo_mmap_alloc().
+ * The allocated size is stored (as unsigned long) in ptr[-1].
+ */
+void
+sudo_mmap_free_v1(void *ptr)
+{
+ if (ptr != NULL) {
+ unsigned long *ulp = (unsigned long *)ptr - 1;
+ const unsigned long size = ulp[0];
+ int saved_errno = errno;
+
+ (void)munmap((void *)ulp, size);
+ errno = saved_errno;
+ }
+}
diff --git a/lib/util/multiarch.c b/lib/util/multiarch.c
new file mode 100644
index 000000000..dfdc296ba
--- /dev/null
+++ b/lib/util/multiarch.c
@@ -0,0 +1,103 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * 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 <config.h>
+
+#ifdef __linux__
+# include <sys/utsname.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "sudo_compat.h"
+#include "sudo_util.h"
+
+# if defined(__linux__)
+/*
+ * On Linux systems that use multi-arch, the actual DSO may be in a
+ * machine-specific subdirectory. If the specified path contains
+ * /lib/ or /libexec/, insert a multi-arch directory after it.
+ * If sb is non-NULL, stat(2) will be called on the new path, filling in sb.
+ * Returns a dynamically allocated string on success and NULL on failure.
+ */
+char *
+sudo_stat_multiarch_v1(const char *path, struct stat *sb)
+{
+# if defined(__ILP32__)
+ const char *libdirs[] = { "/libx32/", "/lib/", "/libexec/", NULL };
+# elif defined(__LP64__)
+ const char *libdirs[] = { "/lib64/", "/lib/", "/libexec/", NULL };
+# else
+ const char *libdirs[] = { "/lib32/", "/lib/", "/libexec/", NULL };
+# endif
+ const char **lp, *lib, *slash;
+ struct utsname unamebuf;
+ char *newpath = NULL;
+ int len;
+
+ if (uname(&unamebuf) == -1)
+ return NULL;
+
+ for (lp = libdirs; *lp != NULL; lp++) {
+ /* Replace lib64, lib32, libx32 with lib in new path. */
+ const char *newlib = lp == libdirs ? "/lib/" : *lp;
+
+ /* Search for lib dir in path, find the trailing slash. */
+ lib = strstr(path, *lp);
+ if (lib == NULL)
+ continue;
+ slash = lib + strlen(*lp) - 1;
+
+ /* Make sure there isn't already a machine-linux-gnu dir. */
+ len = strcspn(slash + 1, "/-");
+ if (strncmp(slash + 1 + len, "-linux-gnu/", 11) == 0) {
+ /* Multiarch already present. */
+ break;
+ }
+
+ /* Add machine-linux-gnu dir after /lib/ or /libexec/. */
+ len = asprintf(&newpath, "%.*s%s%s-linux-gnu%s",
+ (int)(lib - path), path, newlib, unamebuf.machine, slash);
+ if (len == -1) {
+ newpath = NULL;
+ break;
+ }
+
+ /* If sb was set, use stat(2) to make sure newpath exists. */
+ if (sb == NULL || stat(newpath, sb) == 0)
+ break;
+ free(newpath);
+ newpath = NULL;
+ }
+
+ return newpath;
+}
+#else
+char *
+sudo_stat_multiarch_v1(const char *path, struct stat *sb)
+{
+ return NULL;
+}
+#endif /* __linux__ */
diff --git a/lib/util/regress/closefrom/closefrom_test.c b/lib/util/regress/closefrom/closefrom_test.c
index 5b1bc34d7..375bb5102 100644
--- a/lib/util/regress/closefrom/closefrom_test.c
+++ b/lib/util/regress/closefrom/closefrom_test.c
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#define SUDO_ERROR_WRAP 0
diff --git a/lib/util/regress/fnmatch/fnm_test.c b/lib/util/regress/fnmatch/fnm_test.c
index a9f6b1afb..126683b8d 100644
--- a/lib/util/regress/fnmatch/fnm_test.c
+++ b/lib/util/regress/fnmatch/fnm_test.c
@@ -9,6 +9,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#ifdef HAVE_FNMATCH
# include <fnmatch.h>
#else
diff --git a/lib/util/regress/fuzz/fuzz_sudo_conf.c b/lib/util/regress/fuzz/fuzz_sudo_conf.c
index 127f7459d..bfa62f8e2 100644
--- a/lib/util/regress/fuzz/fuzz_sudo_conf.c
+++ b/lib/util/regress/fuzz/fuzz_sudo_conf.c
@@ -33,6 +33,8 @@
#include "sudo_plugin.h"
#include "sudo_util.h"
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
static int
fuzz_conversation(int num_msgs, const struct sudo_conv_message msgs[],
struct sudo_conv_reply replies[], struct sudo_conv_callback *callback)
diff --git a/lib/util/regress/getgrouplist/getgrouplist_test.c b/lib/util/regress/getgrouplist/getgrouplist_test.c
index c5903bc1a..8429528b7 100644
--- a/lib/util/regress/getgrouplist/getgrouplist_test.c
+++ b/lib/util/regress/getgrouplist/getgrouplist_test.c
@@ -28,6 +28,7 @@
#endif
#include <pwd.h>
#include <grp.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_fatal.h"
diff --git a/lib/util/regress/glob/globtest.c b/lib/util/regress/glob/globtest.c
index ec8cef579..866535a1b 100644
--- a/lib/util/regress/glob/globtest.c
+++ b/lib/util/regress/glob/globtest.c
@@ -15,6 +15,7 @@
# include "compat/glob.h"
#endif
#include <errno.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
@@ -183,7 +184,8 @@ main(int argc, char **argv)
return errors;
}
-int test_glob(struct gl_entry *entry)
+static int
+test_glob(struct gl_entry *entry)
{
glob_t gl;
char **ap;
diff --git a/lib/util/regress/mktemp/mktemp_test.c b/lib/util/regress/mktemp/mktemp_test.c
index 002f7b050..134f89e1c 100644
--- a/lib/util/regress/mktemp/mktemp_test.c
+++ b/lib/util/regress/mktemp/mktemp_test.c
@@ -50,7 +50,7 @@ sudo_dso_public int main(int argc, char *argv[]);
* reasonable expansion of the template and matches the fd. Returns true
* if all the X's were replaced with non-X's
*/
-int
+static int
check(int fd, char const *kind, char const *path, char const *prefix,
size_t plen, char const *suffix, size_t slen, int tlen)
{
@@ -86,7 +86,7 @@ check(int fd, char const *kind, char const *path, char const *prefix,
return 1;
}
-void
+static void
try_mkdtemp(char *p, char const *prefix, int len)
{
size_t plen = strlen(prefix);
@@ -105,7 +105,7 @@ try_mkdtemp(char *p, char const *prefix, int len)
sudo_fatalx("mkdtemp: exceeded MAX_TRIES");
}
-void
+static void
try_mkstemps(char *p, char const *prefix, int len, char const *suffix)
{
size_t plen = strlen(prefix);
diff --git a/lib/util/regress/multiarch/multiarch_test.c b/lib/util/regress/multiarch/multiarch_test.c
new file mode 100644
index 000000000..dfceeb852
--- /dev/null
+++ b/lib/util/regress/multiarch/multiarch_test.c
@@ -0,0 +1,178 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * 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 <config.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudo_fatal.h"
+#include "sudo_util.h"
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+#ifdef __linux__
+# include <sys/utsname.h>
+
+# if defined(__ILP32__)
+# define ARCH_LIB "libx32"
+# elif defined(__LP64__)
+# define ARCH_LIB "lib64"
+# else
+# define ARCH_LIB "lib32"
+# endif
+
+struct multiarch_test {
+ const char *inpath;
+ char *outpath;
+};
+
+static struct multiarch_test *
+make_test_data(void)
+{
+ struct multiarch_test *test_data;
+ struct utsname unamebuf;
+ int i;
+
+ if (uname(&unamebuf) == -1)
+ return NULL;
+
+ test_data = calloc(7, sizeof(*test_data));
+ if (test_data == NULL)
+ return NULL;
+
+ test_data[0].inpath = "/usr/" ARCH_LIB "/libfoo.so";
+ i = asprintf(&test_data[0].outpath, "/usr/lib/%s-linux-gnu/libfoo.so",
+ unamebuf.machine);
+ if (i == -1) {
+ test_data[0].outpath = NULL;
+ goto bad;
+ }
+
+ test_data[1].inpath = "/usr/lib/something.so";
+ i = asprintf(&test_data[1].outpath, "/usr/lib/%s-linux-gnu/something.so",
+ unamebuf.machine);
+ if (i == -1) {
+ test_data[1].outpath = NULL;
+ goto bad;
+ }
+
+ test_data[2].inpath = "/usr/libexec/libbar.so";
+ i = asprintf(&test_data[2].outpath, "/usr/libexec/%s-linux-gnu/libbar.so",
+ unamebuf.machine);
+ if (i == -1) {
+ test_data[2].outpath = NULL;
+ goto bad;
+ }
+
+ test_data[3].inpath = "/usr/local/lib/sudo/libsudo_util.so";
+ i = asprintf(&test_data[3].outpath, "/usr/local/lib/%s-linux-gnu/sudo/libsudo_util.so",
+ unamebuf.machine);
+ if (i == -1) {
+ test_data[3].outpath = NULL;
+ goto bad;
+ }
+
+ test_data[4].inpath = "/opt/sudo/lib/sudoers.so";
+ i = asprintf(&test_data[4].outpath, "/opt/sudo/lib/%s-linux-gnu/sudoers.so",
+ unamebuf.machine);
+ if (i == -1) {
+ test_data[4].outpath = NULL;
+ goto bad;
+ }
+
+ i = asprintf(&test_data[5].outpath, "/usr/lib/%s-linux-gnu/something.so",
+ unamebuf.machine);
+ if (i == -1) {
+ test_data[5].outpath = NULL;
+ goto bad;
+ }
+ test_data[5].inpath = test_data[5].outpath;
+ test_data[5].outpath = NULL;
+
+ return test_data;
+bad:
+ for (i = 0; test_data[i].outpath != NULL; i++)
+ free(test_data[i].outpath);
+ free(test_data);
+ return NULL;
+}
+#endif /* __linux__ */
+
+int
+main(int argc, char *argv[])
+{
+ int ch, errors = 0;
+#ifdef __linux__
+ int ntests = 0;
+ struct multiarch_test *test_data;
+#endif
+
+ initprogname(argc > 0 ? argv[0] : "multiarch_test");
+
+ while ((ch = getopt(argc, argv, "v")) != -1) {
+ switch (ch) {
+ case 'v':
+ /* ignore */
+ break;
+ default:
+ fprintf(stderr, "usage: %s [-v]\n", getprogname());
+ return EXIT_FAILURE;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+#ifdef __linux__
+ test_data = make_test_data();
+ if (test_data == NULL) {
+ sudo_warnx("%s", "failed to generate test data");
+ return EXIT_FAILURE;
+ }
+
+ for (ch = 0; test_data[ch].inpath != NULL; ch++) {
+ char *outpath = sudo_stat_multiarch(test_data[ch].inpath, NULL);
+ ntests++;
+ if (outpath == NULL) {
+ if (test_data[ch].outpath != NULL) {
+ sudo_warnx("%s: sudo_stat_multiarch failed",
+ test_data[ch].inpath);
+ errors++;
+ }
+ } else if (strcmp(outpath, test_data[ch].outpath) != 0) {
+ sudo_warnx("%s: expected %s got %s", test_data[ch].inpath,
+ test_data[ch].outpath, outpath);
+ errors++;
+ free(outpath);
+ }
+ }
+
+ if (ntests != 0) {
+ printf("%s: %d tests run, %d errors, %d%% success rate\n",
+ getprogname(), ntests, errors, (ntests - errors) * 100 / ntests);
+ }
+#endif /* __linux__ */
+ return errors;
+}
diff --git a/lib/util/regress/open_parent_dir/open_parent_dir_test.c b/lib/util/regress/open_parent_dir/open_parent_dir_test.c
new file mode 100644
index 000000000..95f1a09ed
--- /dev/null
+++ b/lib/util/regress/open_parent_dir/open_parent_dir_test.c
@@ -0,0 +1,166 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * 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 <config.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudo_fatal.h"
+#include "sudo_util.h"
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+static int errors = 0, ntests = 0;
+
+static int
+run_test(const char *tdir, const char *path, uid_t uid, gid_t gid)
+{
+ char *cp, fullpath[PATH_MAX];
+ struct stat sb1, sb2;
+ int dfd, len;
+ int ret = -1;
+
+ /* Test creating full path. */
+ len = snprintf(fullpath, sizeof(fullpath), "%s/%s", tdir, path);
+ if (len < 0 || len >= ssizeof(fullpath)) {
+ errno = ENAMETOOLONG;
+ sudo_fatal("%s/%s", tdir, path);
+ }
+ ntests++;
+ dfd = sudo_open_parent_dir(fullpath, uid, gid, 0700, false);
+ if (dfd == -1) {
+ errors++;
+ goto done;
+ }
+
+ /* Verify that we only created the parent dir, not full path. */
+ ntests++;
+ if (stat(fullpath, &sb1) == 0) {
+ sudo_warnx("created full path \"%s\", not just parent dir",
+ fullpath);
+ errors++;
+ goto done;
+ }
+
+ /* Verify that dfd refers to the parent dir. */
+ ntests++;
+ cp = strrchr(fullpath, '/');
+ *cp = '\0';
+ if (stat(fullpath, &sb1) == -1) {
+ sudo_warn("%s", fullpath);
+ errors++;
+ goto done;
+ }
+ if (fstat(dfd, &sb2) == -1) {
+ sudo_warn("%s", fullpath);
+ errors++;
+ goto done;
+ }
+ if (sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) {
+ sudo_warn("%s: sudo_open_parent_dir fd mismatch", fullpath);
+ errors++;
+ goto done;
+ }
+
+done:
+ if (dfd != -1)
+ close(dfd);
+ return ret;
+}
+
+int
+main(int argc, char *argv[])
+{
+ char tdir[] = "open_parent_dir.XXXXXXXX";
+ int ch, dfd, fd, len;
+ char cmd[1024];
+ uid_t uid;
+ gid_t gid;
+
+ initprogname(argc > 0 ? argv[0] : "open_parent_dir_test");
+
+ while ((ch = getopt(argc, argv, "v")) != -1) {
+ switch (ch) {
+ case 'v':
+ /* ignore */
+ break;
+ default:
+ fprintf(stderr, "usage: %s [-v]\n", getprogname());
+ return EXIT_FAILURE;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ uid = geteuid();
+ gid = getegid();
+
+ /* All tests relative to tdir. */
+ if (mkdtemp(tdir) == NULL)
+ sudo_fatal("%s", tdir);
+
+ /* Test creating new path. */
+ dfd = run_test(tdir, "level1/level2/level3", uid, gid);
+
+ /* Verify we can create a new file in the new parent dir. */
+ if (dfd != -1) {
+ ntests++;
+ fd = openat(dfd, "testfile", O_WRONLY|O_CREAT|O_EXCL, 0600);
+ if (fd == -1) {
+ errors++;
+ } else {
+ close(fd);
+ }
+ close(dfd);
+ dfd = -1;
+ }
+
+ /* Test exiting path when final component exists. */
+ dfd = run_test(tdir, "level1/level2/testfile", uid, gid);
+ if (dfd != -1) {
+ unlinkat(dfd, "testfile", 0);
+ close(dfd);
+ }
+
+ /* Test exiting path when final component doesn't exist. */
+ dfd = run_test(tdir, "level1/level2/testfile", uid, gid);
+ if (dfd != -1)
+ close(dfd);
+
+ /* Cleanup */
+ len = snprintf(cmd, sizeof(cmd), "rm -rf \"%s\"", tdir);
+ if (len < 0 || len >= ssizeof(cmd)) {
+ errno = ENAMETOOLONG;
+ sudo_fatalx("rm -rf %s", tdir);
+ }
+ ignore_result(system(cmd));
+
+ if (ntests != 0) {
+ printf("%s: %d tests run, %d errors, %d%% success rate\n",
+ getprogname(), ntests, errors, (ntests - errors) * 100 / ntests);
+ }
+ return errors;
+}
diff --git a/lib/util/regress/parse_gids/parse_gids_test.c b/lib/util/regress/parse_gids/parse_gids_test.c
index 9fb8c3b73..241e81b49 100644
--- a/lib/util/regress/parse_gids/parse_gids_test.c
+++ b/lib/util/regress/parse_gids/parse_gids_test.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_fatal.h"
diff --git a/lib/util/regress/progname/progname_test.c b/lib/util/regress/progname/progname_test.c
index 1c7cb13d9..0a88fafeb 100644
--- a/lib/util/regress/progname/progname_test.c
+++ b/lib/util/regress/progname/progname_test.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
@@ -35,7 +36,7 @@ sudo_dso_public int main(int argc, char *argv[]);
int
main(int argc, char *argv[])
{
- char *progbase = "progname_test";
+ const char *progbase = "progname_test";
int ch;
if (argc > 0)
diff --git a/lib/util/regress/strsig/strsig_test.c b/lib/util/regress/strsig/strsig_test.c
index 35b03a9d5..30aaa2d51 100644
--- a/lib/util/regress/strsig/strsig_test.c
+++ b/lib/util/regress/strsig/strsig_test.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <signal.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
diff --git a/lib/util/regress/strsplit/strsplit_test.c b/lib/util/regress/strsplit/strsplit_test.c
index 39549127f..7f0e071cb 100644
--- a/lib/util/regress/strsplit/strsplit_test.c
+++ b/lib/util/regress/strsplit/strsplit_test.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_fatal.h"
diff --git a/lib/util/regress/strtofoo/strtobool_test.c b/lib/util/regress/strtofoo/strtobool_test.c
index d616f7c60..5b5a6cf84 100644
--- a/lib/util/regress/strtofoo/strtobool_test.c
+++ b/lib/util/regress/strtofoo/strtobool_test.c
@@ -25,6 +25,7 @@
#else
# include "compat/stdbool.h"
#endif
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
diff --git a/lib/util/regress/strtofoo/strtoid_test.c b/lib/util/regress/strtofoo/strtoid_test.c
index facaeebc8..eec9d044c 100644
--- a/lib/util/regress/strtofoo/strtoid_test.c
+++ b/lib/util/regress/strtofoo/strtoid_test.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
diff --git a/lib/util/regress/strtofoo/strtomode_test.c b/lib/util/regress/strtofoo/strtomode_test.c
index 480da5a1f..5e4d862ea 100644
--- a/lib/util/regress/strtofoo/strtomode_test.c
+++ b/lib/util/regress/strtofoo/strtomode_test.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
diff --git a/lib/util/regress/strtofoo/strtonum_test.c b/lib/util/regress/strtofoo/strtonum_test.c
index cf715d2e3..8aca97da8 100644
--- a/lib/util/regress/strtofoo/strtonum_test.c
+++ b/lib/util/regress/strtofoo/strtonum_test.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
diff --git a/lib/util/regress/sudo_conf/conf_test.c b/lib/util/regress/sudo_conf/conf_test.c
index 25e893515..3235019a2 100644
--- a/lib/util/regress/sudo_conf/conf_test.c
+++ b/lib/util/regress/sudo_conf/conf_test.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_conf.h"
diff --git a/lib/util/regress/sudo_parseln/parseln_test.c b/lib/util/regress/sudo_parseln/parseln_test.c
index 8f3892b7a..8cd72947a 100644
--- a/lib/util/regress/sudo_parseln/parseln_test.c
+++ b/lib/util/regress/sudo_parseln/parseln_test.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
diff --git a/lib/util/regress/tailq/hltq_test.c b/lib/util/regress/tailq/hltq_test.c
index 489911ca7..2a1b2bb09 100644
--- a/lib/util/regress/tailq/hltq_test.c
+++ b/lib/util/regress/tailq/hltq_test.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_fatal.h"
diff --git a/lib/util/regress/uuid/uuid_test.c b/lib/util/regress/uuid/uuid_test.c
index 8baa0e7d2..37ef4171e 100644
--- a/lib/util/regress/uuid/uuid_test.c
+++ b/lib/util/regress/uuid/uuid_test.c
@@ -25,6 +25,7 @@
# include <inttypes.h>
#endif
#include <string.h>
+#include <unistd.h>
#define SUDO_ERROR_WRAP 0
diff --git a/lib/util/roundup.c b/lib/util/roundup.c
index 38f15711a..0e7e8fdcd 100644
--- a/lib/util/roundup.c
+++ b/lib/util/roundup.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include "sudo_compat.h"
#include "sudo_debug.h"
diff --git a/lib/util/secure_path.c b/lib/util/secure_path.c
index 9f84de8e9..89d21deee 100644
--- a/lib/util/secure_path.c
+++ b/lib/util/secure_path.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2012, 2014-2016 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2012, 2014-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -24,7 +24,9 @@
#include <config.h>
#include <sys/stat.h>
+#include <fcntl.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
@@ -34,47 +36,110 @@
* Verify that path is the right type and not writable by other users.
*/
static int
-sudo_secure_path(const char *path, unsigned int type, uid_t uid, gid_t gid, struct stat *sb)
+sudo_check_secure(struct stat *sb, unsigned int type, uid_t uid, gid_t gid)
+{
+ int ret = SUDO_PATH_SECURE;
+ debug_decl(sudo_check_secure, SUDO_DEBUG_UTIL);
+
+ if ((sb->st_mode & S_IFMT) != type) {
+ ret = SUDO_PATH_BAD_TYPE;
+ } else if (uid != (uid_t)-1 && sb->st_uid != uid) {
+ ret = SUDO_PATH_WRONG_OWNER;
+ } else if (sb->st_mode & S_IWOTH) {
+ ret = SUDO_PATH_WORLD_WRITABLE;
+ } else if (ISSET(sb->st_mode, S_IWGRP) &&
+ (gid == (gid_t)-1 || sb->st_gid != gid)) {
+ ret = SUDO_PATH_GROUP_WRITABLE;
+ }
+
+ debug_return_int(ret);
+}
+
+/*
+ * Verify that path is the right type and not writable by other users.
+ */
+static int
+sudo_secure_path(const char *path, unsigned int type, uid_t uid, gid_t gid,
+ struct stat *sb)
{
- struct stat stat_buf;
int ret = SUDO_PATH_MISSING;
+ struct stat stat_buf;
debug_decl(sudo_secure_path, SUDO_DEBUG_UTIL);
if (sb == NULL)
sb = &stat_buf;
- if (path != NULL && stat(path, sb) == 0) {
- if ((sb->st_mode & S_IFMT) != type) {
- ret = SUDO_PATH_BAD_TYPE;
- } else if (uid != (uid_t)-1 && sb->st_uid != uid) {
- ret = SUDO_PATH_WRONG_OWNER;
- } else if (sb->st_mode & S_IWOTH) {
- ret = SUDO_PATH_WORLD_WRITABLE;
- } else if (ISSET(sb->st_mode, S_IWGRP) &&
- (gid == (gid_t)-1 || sb->st_gid != gid)) {
- ret = SUDO_PATH_GROUP_WRITABLE;
- } else {
- ret = SUDO_PATH_SECURE;
- }
- }
+ if (path != NULL && stat(path, sb) == 0)
+ ret = sudo_check_secure(sb, type, uid, gid);
debug_return_int(ret);
}
/*
* Verify that path is a regular file and not writable by other users.
+ * Not currently used.
*/
int
-sudo_secure_file_v1(const char *path, uid_t uid, gid_t gid, struct stat *st)
+sudo_secure_file_v1(const char *path, uid_t uid, gid_t gid, struct stat *sb)
{
- return sudo_secure_path(path, S_IFREG, uid, gid, st);
+ return sudo_secure_path(path, S_IFREG, uid, gid, sb);
}
/*
* Verify that path is a directory and not writable by other users.
*/
int
-sudo_secure_dir_v1(const char *path, uid_t uid, gid_t gid, struct stat *st)
+sudo_secure_dir_v1(const char *path, uid_t uid, gid_t gid, struct stat *sb)
+{
+ return sudo_secure_path(path, S_IFDIR, uid, gid, sb);
+}
+
+/*
+ * Open path read-only as long as it is not writable by other users.
+ * Returns an open file descriptor on success, else -1.
+ * Sets error to SUDO_PATH_SECURE on success, and a value < 0 on failure.
+ */
+static int
+sudo_secure_open(const char *path, int type, uid_t uid, gid_t gid,
+ struct stat *sb, int *error)
+{
+ struct stat stat_buf;
+ int fd;
+ debug_decl(sudo_secure_open, SUDO_DEBUG_UTIL);
+
+ if (sb == NULL)
+ sb = &stat_buf;
+
+ fd = open(path, O_RDONLY|O_NONBLOCK);
+ if (fd == -1 || fstat(fd, sb) != 0) {
+ if (fd != -1)
+ close(fd);
+ *error = SUDO_PATH_MISSING;
+ debug_return_int(-1);
+ }
+
+ *error = sudo_check_secure(sb, type, uid, gid);
+ if (*error == SUDO_PATH_SECURE) {
+ (void)fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
+ } else {
+ /* Not secure, caller can check error flag. */
+ close(fd);
+ fd = -1;
+ }
+
+ debug_return_int(fd);
+}
+
+int
+sudo_secure_open_file_v1(const char *path, uid_t uid, gid_t gid,
+ struct stat *sb, int *error)
+{
+ return sudo_secure_open(path, S_IFREG, uid, gid, sb, error);
+}
+
+int
+sudo_secure_open_dir_v1(const char *path, uid_t uid, gid_t gid,
+ struct stat *sb, int *error)
{
- return sudo_secure_path(path, S_IFDIR, uid, gid, st);
+ return sudo_secure_open(path, S_IFDIR, uid, gid, sb, error);
}
diff --git a/lib/util/sha2.c b/lib/util/sha2.c
index b7a28cca8..f769f77f2 100644
--- a/lib/util/sha2.c
+++ b/lib/util/sha2.c
@@ -490,7 +490,7 @@ SHA512Pad(SHA2_CTX *ctx)
SHA512Update(ctx, (uint8_t *)"\200", 1);
/* Pad message such that the resulting length modulo 1024 is 896. */
- while ((ctx->count[0] & 1008) != 896)
+ while ((ctx->count[0] & 1016) != 896)
SHA512Update(ctx, (uint8_t *)"\0", 1);
/* Append length of message in bits and do final SHA512Transform(). */
diff --git a/lib/util/snprintf.c b/lib/util/snprintf.c
index 76278630c..6e3f1fcf9 100644
--- a/lib/util/snprintf.c
+++ b/lib/util/snprintf.c
@@ -47,8 +47,6 @@
!defined(HAVE_VASPRINTF) || !defined(HAVE_ASPRINTF) || \
defined(PREFER_PORTABLE_SNPRINTF)
-#include <sys/mman.h>
-
#include <errno.h>
#ifdef HAVE_NL_LANGINFO
# include <langinfo.h>
@@ -71,6 +69,7 @@
#include <fcntl.h>
#include "sudo_compat.h"
+#include "sudo_util.h"
/* Avoid printf format attacks by ignoring the %n escape. */
#define NO_PRINTF_PERCENT_N
@@ -107,51 +106,10 @@ union arg {
#endif
};
-static int __find_arguments(const char *fmt0, va_list ap, union arg **argtable,
- size_t *argtablesiz);
+static int __find_arguments(const char *fmt0, va_list ap, union arg **argtable);
static int __grow_type_table(unsigned char **typetable, int *tablesize);
static int xxxprintf(char **, size_t, int, const char *, va_list);
-#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
-#ifndef MAP_FAILED
-# define MAP_FAILED ((void *) -1)
-#endif
-
-/*
- * Allocate "size" bytes via mmap.
- */
-static void *
-mmap_alloc(size_t size)
-{
- void *p;
-#ifndef MAP_ANON
- int fd;
-
- if ((fd = open("/dev/zero", O_RDWR)) == -1)
- return NULL;
- p = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
- close(fd);
-#else
- p = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
-#endif
- if (p == MAP_FAILED)
- return NULL;
- return p;
-}
-
-/*
- * Unmap "size" bytes of the ptr.
- */
-static void
-mmap_free(void *ptr, size_t size)
-{
- if (ptr != NULL)
- munmap(ptr, size);
-}
-
#ifdef PRINTF_WIDE_CHAR
/*
* Convert a wide character string argument for the %ls format to a multibyte
@@ -330,7 +288,6 @@ xxxprintf(char **strp, size_t strsize, int alloc, const char *fmt0, va_list ap)
char *estr; /* pointer to last char in str */
union arg *argtable; /* args, built due to positional arg */
union arg statargtable[STATIC_ARG_TBL_SIZE];
- size_t argtablesiz;
int nextarg; /* 1-based argument index */
va_list orgap; /* original argument pointer */
#ifdef PRINTF_WIDE_CHAR
@@ -442,7 +399,7 @@ xxxprintf(char **strp, size_t strsize, int alloc, const char *fmt0, va_list ap)
int hold = nextarg; \
if (argtable == NULL) { \
argtable = statargtable; \
- __find_arguments(fmt0, orgap, &argtable, &argtablesiz); \
+ __find_arguments(fmt0, orgap, &argtable); \
} \
nextarg = n2; \
val = GETARG(int); \
@@ -562,7 +519,7 @@ reswitch: switch (ch) {
if (argtable == NULL) {
argtable = statargtable;
__find_arguments(fmt0, orgap,
- &argtable, &argtablesiz);
+ &argtable);
}
goto rflag;
}
@@ -588,7 +545,7 @@ reswitch: switch (ch) {
if (argtable == NULL) {
argtable = statargtable;
__find_arguments(fmt0, orgap,
- &argtable, &argtablesiz);
+ &argtable);
}
goto rflag;
}
@@ -848,7 +805,7 @@ fp_common:
convbuf = NULL;
}
if ((wcp = GETARG(wchar_t *)) == NULL) {
- cp = "(null)";
+ cp = (char *)"(null)";
} else {
convbuf = __wcsconv(wcp, prec);
if (convbuf == NULL)
@@ -858,7 +815,7 @@ fp_common:
} else
#endif /* PRINTF_WIDE_CHAR */
if ((cp = GETARG(char *)) == NULL)
- cp = "(null)";
+ cp = (char *)"(null)";
if (prec >= 0) {
/*
* can't use strlen; can only look for the
@@ -945,7 +902,7 @@ number: if ((dprec = prec) >= 0)
break;
default:
- cp = "bug in vfprintf: bad base";
+ cp = (char *)"bug in xxxprintf: bad base";
size = strlen(cp);
goto skipsize;
}
@@ -1076,7 +1033,7 @@ finish:
__freedtoa(dtoaresult);
#endif
if (argtable != NULL && argtable != statargtable) {
- mmap_free(argtable, argtablesiz);
+ sudo_mmap_free(argtable);
argtable = NULL;
}
return ret;
@@ -1124,8 +1081,7 @@ finish:
* problematic since we have nested functions..)
*/
static int
-__find_arguments(const char *fmt0, va_list ap, union arg **argtable,
- size_t *argtablesiz)
+__find_arguments(const char *fmt0, va_list ap, union arg **argtable)
{
char *fmt; /* format string */
int ch; /* character from fmt */
@@ -1354,8 +1310,8 @@ done:
* Build the argument table.
*/
if (tablemax >= STATIC_ARG_TBL_SIZE) {
- *argtablesiz = sizeof(union arg) * (tablemax + 1);
- *argtable = mmap_alloc(*argtablesiz);
+ *argtable = sudo_mmap_allocarray(tablemax + 1,
+ sizeof(union arg));
if (*argtable == NULL)
return -1;
}
@@ -1453,7 +1409,7 @@ overflow:
finish:
if (typetable != NULL && typetable != stattypetable) {
- mmap_free(typetable, *argtablesiz);
+ sudo_mmap_free(typetable);
typetable = NULL;
}
return ret;
@@ -1472,16 +1428,16 @@ __grow_type_table(unsigned char **typetable, int *tablesize)
newsize = sysconf(_SC_PAGESIZE);
if (*tablesize == STATIC_ARG_TBL_SIZE) {
- *typetable = mmap_alloc(newsize);
+ *typetable = sudo_mmap_alloc(newsize);
if (*typetable == NULL)
return -1;
memcpy(*typetable, oldtable, *tablesize);
} else {
- unsigned char *new = mmap_alloc(newsize);
+ unsigned char *new = sudo_mmap_alloc(newsize);
if (new == NULL)
return -1;
memmove(new, *typetable, *tablesize);
- mmap_free(*typetable, *tablesize);
+ sudo_mmap_free(*typetable);
*typetable = new;
}
memset(*typetable + *tablesize, T_UNUSED, (newsize - *tablesize));
diff --git a/lib/util/strsignal.c b/lib/util/strsignal.c
index ac952295e..76c93785d 100644
--- a/lib/util/strsignal.c
+++ b/lib/util/strsignal.c
@@ -47,6 +47,6 @@ sudo_strsignal(int signo)
if (signo > 0 && signo < NSIG && sudo_sys_siglist[signo] != NULL)
return (char *)sudo_sys_siglist[signo];
/* XXX - should be "Unknown signal: %d" */
- return _("Unknown signal");
+ return (char *)_("Unknown signal");
}
#endif /* HAVE_STRSIGNAL */
diff --git a/lib/util/strtoid.c b/lib/util/strtoid.c
index 8da857b6b..fe5b44d0a 100644
--- a/lib/util/strtoid.c
+++ b/lib/util/strtoid.c
@@ -39,9 +39,6 @@
#include "sudo_gettext.h"
#include "sudo_util.h"
-/* strtoid.c (not exported) */
-long long sudo_strtonumx(const char *str, long long minval, long long maxval, char **ep, const char **errstrp);
-
/*
* Make sure that the ID ends with a valid separator char.
*/
diff --git a/lib/util/sudo_conf.c b/lib/util/sudo_conf.c
index 29518d4d9..5f046ffa1 100644
--- a/lib/util/sudo_conf.c
+++ b/lib/util/sudo_conf.c
@@ -38,6 +38,7 @@
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
+#include <fcntl.h>
#include <limits.h>
#define SUDO_ERROR_WRAP 0
@@ -68,7 +69,7 @@ struct sudo_conf_path_table {
const char *pname;
unsigned int pnamelen;
bool dynamic;
- char *pval;
+ const char *pval;
};
struct sudo_conf_settings {
@@ -221,7 +222,7 @@ parse_path(const char *entry, const char *conf_file, unsigned int lineno)
}
}
if (cur->dynamic)
- free(cur->pval);
+ free((char *)cur->pval);
cur->pval = pval;
cur->dynamic = true;
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %s:%u: Path %s %s",
@@ -651,7 +652,7 @@ sudo_conf_read_v1(const char *conf_file, int conf_types)
{
struct stat sb;
FILE *fp = NULL;
- int ret = false;
+ int fd, ret = false;
char *prev_locale, *line = NULL;
unsigned int conf_lineno = 0;
size_t linesize = 0;
@@ -670,38 +671,49 @@ sudo_conf_read_v1(const char *conf_file, int conf_types)
if (prev_locale[0] != 'C' || prev_locale[1] != '\0')
setlocale(LC_ALL, "C");
- if (conf_file == NULL) {
+ if (conf_file != NULL) {
+ fd = open(conf_file, O_RDONLY);
+ if (fd == -1) {
+ sudo_warn(U_("unable to open %s"), conf_file);
+ goto done;
+ }
+ } else {
+ int error;
conf_file = _PATH_SUDO_CONF;
- switch (sudo_secure_file(conf_file, ROOT_UID, -1, &sb)) {
- case SUDO_PATH_SECURE:
- break;
+ fd = sudo_secure_open_file(conf_file, ROOT_UID, -1, &sb, &error);
+ if (fd == -1) {
+ switch (error) {
case SUDO_PATH_MISSING:
/* Root should always be able to read sudo.conf. */
if (errno != ENOENT && geteuid() == ROOT_UID)
- sudo_warn(U_("unable to stat %s"), conf_file);
- goto done;
+ sudo_warn(U_("unable to open %s"), conf_file);
+ break;
case SUDO_PATH_BAD_TYPE:
sudo_warnx(U_("%s is not a regular file"), conf_file);
- goto done;
+ break;
case SUDO_PATH_WRONG_OWNER:
sudo_warnx(U_("%s is owned by uid %u, should be %u"),
conf_file, (unsigned int) sb.st_uid, ROOT_UID);
- goto done;
+ break;
case SUDO_PATH_WORLD_WRITABLE:
sudo_warnx(U_("%s is world writable"), conf_file);
- goto done;
+ break;
case SUDO_PATH_GROUP_WRITABLE:
sudo_warnx(U_("%s is group writable"), conf_file);
- goto done;
+ break;
default:
- /* NOTREACHED */
- goto done;
+ sudo_warnx("%s: internal error, unexpected error %d",
+ __func__, error);
+ break;
+ }
+ goto done;
}
}
- if ((fp = fopen(conf_file, "r")) == NULL) {
+ if ((fp = fdopen(fd, "r")) == NULL) {
if (errno != ENOENT && geteuid() == ROOT_UID)
sudo_warn(U_("unable to open %s"), conf_file);
+ close(fd);
goto done;
}
@@ -769,7 +781,7 @@ sudo_conf_clear_paths_v1(void)
for (cur = sudo_conf_data.path_table; cur->pname != NULL; cur++) {
if (cur->dynamic)
- free(cur->pval);
+ free((char *)cur->pval);
cur->pval = NULL;
cur->dynamic = false;
}
diff --git a/lib/util/sudo_debug.c b/lib/util/sudo_debug.c
index 3fe9675a3..c06ba8cde 100644
--- a/lib/util/sudo_debug.c
+++ b/lib/util/sudo_debug.c
@@ -652,7 +652,7 @@ sudo_debug_write2_v1(int fd, const char *func, const char *file, int lineno,
/* Append error string if errno is specified. */
if (errnum) {
if (len > 0) {
- iov[iovcnt].iov_base = ": ";
+ iov[iovcnt].iov_base = (char *)": ";
iov[iovcnt].iov_len = 2;
iovcnt++;
}
@@ -663,7 +663,7 @@ sudo_debug_write2_v1(int fd, const char *func, const char *file, int lineno,
/* If function, file and lineno are specified, append them. */
if (func != NULL && file != NULL && lineno != 0) {
- iov[iovcnt].iov_base = " @ ";
+ iov[iovcnt].iov_base = (char *)" @ ";
iov[iovcnt].iov_len = 3;
iovcnt++;
@@ -671,7 +671,7 @@ sudo_debug_write2_v1(int fd, const char *func, const char *file, int lineno,
iov[iovcnt].iov_len = strlen(func);
iovcnt++;
- iov[iovcnt].iov_base = "() ";
+ iov[iovcnt].iov_base = (char *)"() ";
iov[iovcnt].iov_len = 3;
iovcnt++;
@@ -686,7 +686,7 @@ sudo_debug_write2_v1(int fd, const char *func, const char *file, int lineno,
}
/* Append newline. */
- iov[iovcnt].iov_base = "\n";
+ iov[iovcnt].iov_base = (char *)"\n";
iov[iovcnt].iov_len = 1;
iovcnt++;
@@ -831,7 +831,7 @@ sudo_debug_execve2_v1(int level, const char *path, char *const argv[], char *con
size_t plen;
debug_decl_func(sudo_debug_execve2);
- if (sudo_debug_active_instance == -1)
+ if (sudo_debug_active_instance == -1 || path == NULL)
goto out;
/* Extract priority and subsystem from level. */
@@ -861,19 +861,19 @@ sudo_debug_execve2_v1(int level, const char *path, char *const argv[], char *con
continue;
/* Log envp for debug level "debug". */
- if (output->settings[subsys] >= SUDO_DEBUG_DEBUG - 1 && envp[0] != NULL)
+ if (output->settings[subsys] >= SUDO_DEBUG_DEBUG - 1 && envp != NULL)
log_envp = true;
/* Alloc and build up buffer. */
plen = strlen(path);
buflen = sizeof(EXEC_PREFIX) -1 + plen;
- if (argv[0] != NULL) {
+ if (argv != NULL && argv[0] != NULL) {
buflen += sizeof(" []") - 1;
for (av = argv; *av; av++)
buflen += strlen(*av) + 1;
buflen--;
}
- if (log_envp) {
+ if (log_envp && envp[0] != NULL) {
buflen += sizeof(" []") - 1;
for (av = envp; *av; av++)
buflen += strlen(*av) + 1;
@@ -892,7 +892,7 @@ sudo_debug_execve2_v1(int level, const char *path, char *const argv[], char *con
cp += plen;
/* Copy argv. */
- if (argv[0] != NULL) {
+ if (argv != NULL && argv[0] != NULL) {
*cp++ = ' ';
*cp++ = '[';
for (av = argv; *av; av++) {
@@ -904,7 +904,7 @@ sudo_debug_execve2_v1(int level, const char *path, char *const argv[], char *con
cp[-1] = ']';
}
- if (log_envp) {
+ if (log_envp && envp[0] != NULL) {
*cp++ = ' ';
*cp++ = '[';
for (av = envp; *av; av++) {
diff --git a/lib/util/sudo_dso.c b/lib/util/sudo_dso.c
index 0c8a08ef2..8c680e034 100644
--- a/lib/util/sudo_dso.c
+++ b/lib/util/sudo_dso.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2010, 2012-2014 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2010, 2012-2014, 2021-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -23,6 +23,10 @@
#include <config.h>
+#ifdef __linux__
+# include <sys/utsname.h>
+#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -35,6 +39,7 @@
#include "sudo_compat.h"
#include "sudo_dso.h"
+#include "sudo_util.h"
/*
* Pointer for statically compiled symbols.
@@ -169,15 +174,47 @@ sudo_dso_strerror_v1(void)
# endif
# endif
+# if defined(__linux__)
+/*
+ * On Linux systems that use multi-arch, the actual DSO may be
+ * in a machine-specific subdirectory. If the specified path
+ * contains /lib/ or /libexec/, insert a multi-arch directory
+ * after it.
+ */
+static void *
+dlopen_multi_arch(const char *path, int flags)
+{
+ void *ret = NULL;
+ struct stat sb;
+ char *newpath;
+
+ /* Only try multi-arch if the original path does not exist. */
+ if (stat(path, &sb) == -1 && errno == ENOENT) {
+ newpath = sudo_stat_multiarch(path, &sb);
+ if (newpath != NULL) {
+ ret = dlopen(newpath, flags);
+ free(newpath);
+ }
+ }
+ return ret;
+}
+# else
+static void *
+dlopen_multi_arch(const char *path, int flags)
+{
+ return NULL;
+}
+# endif /* __linux__ */
+
void *
sudo_dso_load_v1(const char *path, int mode)
{
struct sudo_preload_table *pt;
int flags = 0;
void *ret;
-#ifdef RTLD_MEMBER
+# ifdef RTLD_MEMBER
char *cp;
-#endif
+# endif
/* Check prelinked symbols first. */
if (preload_table != NULL) {
@@ -197,7 +234,7 @@ sudo_dso_load_v1(const char *path, int mode)
if (ISSET(mode, SUDO_DSO_LOCAL))
SET(flags, RTLD_LOCAL);
-#ifdef RTLD_MEMBER
+# ifdef RTLD_MEMBER
/* Check for AIX path(module) syntax and add RTLD_MEMBER for a module. */
cp = strrchr(path, '(');
if (cp != NULL) {
@@ -205,9 +242,9 @@ sudo_dso_load_v1(const char *path, int mode)
if (len > 2 && cp[len - 1] == '\0')
SET(flags, RTLD_MEMBER);
}
-#endif /* RTLD_MEMBER */
+# endif /* RTLD_MEMBER */
ret = dlopen(path, flags);
-#ifdef RTLD_MEMBER
+# if defined(RTLD_MEMBER)
/*
* If we try to dlopen() an AIX .a file without an explicit member
* it will fail with ENOEXEC. Try again using the default member.
@@ -217,8 +254,15 @@ sudo_dso_load_v1(const char *path, int mode)
ret = dlopen(cp, flags|RTLD_MEMBER);
free(cp);
}
+ if (ret == NULL) {
+ /* Retry with the original path so we get the correct error. */
+ ret = dlopen(path, flags);
+ }
}
-#endif /* RTLD_MEMBER */
+# endif /* RTLD_MEMBER */
+ /* On failure, try again with a multi-arch path where possible. */
+ if (ret == NULL)
+ ret = dlopen_multi_arch(path, flags);
return ret;
}
diff --git a/lib/util/term.c b/lib/util/term.c
index f90cfb30c..05f32478e 100644
--- a/lib/util/term.c
+++ b/lib/util/term.c
@@ -288,3 +288,27 @@ sudo_term_copy_v1(int src, int dst)
debug_return_bool(true);
}
+
+/*
+ * Returns true if fd refers to a tty in raw mode, else false.
+ */
+bool
+sudo_term_is_raw_v1(int fd)
+{
+ struct termios term;
+ debug_decl(sudo_term_is_raw, SUDO_DEBUG_UTIL);
+
+ if (tcgetattr(fd, &term) != 0)
+ debug_return_bool(false);
+
+ if (term.c_cc[VMIN] != 1 || term.c_cc[VTIME] != 0)
+ debug_return_bool(false);
+
+ if (ISSET(term.c_oflag, OPOST))
+ debug_return_bool(false);
+
+ if (ISSET(term.c_oflag, ECHO|ECHONL|ICANON))
+ debug_return_bool(false);
+
+ debug_return_bool(true);
+}
diff --git a/lib/util/timegm.c b/lib/util/timegm.c
index d87c4eaad..968d829f4 100644
--- a/lib/util/timegm.c
+++ b/lib/util/timegm.c
@@ -88,6 +88,7 @@ sudo_timegm(struct tm *tm)
{
time_t result;
+ tm->tm_isdst = 0;
result = mktime(tm);
if (result != -1)
result += get_gmtoff(&result);
diff --git a/lib/util/util.exp.in b/lib/util/util.exp.in
index 48dcfb4af..99ea923c4 100644
--- a/lib/util/util.exp.in
+++ b/lib/util/util.exp.in
@@ -110,7 +110,13 @@ sudo_lock_region_v1
sudo_logfac2str_v1
sudo_logpri2str_v1
sudo_mkdir_parents_v1
+sudo_mmap_alloc_v1
+sudo_mmap_allocarray_v1
+sudo_mmap_free_v1
+sudo_mmap_protect_v1
+sudo_mmap_strdup_v1
sudo_new_key_val_v1
+sudo_open_parent_dir_v1
sudo_parse_gids_v1
sudo_parseln_v1
sudo_parseln_v2
@@ -122,7 +128,10 @@ sudo_rcstr_dup
sudo_regex_compile_v1
sudo_secure_dir_v1
sudo_secure_file_v1
+sudo_secure_open_dir_v1
+sudo_secure_open_file_v1
sudo_setgroups_v1
+sudo_stat_multiarch_v1
sudo_str2logfac_v1
sudo_str2logpri_v1
sudo_strsplit_v1
@@ -136,6 +145,7 @@ sudo_term_cbreak_v1
sudo_term_copy_v1
sudo_term_eof
sudo_term_erase
+sudo_term_is_raw_v1
sudo_term_kill
sudo_term_noecho_v1
sudo_term_raw_v1
diff --git a/lib/zlib/compress.c b/lib/zlib/compress.c
index e2db404ab..2ad5326c1 100644
--- a/lib/zlib/compress.c
+++ b/lib/zlib/compress.c
@@ -19,7 +19,7 @@
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)
+int ZEXPORT compress2(dest, destLen, source, sourceLen, level)
Bytef *dest;
uLongf *destLen;
const Bytef *source;
@@ -65,7 +65,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
/* ===========================================================================
*/
-int ZEXPORT compress (dest, destLen, source, sourceLen)
+int ZEXPORT compress(dest, destLen, source, sourceLen)
Bytef *dest;
uLongf *destLen;
const Bytef *source;
@@ -78,7 +78,7 @@ int ZEXPORT compress (dest, destLen, source, sourceLen)
If the default memLevel or windowBits for deflateInit() is changed, then
this function needs to be updated.
*/
-uLong ZEXPORT compressBound (sourceLen)
+uLong ZEXPORT compressBound(sourceLen)
uLong sourceLen;
{
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
diff --git a/lib/zlib/crc32.c b/lib/zlib/crc32.c
index a1bdce5c2..f8357b083 100644
--- a/lib/zlib/crc32.c
+++ b/lib/zlib/crc32.c
@@ -98,13 +98,22 @@
# endif
#endif
+/* If available, use the ARM processor CRC32 instruction. */
+#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8
+# define ARMCRC32
+#endif
+
/* Local functions. */
local z_crc_t multmodp OF((z_crc_t a, z_crc_t b));
local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
-/* If available, use the ARM processor CRC32 instruction. */
-#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8
-# define ARMCRC32
+#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
+ local z_word_t byte_swap OF((z_word_t word));
+#endif
+
+#if defined(W) && !defined(ARMCRC32)
+ local z_crc_t crc_word OF((z_word_t data));
+ local z_word_t crc_word_big OF((z_word_t data));
#endif
#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
@@ -630,7 +639,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
#endif /* DYNAMIC_CRC_TABLE */
/* Pre-condition the CRC */
- crc ^= 0xffffffff;
+ crc = (~crc) & 0xffffffff;
/* Compute the CRC up to a word boundary. */
while (len && ((z_size_t)buf & 7) != 0) {
@@ -645,8 +654,8 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
len &= 7;
/* Do three interleaved CRCs to realize the throughput of one crc32x
- instruction per cycle. Each CRC is calcuated on Z_BATCH words. The three
- CRCs are combined into a single CRC after each set of batches. */
+ instruction per cycle. Each CRC is calculated on Z_BATCH words. The
+ three CRCs are combined into a single CRC after each set of batches. */
while (num >= 3 * Z_BATCH) {
crc1 = 0;
crc2 = 0;
@@ -749,7 +758,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
#endif /* DYNAMIC_CRC_TABLE */
/* Pre-condition the CRC */
- crc ^= 0xffffffff;
+ crc = (~crc) & 0xffffffff;
#ifdef W
@@ -1077,7 +1086,7 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
#ifdef DYNAMIC_CRC_TABLE
once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
- return multmodp(x2nmodp(len2, 3), crc1) ^ crc2;
+ return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff);
}
/* ========================================================================= */
@@ -1086,7 +1095,7 @@ uLong ZEXPORT crc32_combine(crc1, crc2, len2)
uLong crc2;
z_off_t len2;
{
- return crc32_combine64(crc1, crc2, len2);
+ return crc32_combine64(crc1, crc2, (z_off64_t)len2);
}
/* ========================================================================= */
@@ -1103,14 +1112,14 @@ uLong ZEXPORT crc32_combine_gen64(len2)
uLong ZEXPORT crc32_combine_gen(len2)
z_off_t len2;
{
- return crc32_combine_gen64(len2);
+ return crc32_combine_gen64((z_off64_t)len2);
}
/* ========================================================================= */
-uLong crc32_combine_op(crc1, crc2, op)
+uLong ZEXPORT crc32_combine_op(crc1, crc2, op)
uLong crc1;
uLong crc2;
uLong op;
{
- return multmodp(op, crc1) ^ crc2;
+ return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
}
diff --git a/lib/zlib/deflate.c b/lib/zlib/deflate.c
index 691d810d4..aadd3571a 100644
--- a/lib/zlib/deflate.c
+++ b/lib/zlib/deflate.c
@@ -52,7 +52,7 @@
#include "deflate.h"
const char deflate_copyright[] =
- " deflate 1.2.12 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
+ " deflate 1.2.13 Copyright 1995-2022 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
@@ -87,13 +87,7 @@ 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,
@@ -160,7 +154,7 @@ local const config configuration_table[10] = {
* 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)<<s->hash_shift) ^ (c)) & s->hash_mask)
+#define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask)
/* ===========================================================================
@@ -191,9 +185,9 @@ local const config configuration_table[10] = {
*/
#define CLEAR_HASH(s) \
do { \
- s->head[s->hash_size-1] = NIL; \
+ s->head[s->hash_size - 1] = NIL; \
zmemzero((Bytef *)s->head, \
- (unsigned)(s->hash_size-1)*sizeof(*s->head)); \
+ (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
} while (0)
/* ===========================================================================
@@ -285,6 +279,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
if (windowBits < 0) { /* suppress zlib wrapper */
wrap = 0;
+ if (windowBits < -15)
+ return Z_STREAM_ERROR;
windowBits = -windowBits;
}
#ifdef GZIP
@@ -314,7 +310,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
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->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));
@@ -340,11 +336,11 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
* sym_buf value to read moves forward three bytes. From that symbol, up to
* 31 bits are written to pending_buf. The closest the written pending_buf
* bits gets to the next sym_buf symbol to read is just before the last
- * code is written. At that time, 31*(n-2) bits have been written, just
- * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
- * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
+ * code is written. At that time, 31*(n - 2) bits have been written, just
+ * after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at
+ * 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1
* symbols are written.) The closest the writing gets to what is unread is
- * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
+ * then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and
* can range from 128 to 32768.
*
* Therefore, at a minimum, there are 142 bits of space between what is
@@ -390,7 +386,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
/* =========================================================================
* Check for a valid deflate stream state. Return 0 if ok, 1 if not.
*/
-local int deflateStateCheck (strm)
+local int deflateStateCheck(strm)
z_streamp strm;
{
deflate_state *s;
@@ -413,7 +409,7 @@ local int deflateStateCheck (strm)
}
/* ========================================================================= */
-int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
+int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
z_streamp strm;
const Bytef *dictionary;
uInt dictLength;
@@ -482,7 +478,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
}
/* ========================================================================= */
-int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength)
+int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
z_streamp strm;
Bytef *dictionary;
uInt *dictLength;
@@ -504,7 +500,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength)
}
/* ========================================================================= */
-int ZEXPORT deflateResetKeep (strm)
+int ZEXPORT deflateResetKeep(strm)
z_streamp strm;
{
deflate_state *s;
@@ -542,7 +538,7 @@ int ZEXPORT deflateResetKeep (strm)
}
/* ========================================================================= */
-int ZEXPORT deflateReset (strm)
+int ZEXPORT deflateReset(strm)
z_streamp strm;
{
int ret;
@@ -554,7 +550,7 @@ int ZEXPORT deflateReset (strm)
}
/* ========================================================================= */
-int ZEXPORT deflateSetHeader (strm, head)
+int ZEXPORT deflateSetHeader(strm, head)
z_streamp strm;
gz_headerp head;
{
@@ -565,7 +561,7 @@ int ZEXPORT deflateSetHeader (strm, head)
}
/* ========================================================================= */
-int ZEXPORT deflatePending (strm, pending, bits)
+int ZEXPORT deflatePending(strm, pending, bits)
unsigned *pending;
int *bits;
z_streamp strm;
@@ -579,7 +575,7 @@ int ZEXPORT deflatePending (strm, pending, bits)
}
/* ========================================================================= */
-int ZEXPORT deflatePrime (strm, bits, value)
+int ZEXPORT deflatePrime(strm, bits, value)
z_streamp strm;
int bits;
int value;
@@ -674,36 +670,50 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
}
/* =========================================================================
- * 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 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. This
+ * is an expansion of ~0.03%, plus a small constant.
+ *
+ * For any setting other than those defaults for windowBits and memLevel, one
+ * of two worst case bounds is returned. This is at most an expansion of ~4% or
+ * ~13%, plus a small constant.
*
- * 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.
+ * Both the 0.03% and 4% derive from the overhead of stored blocks. The first
+ * one is for stored blocks of 16383 bytes (memLevel == 8), whereas the second
+ * is for stored blocks of 127 bytes (the worst case memLevel == 1). The
+ * expansion results from five bytes of header for each stored block.
*
- * 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.
+ * The larger expansion of 13% results from a window size less than or equal to
+ * the symbols buffer size (windowBits <= memLevel + 7). In that case some of
+ * the data being compressed may have slid out of the sliding window, impeding
+ * a stored block from being emitted. Then the only choice is a fixed or
+ * dynamic block, where a fixed block limits the maximum expansion to 9 bits
+ * per 8-bit byte, plus 10 bits for every block. The smallest block size for
+ * which this can occur is 255 (memLevel == 2).
+ *
+ * Shifts are used to approximate divisions, for speed.
*/
uLong ZEXPORT deflateBound(strm, sourceLen)
z_streamp strm;
uLong sourceLen;
{
deflate_state *s;
- uLong complen, wraplen;
+ uLong fixedlen, storelen, wraplen;
+
+ /* upper bound for fixed blocks with 9-bit literals and length 255
+ (memLevel == 2, which is the lowest that may not use stored blocks) --
+ ~13% overhead plus a small constant */
+ fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) +
+ (sourceLen >> 9) + 4;
- /* conservative upper bound for compressed data */
- complen = sourceLen +
- ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
+ /* upper bound for stored blocks with length 127 (memLevel == 1) --
+ ~4% overhead plus a small constant */
+ storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) +
+ (sourceLen >> 11) + 7;
- /* if can't get parameters, return conservative bound plus zlib wrapper */
+ /* if can't get parameters, return larger bound plus a zlib wrapper */
if (deflateStateCheck(strm))
- return complen + 6;
+ return (fixedlen > storelen ? fixedlen : storelen) + 6;
/* compute wrapper length */
s = strm->state;
@@ -740,11 +750,12 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
wraplen = 6;
}
- /* if not default parameters, return conservative bound */
+ /* if not default parameters, return one of the conservative bounds */
if (s->w_bits != 15 || s->hash_bits != 8 + 7)
- return complen + wraplen;
+ return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen;
- /* default settings: return tight bound for that case */
+ /* default settings: return tight bound for that case -- ~0.03% overhead
+ plus a small constant */
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
(sourceLen >> 25) + 13 - 6 + wraplen;
}
@@ -754,7 +765,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
* IN assertion: the stream state is correct and there is enough room in
* pending_buf.
*/
-local void putShortMSB (s, b)
+local void putShortMSB(s, b)
deflate_state *s;
uInt b;
{
@@ -801,7 +812,7 @@ local void flush_pending(strm)
} while (0)
/* ========================================================================= */
-int ZEXPORT deflate (strm, flush)
+int ZEXPORT deflate(strm, flush)
z_streamp strm;
int flush;
{
@@ -856,7 +867,7 @@ int ZEXPORT deflate (strm, flush)
s->status = BUSY_STATE;
if (s->status == INIT_STATE) {
/* zlib header */
- uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+ uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8;
uInt level_flags;
if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
@@ -1116,7 +1127,7 @@ int ZEXPORT deflate (strm, flush)
}
/* ========================================================================= */
-int ZEXPORT deflateEnd (strm)
+int ZEXPORT deflateEnd(strm)
z_streamp strm;
{
int status;
@@ -1142,7 +1153,7 @@ int ZEXPORT deflateEnd (strm)
* 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)
+int ZEXPORT deflateCopy(dest, source)
z_streamp dest;
z_streamp source;
{
@@ -1231,7 +1242,7 @@ local unsigned read_buf(strm, buf, size)
/* ===========================================================================
* Initialize the "longest match" routines for a new zlib stream
*/
-local void lm_init (s)
+local void lm_init(s)
deflate_state *s;
{
s->window_size = (ulg)2L*s->w_size;
@@ -1252,11 +1263,6 @@ local void lm_init (s)
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
@@ -1269,10 +1275,6 @@ local void lm_init (s)
* 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 */
@@ -1297,10 +1299,10 @@ local uInt longest_match(s, cur_match)
*/
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);
+ 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_end1 = scan[best_len - 1];
register Byte scan_end = scan[best_len];
#endif
@@ -1318,7 +1320,8 @@ local uInt longest_match(s, cur_match)
*/
if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead;
- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+ "need lookahead");
do {
Assert(cur_match < s->strstart, "no future");
@@ -1336,43 +1339,44 @@ local uInt longest_match(s, cur_match)
/* 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 ||
+ 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
+ * 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
+ * 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) &&
+ } 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");
+ /* 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);
+ 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;
+ 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
+ /* 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
@@ -1382,7 +1386,7 @@ local uInt longest_match(s, cur_match)
Assert(*scan == *match, "match[2]?");
/* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
+ * the 256th check will be made at strstart + 258.
*/
do {
} while (*++scan == *++match && *++scan == *++match &&
@@ -1391,7 +1395,8 @@ local uInt longest_match(s, cur_match)
*++scan == *++match && *++scan == *++match &&
scan < strend);
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+ Assert(scan <= s->window + (unsigned)(s->window_size - 1),
+ "wild scan");
len = MAX_MATCH - (int)(strend - scan);
scan = strend - MAX_MATCH;
@@ -1403,9 +1408,9 @@ local uInt longest_match(s, cur_match)
best_len = len;
if (len >= nice_match) break;
#ifdef UNALIGNED_OK
- scan_end = *(ushf*)(scan+best_len-1);
+ scan_end = *(ushf*)(scan + best_len - 1);
#else
- scan_end1 = scan[best_len-1];
+ scan_end1 = scan[best_len - 1];
scan_end = scan[best_len];
#endif
}
@@ -1415,7 +1420,6 @@ local uInt longest_match(s, cur_match)
if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
return s->lookahead;
}
-#endif /* ASMV */
#else /* FASTEST */
@@ -1436,7 +1440,8 @@ local uInt longest_match(s, cur_match)
*/
Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+ "need lookahead");
Assert(cur_match < s->strstart, "no future");
@@ -1446,7 +1451,7 @@ local uInt longest_match(s, cur_match)
*/
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
+ /* 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
@@ -1456,7 +1461,7 @@ local uInt longest_match(s, cur_match)
Assert(*scan == *match, "match[2]?");
/* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
+ * the 256th check will be made at strstart + 258.
*/
do {
} while (*++scan == *++match && *++scan == *++match &&
@@ -1465,7 +1470,7 @@ local uInt longest_match(s, cur_match)
*++scan == *++match && *++scan == *++match &&
scan < strend);
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+ Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan");
len = MAX_MATCH - (int)(strend - scan);
@@ -1501,7 +1506,7 @@ local void check_match(s, start, match, length)
z_error("invalid match");
}
if (z_verbose > 1) {
- fprintf(stderr,"\\[%d,%d]", start-match, length);
+ fprintf(stderr,"\\[%d,%d]", start - match, length);
do { putc(s->window[start++], stderr); } while (--length != 0);
}
}
@@ -1547,9 +1552,9 @@ local void fill_window(s)
/* 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)) {
+ if (s->strstart >= wsize + MAX_DIST(s)) {
- zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more);
+ 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;
@@ -1682,7 +1687,7 @@ local void fill_window(s)
*
* 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.
+ * maximizes the opportunities to have a single copy from next_in to next_out.
*/
local block_state deflate_stored(s, flush)
deflate_state *s;
@@ -1892,7 +1897,7 @@ local block_state deflate_fast(s, flush)
if (s->lookahead == 0) break; /* flush the current block */
}
- /* Insert the string window[strstart .. strstart+2] in the
+ /* Insert the string window[strstart .. strstart + 2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
hash_head = NIL;
@@ -1940,7 +1945,7 @@ local block_state deflate_fast(s, flush)
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]);
+ UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]);
#if MIN_MATCH != 3
Call UPDATE_HASH() MIN_MATCH-3 more times
#endif
@@ -1951,7 +1956,7 @@ local block_state deflate_fast(s, flush)
} else {
/* No match, output a literal byte */
Tracevv((stderr,"%c", s->window[s->strstart]));
- _tr_tally_lit (s, s->window[s->strstart], bflush);
+ _tr_tally_lit(s, s->window[s->strstart], bflush);
s->lookahead--;
s->strstart++;
}
@@ -1995,7 +2000,7 @@ local block_state deflate_slow(s, flush)
if (s->lookahead == 0) break; /* flush the current block */
}
- /* Insert the string window[strstart .. strstart+2] in the
+ /* Insert the string window[strstart .. strstart + 2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
hash_head = NIL;
@@ -2037,17 +2042,17 @@ local block_state deflate_slow(s, flush)
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);
+ check_match(s, s->strstart - 1, s->prev_match, s->prev_length);
- _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+ _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
+ * 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->lookahead -= s->prev_length - 1;
s->prev_length -= 2;
do {
if (++s->strstart <= max_insert) {
@@ -2065,8 +2070,8 @@ local block_state deflate_slow(s, flush)
* 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);
+ 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);
}
@@ -2084,8 +2089,8 @@ local block_state deflate_slow(s, flush)
}
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);
+ 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;
@@ -2142,7 +2147,8 @@ local block_state deflate_rle(s, flush)
if (s->match_length > s->lookahead)
s->match_length = s->lookahead;
}
- Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+ Assert(scan <= s->window + (uInt)(s->window_size - 1),
+ "wild scan");
}
/* Emit match if have run of MIN_MATCH or longer, else emit literal */
@@ -2157,7 +2163,7 @@ local block_state deflate_rle(s, flush)
} else {
/* No match, output a literal byte */
Tracevv((stderr,"%c", s->window[s->strstart]));
- _tr_tally_lit (s, s->window[s->strstart], bflush);
+ _tr_tally_lit(s, s->window[s->strstart], bflush);
s->lookahead--;
s->strstart++;
}
@@ -2197,7 +2203,7 @@ local block_state deflate_huff(s, flush)
/* Output a literal byte */
s->match_length = 0;
Tracevv((stderr,"%c", s->window[s->strstart]));
- _tr_tally_lit (s, s->window[s->strstart], bflush);
+ _tr_tally_lit(s, s->window[s->strstart], bflush);
s->lookahead--;
s->strstart++;
if (bflush) FLUSH_BLOCK(s, 0);
diff --git a/lib/zlib/deflate.h b/lib/zlib/deflate.h
index 17c226113..1a06cd5f2 100644
--- a/lib/zlib/deflate.h
+++ b/lib/zlib/deflate.h
@@ -329,8 +329,8 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
# define _tr_tally_dist(s, distance, length, flush) \
{ uch len = (uch)(length); \
ush dist = (ush)(distance); \
- s->sym_buf[s->sym_next++] = dist; \
- s->sym_buf[s->sym_next++] = dist >> 8; \
+ s->sym_buf[s->sym_next++] = (uch)dist; \
+ s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \
s->sym_buf[s->sym_next++] = len; \
dist--; \
s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
diff --git a/lib/zlib/gzlib.c b/lib/zlib/gzlib.c
index dddaf2687..55da46a45 100644
--- a/lib/zlib/gzlib.c
+++ b/lib/zlib/gzlib.c
@@ -30,7 +30,7 @@ local gzFile gz_open OF((const void *, int, const char *));
The gz_strwinerror function does not change the current setting of
GetLastError. */
-char ZLIB_INTERNAL *gz_strwinerror (error)
+char ZLIB_INTERNAL *gz_strwinerror(error)
DWORD error;
{
static char buf[1024];
diff --git a/lib/zlib/gzread.c b/lib/zlib/gzread.c
index 884c9bfe4..dd7738159 100644
--- a/lib/zlib/gzread.c
+++ b/lib/zlib/gzread.c
@@ -157,11 +157,9 @@ local int gz_look(state)
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;
- }
+ 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;
diff --git a/lib/zlib/gzwrite.c b/lib/zlib/gzwrite.c
index a8ffc8f53..eb8a0e589 100644
--- a/lib/zlib/gzwrite.c
+++ b/lib/zlib/gzwrite.c
@@ -474,7 +474,7 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
#else /* !STDC && !Z_HAVE_STDARG_H */
/* -- see zlib.h -- */
-int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
+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;
diff --git a/lib/zlib/infback.c b/lib/zlib/infback.c
index fe8577488..8a14e52d2 100644
--- a/lib/zlib/infback.c
+++ b/lib/zlib/infback.c
@@ -66,6 +66,7 @@ int stream_size;
state->window = window;
state->wnext = 0;
state->whave = 0;
+ state->sane = 1;
return Z_OK;
}
@@ -605,25 +606,27 @@ void FAR *out_desc;
break;
case DONE:
- /* inflate stream terminated properly -- write leftover output */
+ /* inflate stream terminated properly */
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 */
+ default:
+ /* can't happen, but makes compilers happy */
ret = Z_STREAM_ERROR;
goto inf_leave;
}
- /* Return unused input */
+ /* Write leftover output and return unused input */
inf_leave:
+ if (left < state->wsize) {
+ if (out(out_desc, state->window, state->wsize - left) &&
+ ret == Z_STREAM_END)
+ ret = Z_BUF_ERROR;
+ }
strm->next_in = next;
strm->avail_in = have;
return ret;
diff --git a/lib/zlib/inflate.c b/lib/zlib/inflate.c
index fcf5e10ab..49934c9df 100644
--- a/lib/zlib/inflate.c
+++ b/lib/zlib/inflate.c
@@ -168,6 +168,8 @@ int windowBits;
/* extract wrap request from windowBits parameter */
if (windowBits < 0) {
+ if (windowBits < -15)
+ return Z_STREAM_ERROR;
wrap = 0;
windowBits = -windowBits;
}
@@ -764,8 +766,9 @@ int flush;
if (copy > have) copy = have;
if (copy) {
if (state->head != Z_NULL &&
- state->head->extra != Z_NULL) {
- len = state->head->extra_len - state->length;
+ state->head->extra != Z_NULL &&
+ (len = state->head->extra_len - state->length) <
+ state->head->extra_max) {
zmemcpy(state->head->extra + len, next,
len + copy > state->head->extra_max ?
state->head->extra_max - len : copy);
diff --git a/lib/zlib/inftrees.c b/lib/zlib/inftrees.c
index 09462a740..57d2793be 100644
--- a/lib/zlib/inftrees.c
+++ b/lib/zlib/inftrees.c
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.2.12 Copyright 1995-2022 Mark Adler ";
+ " inflate 1.2.13 Copyright 1995-2022 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
@@ -62,7 +62,7 @@ unsigned short FAR *work;
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, 199, 202};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65};
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,
diff --git a/lib/zlib/inftrees.h b/lib/zlib/inftrees.h
index baa53a0b1..f53665311 100644
--- a/lib/zlib/inftrees.h
+++ b/lib/zlib/inftrees.h
@@ -38,7 +38,7 @@ typedef struct {
/* 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
+ examples/enough.c found in the zlib distribution. 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.
diff --git a/lib/zlib/trees.c b/lib/zlib/trees.c
index f73fd99c3..5f305c472 100644
--- a/lib/zlib/trees.c
+++ b/lib/zlib/trees.c
@@ -193,7 +193,7 @@ local void send_bits(s, value, 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))
+ * (16 - bi_valid) bits from value, leaving (width - (16 - bi_valid))
* unused bits in value.
*/
if (s->bi_valid > (int)Buf_size - length) {
@@ -256,7 +256,7 @@ local void tr_static_init()
length = 0;
for (code = 0; code < LENGTH_CODES-1; code++) {
base_length[code] = length;
- for (n = 0; n < (1<<extra_lbits[code]); n++) {
+ for (n = 0; n < (1 << extra_lbits[code]); n++) {
_length_code[length++] = (uch)code;
}
}
@@ -265,13 +265,13 @@ local void tr_static_init()
* in two different ways: code 284 + 5 bits or code 285, so we
* overwrite length_code[255] to use the best encoding:
*/
- _length_code[length-1] = (uch)code;
+ _length_code[length - 1] = (uch)code;
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */
dist = 0;
for (code = 0 ; code < 16; code++) {
base_dist[code] = dist;
- for (n = 0; n < (1<<extra_dbits[code]); n++) {
+ for (n = 0; n < (1 << extra_dbits[code]); n++) {
_dist_code[dist++] = (uch)code;
}
}
@@ -279,11 +279,11 @@ local void tr_static_init()
dist >>= 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++) {
+ 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");
+ 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;
@@ -312,7 +312,7 @@ local void tr_static_init()
}
/* ===========================================================================
- * Genererate the file trees.h describing the static trees.
+ * Generate the file trees.h describing the static trees.
*/
#ifdef GEN_TREES_H
# ifndef ZLIB_DEBUG
@@ -321,7 +321,7 @@ local void tr_static_init()
# define SEPARATOR(i, last, width) \
((i) == (last)? "\n};\n\n" : \
- ((i) % (width) == (width)-1 ? ",\n" : ", "))
+ ((i) % (width) == (width) - 1 ? ",\n" : ", "))
void gen_trees_header()
{
@@ -458,7 +458,7 @@ local void pqdownheap(s, tree, 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)) {
+ smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) {
j++;
}
/* Exit if v is smaller than both sons */
@@ -507,7 +507,7 @@ local void gen_bitlen(s, desc)
*/
tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
- for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+ 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++;
@@ -518,7 +518,7 @@ local void gen_bitlen(s, desc)
s->bl_count[bits]++;
xbits = 0;
- if (n >= base) xbits = extra[n-base];
+ 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);
@@ -530,10 +530,10 @@ local void gen_bitlen(s, desc)
/* Find the first bit length which could increase: */
do {
- bits = max_length-1;
+ 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[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]
@@ -569,7 +569,7 @@ local void gen_bitlen(s, desc)
* 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)
+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 */
@@ -583,13 +583,13 @@ local void gen_codes (tree, max_code, bl_count)
* without bit reversal.
*/
for (bits = 1; bits <= MAX_BITS; bits++) {
- code = (code + bl_count[bits-1]) << 1;
+ 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<<MAX_BITS)-1,
+ Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
"inconsistent bit counts");
Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
@@ -600,7 +600,7 @@ local void gen_codes (tree, max_code, bl_count)
tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
- n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
}
}
@@ -624,7 +624,7 @@ local void build_tree(s, desc)
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[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;
@@ -652,7 +652,7 @@ local void build_tree(s, desc)
}
desc->max_code = max_code;
- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+ /* 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);
@@ -700,7 +700,7 @@ local void build_tree(s, desc)
* 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)
+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 */
@@ -714,10 +714,10 @@ local void scan_tree (s, tree, max_code)
int min_count = 4; /* min repeat count */
if (nextlen == 0) max_count = 138, min_count = 3;
- tree[max_code+1].Len = (ush)0xffff; /* guard */
+ tree[max_code + 1].Len = (ush)0xffff; /* guard */
for (n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[n+1].Len;
+ curlen = nextlen; nextlen = tree[n + 1].Len;
if (++count < max_count && curlen == nextlen) {
continue;
} else if (count < min_count) {
@@ -745,7 +745,7 @@ local void scan_tree (s, tree, max_code)
* Send a literal or distance tree in compressed form, using the codes in
* bl_tree.
*/
-local void send_tree (s, tree, max_code)
+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 */
@@ -758,11 +758,11 @@ local void send_tree (s, tree, max_code)
int max_count = 7; /* max repeat count */
int min_count = 4; /* min repeat count */
- /* tree[max_code+1].Len = -1; */ /* guard already set */
+ /* 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;
+ curlen = nextlen; nextlen = tree[n + 1].Len;
if (++count < max_count && curlen == nextlen) {
continue;
} else if (count < min_count) {
@@ -773,13 +773,13 @@ local void send_tree (s, tree, max_code)
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);
+ 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);
+ 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);
+ send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7);
}
count = 0; prevlen = curlen;
if (nextlen == 0) {
@@ -807,8 +807,8 @@ local int build_bl_tree(s)
/* 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.
+ /* 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
@@ -819,7 +819,7 @@ local int build_bl_tree(s)
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;
+ 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));
@@ -841,19 +841,19 @@ local void send_all_trees(s, lcodes, dcodes, blcodes)
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 */
+ 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 */
+ 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 */
+ send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */
Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
}
@@ -866,7 +866,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
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 */
+ 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);
@@ -877,7 +877,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
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;
+ s->bits_sent += stored_len << 3;
#endif
}
@@ -943,14 +943,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
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;
+ 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->sym_next / 3));
- if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+#ifndef FORCE_STATIC
+ if (static_lenb <= opt_lenb || s->strategy == Z_FIXED)
+#endif
+ opt_lenb = static_lenb;
} else {
Assert(buf != (char*)0, "lost buf");
@@ -960,7 +963,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
#ifdef FORCE_STORED
if (buf != (char*)0) { /* force stored block */
#else
- if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+ 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.
@@ -971,21 +974,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
*/
_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);
+ } else if (static_lenb == opt_lenb) {
+ 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);
+ 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
@@ -1004,22 +1003,22 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
s->compressed_len += 7; /* align on byte boundary */
#endif
}
- Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
- s->compressed_len-7*last));
+ 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)
+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) */
+ unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */
{
- s->sym_buf[s->sym_next++] = dist;
- s->sym_buf[s->sym_next++] = dist >> 8;
- s->sym_buf[s->sym_next++] = lc;
+ s->sym_buf[s->sym_next++] = (uch)dist;
+ s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
+ s->sym_buf[s->sym_next++] = (uch)lc;
if (dist == 0) {
/* lc is the unmatched char */
s->dyn_ltree[lc].Freq++;
@@ -1031,7 +1030,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
(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_ltree[_length_code[lc] + LITERALS + 1].Freq++;
s->dyn_dtree[d_code(dist)].Freq++;
}
return (s->sym_next == s->sym_end);
@@ -1061,7 +1060,7 @@ local void compress_block(s, ltree, dtree)
} else {
/* Here, lc is the match length - MIN_MATCH */
code = _length_code[lc];
- send_code(s, code+LITERALS+1, ltree); /* send the length code */
+ send_code(s, code + LITERALS + 1, ltree); /* send length code */
extra = extra_lbits[code];
if (extra != 0) {
lc -= base_length[code];
@@ -1177,6 +1176,6 @@ local void bi_windup(s)
s->bi_buf = 0;
s->bi_valid = 0;
#ifdef ZLIB_DEBUG
- s->bits_sent = (s->bits_sent+7) & ~7;
+ s->bits_sent = (s->bits_sent + 7) & ~7;
#endif
}
diff --git a/lib/zlib/uncompr.c b/lib/zlib/uncompr.c
index f03a1a865..f9532f46c 100644
--- a/lib/zlib/uncompr.c
+++ b/lib/zlib/uncompr.c
@@ -24,7 +24,7 @@
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)
+int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
Bytef *dest;
uLongf *destLen;
const Bytef *source;
@@ -83,7 +83,7 @@ int ZEXPORT uncompress2 (dest, destLen, source, sourceLen)
err;
}
-int ZEXPORT uncompress (dest, destLen, source, sourceLen)
+int ZEXPORT uncompress(dest, destLen, source, sourceLen)
Bytef *dest;
uLongf *destLen;
const Bytef *source;
diff --git a/lib/zlib/zconf.h.in b/lib/zlib/zconf.h.in
index 0b6bd5360..d23d7931d 100644
--- a/lib/zlib/zconf.h.in
+++ b/lib/zlib/zconf.h.in
@@ -67,6 +67,9 @@
# define crc32 z_crc32
# define crc32_combine z_crc32_combine
# define crc32_combine64 z_crc32_combine64
+# define crc32_combine_gen z_crc32_combine_gen
+# define crc32_combine_gen64 z_crc32_combine_gen64
+# define crc32_combine_op z_crc32_combine_op
# define crc32_z z_crc32_z
# define deflate z_deflate
# define deflateBound z_deflateBound
@@ -378,6 +381,9 @@
# ifdef FAR
# undef FAR
# endif
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
# include <windows.h>
/* No need for _export, use ZLIB.DEF instead. */
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
@@ -496,11 +502,18 @@ typedef uLong FAR uLongf;
# undef _LARGEFILE64_SOURCE
#endif
-#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
-# define Z_HAVE_UNISTD_H
+#ifndef Z_HAVE_UNISTD_H
+# ifdef __WATCOMC__
+# define Z_HAVE_UNISTD_H
+# endif
+#endif
+#ifndef Z_HAVE_UNISTD_H
+# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)
+# define Z_HAVE_UNISTD_H
+# endif
#endif
#ifndef Z_SOLO
-# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# if defined(Z_HAVE_UNISTD_H)
# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
# ifdef VMS
# include <unixio.h> /* for off_t */
diff --git a/lib/zlib/zlib.h b/lib/zlib/zlib.h
index 4a98e38bf..953cb5012 100644
--- a/lib/zlib/zlib.h
+++ b/lib/zlib/zlib.h
@@ -1,5 +1,5 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.12, March 11th, 2022
+ version 1.2.13, October 13th, 2022
Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
@@ -37,11 +37,11 @@
extern "C" {
#endif
-#define ZLIB_VERSION "1.2.12"
-#define ZLIB_VERNUM 0x12c0
+#define ZLIB_VERSION "1.2.13"
+#define ZLIB_VERNUM 0x12d0
#define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 2
-#define ZLIB_VER_REVISION 12
+#define ZLIB_VER_REVISION 13
#define ZLIB_VER_SUBREVISION 0
/*
@@ -276,7 +276,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
== 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
+ which can be used if desired to determine whether or not there is more output
in that case.
Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
@@ -660,7 +660,7 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
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.
+ Similarly, 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
@@ -915,7 +915,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
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.
+ Similarly, 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.
@@ -1437,12 +1437,12 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
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
+ multiple of size, then the final partial item is nevertheless 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.
+ file, resetting and retrying on end-of-file, when size is not 1.
*/
ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len));
@@ -1913,7 +1913,7 @@ 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 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(Z_SOLO)
diff --git a/lib/zlib/zutil.c b/lib/zlib/zutil.c
index dcab28a0d..9543ae825 100644
--- a/lib/zlib/zutil.c
+++ b/lib/zlib/zutil.c
@@ -61,9 +61,11 @@ uLong ZEXPORT zlibCompileFlags()
#ifdef ZLIB_DEBUG
flags += 1 << 8;
#endif
+ /*
#if defined(ASMV) || defined(ASMINF)
flags += 1 << 9;
#endif
+ */
#ifdef ZLIB_WINAPI
flags += 1 << 10;
#endif
@@ -119,7 +121,7 @@ uLong ZEXPORT zlibCompileFlags()
# endif
int ZLIB_INTERNAL z_verbose = verbose;
-void ZLIB_INTERNAL z_error (m)
+void ZLIB_INTERNAL z_error(m)
char *m;
{
fprintf(stderr, "%s\n", m);
@@ -214,7 +216,7 @@ local ptr_table table[MAX_PTR];
* a protected system like OS/2. Use Microsoft C instead.
*/
-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
{
voidpf buf;
ulg bsize = (ulg)items*size;
@@ -240,7 +242,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
return buf;
}
-void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
{
int n;
@@ -277,13 +279,13 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
# define _hfree hfree
#endif
-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
+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 ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
{
(void)opaque;
_hfree(ptr);
@@ -302,7 +304,7 @@ extern voidp calloc OF((uInt items, uInt size));
extern void free OF((voidpf ptr));
#endif
-voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
+voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
voidpf opaque;
unsigned items;
unsigned size;
@@ -312,7 +314,7 @@ voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
(voidpf)calloc(items, size);
}
-void ZLIB_INTERNAL zcfree (opaque, ptr)
+void ZLIB_INTERNAL zcfree(opaque, ptr)
voidpf opaque;
voidpf ptr;
{
diff --git a/lib/zlib/zutil.h b/lib/zlib/zutil.h
index d9a20ae1b..0bc7f4ecd 100644
--- a/lib/zlib/zutil.h
+++ b/lib/zlib/zutil.h
@@ -193,6 +193,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
(!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));
+ ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
#endif
/* common defaults */
diff --git a/logsrvd/Makefile.in b/logsrvd/Makefile.in
index fba163ace..c9ba8658c 100644
--- a/logsrvd/Makefile.in
+++ b/logsrvd/Makefile.in
@@ -36,6 +36,7 @@ cross_compiling = @CROSS_COMPILING@
CC = @CC@
LIBTOOL = @LIBTOOL@
SHA1SUM = @SHA1SUM@
+GREP = @GREP@
SED = @SED@
# Our install program supports extra flags...
@@ -194,7 +195,7 @@ fuzz_logsrvd_conf_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_logsrvd_conf: fuzz_logsrvd_conf
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -257,7 +258,7 @@ fuzz: run-fuzz_logsrvd_conf
check-fuzzer: $(FUZZ_PROGS)
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -272,7 +273,7 @@ check-fuzzer: $(FUZZ_PROGS)
check: $(TEST_PROGS) check-fuzzer
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
diff --git a/logsrvd/iolog_writer.c b/logsrvd/iolog_writer.c
index 945cf54df..400a68fad 100644
--- a/logsrvd/iolog_writer.c
+++ b/logsrvd/iolog_writer.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -49,22 +54,28 @@
#include "logsrvd.h"
-static inline bool
-has_numval(InfoMessage *info)
-{
- return info->value_case == INFO_MESSAGE__VALUE_NUMVAL;
-}
-
-static inline bool
-has_strval(InfoMessage *info)
+static bool
+type_matches(InfoMessage *info, const char *source,
+ InfoMessage__ValueCase value_case)
{
- return info->value_case == INFO_MESSAGE__VALUE_STRVAL;
-}
+ const void *val = info->u.strval; /* same for strlistval */
+ debug_decl(type_matches, SUDO_DEBUG_UTIL);
-static inline bool
-has_strlistval(InfoMessage *info)
-{
- return info->value_case == INFO_MESSAGE__VALUE_STRLISTVAL;
+ if (info->key == NULL) {
+ sudo_warnx(U_("%s: protocol error: NULL key"), source);
+ debug_return_bool(false);
+ }
+ if (info->value_case != value_case) {
+ sudo_warnx(U_("%s: protocol error: wrong type for %s"),
+ source, info->key);
+ debug_return_bool(false);
+ }
+ if (value_case != INFO_MESSAGE__VALUE_NUMVAL && val == NULL) {
+ sudo_warnx(U_("%s: protocol error: NULL value found in %s"),
+ source, info->key);
+ debug_return_bool(false);
+ }
+ debug_return_bool(true);
}
/*
@@ -154,210 +165,170 @@ evlog_new(TimeSpec *submit_time, InfoMessage **info_msgs, size_t infolen,
switch (key[0]) {
case 'c':
if (strcmp(key, "columns") == 0) {
- if (!has_numval(info)) {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "columns");
- } else if (info->u.numval <= 0 || info->u.numval > INT_MAX) {
- errno = ERANGE;
- sudo_warn(U_("%s: %s"), source, "columns");
- } else {
- evlog->columns = info->u.numval;
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_NUMVAL)) {
+ if (info->u.numval <= 0 || info->u.numval > INT_MAX) {
+ errno = ERANGE;
+ sudo_warn(U_("%s: %s"), source, "columns");
+ } else {
+ evlog->columns = info->u.numval;
+ }
}
continue;
}
if (strcmp(key, "command") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->command = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "command");
}
continue;
}
break;
case 'l':
if (strcmp(key, "lines") == 0) {
- if (!has_numval(info)) {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "lines");
- } else if (info->u.numval <= 0 || info->u.numval > INT_MAX) {
- errno = ERANGE;
- sudo_warn(U_("%s: %s"), source, "lines");
- } else {
- evlog->lines = info->u.numval;
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_NUMVAL)) {
+ if (info->u.numval <= 0 || info->u.numval > INT_MAX) {
+ errno = ERANGE;
+ sudo_warn(U_("%s: %s"), source, "lines");
+ } else {
+ evlog->lines = info->u.numval;
+ }
}
continue;
}
break;
case 'r':
if (strcmp(key, "runargv") == 0) {
- if (has_strlistval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRLISTVAL)) {
evlog->argv = strlist_copy(info->u.strlistval);
if (evlog->argv == NULL)
goto bad;
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "runargv");
}
continue;
}
if (strcmp(key, "runchroot") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->runchroot = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "runchroot");
}
continue;
}
if (strcmp(key, "runcwd") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->runcwd = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "runcwd");
}
continue;
}
if (strcmp(key, "runenv") == 0) {
- if (has_strlistval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRLISTVAL)) {
evlog->envp = strlist_copy(info->u.strlistval);
if (evlog->envp == NULL)
goto bad;
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "runenv");
}
continue;
}
if (strcmp(key, "rungid") == 0) {
- if (!has_numval(info)) {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "rungid");
- } else if (info->u.numval < 0 || info->u.numval > INT_MAX) {
- errno = ERANGE;
- sudo_warn(U_("%s: %s"), source, "rungid");
- } else {
- evlog->rungid = info->u.numval;
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_NUMVAL)) {
+ if (info->u.numval < 0 || info->u.numval > UINT_MAX) {
+ errno = ERANGE;
+ sudo_warn(U_("%s: %s"), source, "rungid");
+ } else {
+ evlog->rungid = info->u.numval;
+ }
}
continue;
}
if (strcmp(key, "rungroup") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->rungroup = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "rungroup");
}
continue;
}
if (strcmp(key, "runuid") == 0) {
- if (!has_numval(info)) {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "runuid");
- } else if (info->u.numval < 0 || info->u.numval > INT_MAX) {
- errno = ERANGE;
- sudo_warn(U_("%s: %s"), source, "runuid");
- } else {
- evlog->runuid = info->u.numval;
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_NUMVAL)) {
+ if (info->u.numval < 0 || info->u.numval > UINT_MAX) {
+ errno = ERANGE;
+ sudo_warn(U_("%s: %s"), source, "runuid");
+ } else {
+ evlog->runuid = info->u.numval;
+ }
}
continue;
}
if (strcmp(key, "runuser") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->runuser = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "runuser");
}
continue;
}
break;
case 's':
if (strcmp(key, "submitcwd") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->cwd = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "submitcwd");
}
continue;
}
if (strcmp(key, "submitgroup") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->submitgroup = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "submitgroup");
}
continue;
}
if (strcmp(key, "submithost") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->submithost = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "submithost");
}
continue;
}
if (strcmp(key, "submituser") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->submituser = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "submituser");
}
continue;
}
break;
case 't':
if (strcmp(key, "ttyname") == 0) {
- if (has_strval(info)) {
+ if (type_matches(info, source, INFO_MESSAGE__VALUE_STRVAL)) {
if ((evlog->ttyname = strdup(info->u.strval)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__,
U_("unable to allocate memory"));
goto bad;
}
- } else {
- sudo_warnx(U_("%s: protocol error: wrong type for %s"),
- source, "ttyname");
}
continue;
}
diff --git a/logsrvd/logsrv_util.c b/logsrvd/logsrv_util.c
index 49c02bed6..f70604d52 100644
--- a/logsrvd/logsrv_util.c
+++ b/logsrvd/logsrv_util.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/types.h>
@@ -64,14 +69,14 @@ expand_buf(struct connection_buffer *buf, unsigned int needed)
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
- if (buf->len - buf->off > 0)
+ if (buf->len != buf->off)
memcpy(newdata, buf->data + buf->off, buf->len - buf->off);
free(buf->data);
buf->data = newdata;
buf->size = needed;
} else {
/* Just reset existing buffer. */
- if (buf->len - buf->off > 0) {
+ if (buf->len != buf->off) {
memmove(buf->data, buf->data + buf->off,
buf->len - buf->off);
}
diff --git a/logsrvd/logsrvd.c b/logsrvd/logsrvd.c
index 4bf739ff5..a09b7b697 100644
--- a/logsrvd/logsrvd.c
+++ b/logsrvd/logsrvd.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -263,7 +268,7 @@ connection_close(struct connection_closure *closure)
/* Connect to the first relay available asynchronously. */
if (!connect_relay(new_closure)) {
- sudo_warnx(U_("unable to connect to relay"));
+ sudo_warnx("%s", U_("unable to connect to relay"));
connection_closure_free(new_closure);
}
}
@@ -311,7 +316,7 @@ get_free_buf(size_t len, struct connection_closure *closure)
debug_return_ptr(buf);
}
-bool
+static bool
fmt_server_message(struct connection_closure *closure, ServerMessage *msg)
{
struct connection_buffer *buf = NULL;
@@ -512,6 +517,12 @@ handle_exit(ExitMessage *msg, uint8_t *buf, size_t len,
debug_return_bool(false);
}
+ /* Check that message is valid. */
+ if (msg->run_time == NULL) {
+ sudo_warnx(U_("%s: %s"), source, U_("invalid ExitMessage"));
+ closure->errstr = _("invalid ExitMessage");
+ debug_return_bool(false);
+ }
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received ExitMessage from %s",
source, __func__);
@@ -559,6 +570,13 @@ handle_restart(RestartMessage *msg, uint8_t *buf, size_t len,
closure->errstr = _("state machine error");
debug_return_bool(false);
}
+
+ /* Check that message is valid. */
+ if (msg->log_id == NULL || msg->resume_point == NULL) {
+ sudo_warnx(U_("%s: %s"), source, U_("invalid RestartMessage"));
+ closure->errstr = _("invalid RestartMessage");
+ debug_return_bool(false);
+ }
sudo_debug_printf(SUDO_DEBUG_INFO,
"%s: received RestartMessage for %s from %s", __func__, msg->log_id,
source);
@@ -637,6 +655,12 @@ handle_iobuf(int iofd, IoBuffer *iobuf, uint8_t *buf, size_t len,
debug_return_bool(false);
}
+ /* Check that message is valid. */
+ if (iobuf->delay == NULL) {
+ sudo_warnx(U_("%s: %s"), source, U_("invalid IoBuffer"));
+ closure->errstr = _("invalid IoBuffer");
+ debug_return_bool(false);
+ }
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received IoBuffer from %s",
source, __func__);
@@ -667,6 +691,12 @@ handle_winsize(ChangeWindowSize *msg, uint8_t *buf, size_t len,
debug_return_bool(false);
}
+ /* Check that message is valid. */
+ if (msg->delay == NULL) {
+ sudo_warnx(U_("%s: %s"), source, U_("invalid ChangeWindowSize"));
+ closure->errstr = _("invalid ChangeWindowSize");
+ debug_return_bool(false);
+ }
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received ChangeWindowSize from %s",
source, __func__);
@@ -697,6 +727,12 @@ handle_suspend(CommandSuspend *msg, uint8_t *buf, size_t len,
debug_return_bool(false);
}
+ /* Check that message is valid. */
+ if (msg->delay == NULL || msg->signal == NULL) {
+ sudo_warnx(U_("%s: %s"), source, U_("invalid CommandSuspend"));
+ closure->errstr = _("invalid CommandSuspend");
+ debug_return_bool(false);
+ }
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received CommandSuspend from %s",
source, __func__);
@@ -725,7 +761,7 @@ handle_client_hello(ClientHello *msg, uint8_t *buf, size_t len,
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received ClientHello",
__func__);
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: client ID %s",
- __func__, msg->client_id);
+ __func__, msg->client_id ? msg->client_id : "unknown");
debug_return_bool(true);
}
@@ -1543,12 +1579,12 @@ register_listener(struct server_address *addr, struct sudo_event_base *evbase)
/* TODO: make non-fatal */
if ((l = malloc(sizeof(*l))) == NULL)
- sudo_fatal(NULL);
+ sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
l->sock = sock;
l->tls = addr->tls;
l->ev = sudo_ev_alloc(sock, SUDO_EV_READ|SUDO_EV_PERSIST, listener_cb, l);
if (l->ev == NULL)
- sudo_fatal(NULL);
+ sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
if (sudo_ev_add(evbase, l->ev, NULL, false) == -1)
sudo_fatal("%s", U_("unable to add event to queue"));
TAILQ_INSERT_TAIL(&listeners, l, entries);
@@ -1732,7 +1768,7 @@ register_signal(int signo, struct sudo_event_base *base)
ev = sudo_ev_alloc(signo, SUDO_EV_SIGNAL, signal_cb, base);
if (ev == NULL)
- sudo_fatal(NULL);
+ sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
if (sudo_ev_add(base, ev, NULL, false) == -1)
sudo_fatal("%s", U_("unable to add event to queue"));
@@ -1754,8 +1790,7 @@ static void
write_pidfile(void)
{
FILE *fp;
- int fd;
- bool success;
+ int dfd, fd;
mode_t oldmask;
const char *pid_file = logsrvd_conf_pid_file();
debug_decl(write_pidfile, SUDO_DEBUG_UTIL);
@@ -1766,10 +1801,11 @@ write_pidfile(void)
/* Default logsrvd umask is more restrictive (077). */
oldmask = umask(S_IWGRP|S_IWOTH);
- success = sudo_mkdir_parents(pid_file, ROOT_UID, ROOT_GID,
+ dfd = sudo_open_parent_dir(pid_file, ROOT_UID, ROOT_GID,
S_IRWXU|S_IXGRP|S_IXOTH, false);
- if (success) {
- fd = open(pid_file, O_WRONLY|O_CREAT|O_NOFOLLOW, 0644);
+ if (dfd != -1) {
+ const char *base = sudo_basename(pid_file);
+ fd = openat(dfd, base, O_WRONLY|O_CREAT|O_NOFOLLOW, 0644);
if (fd == -1 || (fp = fdopen(fd, "w")) == NULL) {
sudo_warn("%s", pid_file);
if (fd != -1)
@@ -1781,6 +1817,7 @@ write_pidfile(void)
sudo_warn("%s", pid_file);
fclose(fp);
}
+ close(dfd);
}
umask(oldmask);
@@ -1948,7 +1985,7 @@ main(int argc, char *argv[])
exit(EXIT_FAILURE);
if ((evbase = sudo_ev_base_alloc()) == NULL)
- sudo_fatal(NULL);
+ sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
/* Initialize listeners. */
if (!server_setup(evbase))
diff --git a/logsrvd/logsrvd.h b/logsrvd/logsrvd.h
index 2565e999a..4d371f31f 100644
--- a/logsrvd/logsrvd.h
+++ b/logsrvd/logsrvd.h
@@ -24,7 +24,7 @@
# error protobuf-c version 1.30 or higher required
#endif
-#include "config.h"
+#include <config.h>
#if defined(HAVE_OPENSSL)
# if defined(HAVE_WOLFSSL)
diff --git a/logsrvd/logsrvd_conf.c b/logsrvd/logsrvd_conf.c
index 322cdf34d..39bfa873b 100644
--- a/logsrvd/logsrvd_conf.c
+++ b/logsrvd/logsrvd_conf.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -88,13 +93,13 @@ struct logsrvd_config;
typedef bool (*logsrvd_conf_cb_t)(struct logsrvd_config *, const char *, size_t);
struct logsrvd_config_entry {
- char *conf_str;
+ const char *conf_str;
logsrvd_conf_cb_t setter;
size_t offset;
};
struct logsrvd_config_section {
- char *name;
+ const char *name;
struct logsrvd_config_entry *entries;
};
@@ -349,7 +354,7 @@ cb_iolog_dir(struct logsrvd_config *config, const char *path, size_t offset)
free(config->iolog.iolog_dir);
if ((config->iolog.iolog_dir = strdup(path)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -362,7 +367,7 @@ cb_iolog_file(struct logsrvd_config *config, const char *path, size_t offset)
free(config->iolog.iolog_file);
if ((config->iolog.iolog_file = strdup(path)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -503,7 +508,7 @@ append_address(struct server_address_list *addresses, const char *str,
debug_decl(append_address, SUDO_DEBUG_UTIL);
if ((copy = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
@@ -526,11 +531,11 @@ append_address(struct server_address_list *addresses, const char *str,
/* Only make a single copy of the string + host for all addresses. */
if ((sa_str = sudo_rcstr_dup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done;
}
if (host != NULL && (sa_host = sudo_rcstr_dup(host)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done;
}
@@ -548,7 +553,7 @@ append_address(struct server_address_list *addresses, const char *str,
struct server_address *addr;
if ((addr = malloc(sizeof(*addr))) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done;
}
addr->sa_str = sudo_rcstr_addref(sa_str);
@@ -618,7 +623,7 @@ cb_server_pid_file(struct logsrvd_config *config, const char *str, size_t offset
debug_return_bool(false);
}
if ((copy = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
}
@@ -641,7 +646,8 @@ cb_server_log(struct logsrvd_config *config, const char *str, size_t offset)
if (*str == '/') {
log_type = SERVER_LOG_FILE;
if ((copy = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__,
+ U_("unable to allocate memory"));
debug_return_bool(false);
}
} else if (strcmp(str, "stderr") == 0) {
@@ -669,7 +675,7 @@ cb_tls_key(struct logsrvd_config *config, const char *path, size_t offset)
free(*p);
if ((*p = strdup(path)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -683,7 +689,7 @@ cb_tls_cacert(struct logsrvd_config *config, const char *path, size_t offset)
free(*p);
if ((*p = strdup(path)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -697,7 +703,7 @@ cb_tls_cert(struct logsrvd_config *config, const char *path, size_t offset)
free(*p);
if ((*p = strdup(path)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -711,7 +717,7 @@ cb_tls_dhparams(struct logsrvd_config *config, const char *path, size_t offset)
free(*p);
if ((*p = strdup(path)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -725,7 +731,7 @@ cb_tls_ciphers12(struct logsrvd_config *config, const char *str, size_t offset)
free(*p);
if ((*p = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -739,7 +745,7 @@ cb_tls_ciphers13(struct logsrvd_config *config, const char *str, size_t offset)
free(*p);
if ((*p = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
debug_return_bool(true);
@@ -820,7 +826,7 @@ cb_relay_dir(struct logsrvd_config *config, const char *str, size_t offset)
debug_decl(cb_relay_dir, SUDO_DEBUG_UTIL);
if ((copy = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
@@ -1023,12 +1029,11 @@ cb_logfile_path(struct logsrvd_config *config, const char *str, size_t offset)
debug_decl(cb_logfile_path, SUDO_DEBUG_UTIL);
if (*str != '/') {
- debug_return_bool(false);
sudo_warnx(U_("%s: not a fully qualified path"), str);
debug_return_bool(false);
}
if ((copy = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
@@ -1045,7 +1050,7 @@ cb_logfile_time_format(struct logsrvd_config *config, const char *str, size_t of
debug_decl(cb_logfile_time_format, SUDO_DEBUG_UTIL);
if ((copy = strdup(str)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_bool(false);
}
@@ -1587,7 +1592,7 @@ logsrvd_conf_alloc(void)
debug_decl(logsrvd_conf_alloc, SUDO_DEBUG_UTIL);
if ((config = calloc(1, sizeof(*config))) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return_ptr(NULL);
}
@@ -1613,7 +1618,7 @@ logsrvd_conf_alloc(void)
config->server.log_type = SERVER_LOG_SYSLOG;
config->server.pid_file = strdup(_PATH_SUDO_LOGSRVD_PID);
if (config->server.pid_file == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto bad;
}
@@ -1625,20 +1630,20 @@ logsrvd_conf_alloc(void)
if (access(DEFAULT_CA_CERT_PATH, R_OK) == 0) {
config->server.tls_cacert_path = strdup(DEFAULT_CA_CERT_PATH);
if (config->server.tls_cacert_path == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto bad;
}
}
if (access(DEFAULT_SERVER_CERT_PATH, R_OK) == 0) {
config->server.tls_cert_path = strdup(DEFAULT_SERVER_CERT_PATH);
if (config->server.tls_cert_path == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto bad;
}
}
config->server.tls_key_path = strdup(DEFAULT_SERVER_KEY_PATH);
if (config->server.tls_key_path == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto bad;
}
config->server.tls_verify = true;
@@ -1734,7 +1739,8 @@ logsrvd_conf_apply(struct logsrvd_config *config)
config->server.tls_cert_path =
strdup(DEFAULT_SERVER_CERT_PATH);
if (config->server.tls_cert_path == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__,
+ U_("unable to allocate memory"));
debug_return_bool(false);
}
}
@@ -1754,7 +1760,7 @@ logsrvd_conf_apply(struct logsrvd_config *config)
config->server.tls_ciphers_v12, config->server.tls_ciphers_v13,
config->server.tls_verify);
if (config->server.ssl_ctx == NULL) {
- sudo_warnx(U_("unable to initialize server TLS context"));
+ sudo_warnx("%s", U_("unable to initialize server TLS context"));
debug_return_bool(false);
}
break;
@@ -1774,7 +1780,7 @@ logsrvd_conf_apply(struct logsrvd_config *config)
TLS_RELAY_STR(config, tls_ciphers_v13),
TLS_RELAY_INT(config, tls_verify));
if (config->relay.ssl_ctx == NULL) {
- sudo_warnx(U_("unable to initialize relay TLS context"));
+ sudo_warnx("%s", U_("unable to initialize relay TLS context"));
debug_return_bool(false);
}
break;
diff --git a/logsrvd/logsrvd_journal.c b/logsrvd/logsrvd_journal.c
index 664f1ae9a..831610cfa 100644
--- a/logsrvd/logsrvd_journal.c
+++ b/logsrvd/logsrvd_journal.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -84,8 +89,9 @@ journal_fdopen(int fd, const char *journal_path,
static int
journal_mkstemp(const char *parent_dir, char *pathbuf, int pathlen)
{
- int len, fd = -1;
+ int len, dfd = -1, fd = -1;
mode_t dirmode, oldmask;
+ char *template;
debug_decl(journal_mkstemp, SUDO_DEBUG_UTIL);
/* umask must not be more restrictive than the file modes. */
@@ -104,19 +110,23 @@ journal_mkstemp(const char *parent_dir, char *pathbuf, int pathlen)
RELAY_TEMPLATE);
goto done;
}
- if (!sudo_mkdir_parents(pathbuf, logsrvd_conf_iolog_uid(),
- logsrvd_conf_iolog_gid(), S_IRWXU|S_IXGRP|S_IXOTH, false)) {
+ dfd = sudo_open_parent_dir(pathbuf, logsrvd_conf_iolog_uid(),
+ logsrvd_conf_iolog_gid(), S_IRWXU|S_IXGRP|S_IXOTH, false);
+ if (dfd == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
"unable to create parent dir for %s", pathbuf);
goto done;
}
- if ((fd = mkstemp(pathbuf)) == -1) {
+ template = pathbuf + (len - strlen(RELAY_TEMPLATE));
+ if ((fd = mkostempsat(dfd, template, 0, 0)) == -1) {
sudo_warn(U_("%s: %s"), "mkstemp", pathbuf);
goto done;
}
done:
umask(oldmask);
+ if (dfd != -1)
+ close(dfd);
debug_return_int(fd);
}
diff --git a/logsrvd/logsrvd_local.c b/logsrvd/logsrvd_local.c
index 5119d2ef9..4d1f9d7dd 100644
--- a/logsrvd/logsrvd_local.c
+++ b/logsrvd/logsrvd_local.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -82,7 +87,7 @@ set_random_drop(const char *dropstr)
}
static bool
-logsrvd_json_log_cb(struct json_container *json, void *v)
+logsrvd_json_log_cb(struct json_container *jsonc, void *v)
{
struct logsrvd_info_closure *closure = v;
struct json_value json_value;
@@ -96,35 +101,71 @@ logsrvd_json_log_cb(struct json_container *json, void *v)
case INFO_MESSAGE__VALUE_NUMVAL:
json_value.type = JSON_NUMBER;
json_value.u.number = info->u.numval;
- if (!sudo_json_add_value(json, info->key, &json_value))
+ if (!sudo_json_add_value(jsonc, info->key, &json_value))
goto bad;
break;
case INFO_MESSAGE__VALUE_STRVAL:
+ if (info->u.strval == NULL) {
+ sudo_warnx(U_("%s: protocol error: NULL value found in %s"),
+ "local", info->key);
+ break;
+ }
json_value.type = JSON_STRING;
json_value.u.string = info->u.strval;
- if (!sudo_json_add_value(json, info->key, &json_value))
+ if (!sudo_json_add_value(jsonc, info->key, &json_value))
goto bad;
break;
case INFO_MESSAGE__VALUE_STRLISTVAL: {
InfoMessage__StringList *strlist = info->u.strlistval;
size_t n;
- if (!sudo_json_open_array(json, info->key))
+ if (strlist == NULL) {
+ sudo_warnx(U_("%s: protocol error: NULL value found in %s"),
+ "local", info->key);
+ break;
+ }
+ if (!sudo_json_open_array(jsonc, info->key))
goto bad;
for (n = 0; n < strlist->n_strings; n++) {
+ if (strlist->strings[n] == NULL) {
+ sudo_warnx(U_("%s: protocol error: NULL value found in %s"),
+ "local", info->key);
+ break;
+ }
json_value.type = JSON_STRING;
json_value.u.string = strlist->strings[n];
- if (!sudo_json_add_value(json, NULL, &json_value))
+ if (!sudo_json_add_value(jsonc, NULL, &json_value))
+ goto bad;
+ }
+ if (!sudo_json_close_array(jsonc))
+ goto bad;
+ break;
+ }
+ case INFO_MESSAGE__VALUE_NUMLISTVAL: {
+ InfoMessage__NumberList *numlist = info->u.numlistval;
+ size_t n;
+
+ if (numlist == NULL) {
+ sudo_warnx(U_("%s: protocol error: NULL value found in %s"),
+ "local", info->key);
+ break;
+ }
+ if (!sudo_json_open_array(jsonc, info->key))
+ goto bad;
+ for (n = 0; n < numlist->n_numbers; n++) {
+ json_value.type = JSON_NUMBER;
+ json_value.u.number = numlist->numbers[n];
+ if (!sudo_json_add_value(jsonc, NULL, &json_value))
goto bad;
}
- if (!sudo_json_close_array(json))
+ if (!sudo_json_close_array(jsonc))
goto bad;
break;
}
default:
- sudo_warnx(U_("unexpected type_case value %d in %s from %s"),
+ sudo_warnx(U_("unexpected value_case %d in %s from %s"),
info->value_case, "InfoMessage", "local");
- goto bad;
+ break;
}
}
debug_return_bool(true);
@@ -263,7 +304,7 @@ done:
static bool
store_exit_info_json(int dfd, struct eventlog *evlog)
{
- struct json_container json = { 0 };
+ struct json_container jsonc = { 0 };
struct json_value json_value;
struct iovec iov[3];
bool ret = false;
@@ -271,7 +312,7 @@ store_exit_info_json(int dfd, struct eventlog *evlog)
off_t pos;
debug_decl(store_exit_info_json, SUDO_DEBUG_UTIL);
- if (!sudo_json_init(&json, 4, false, false))
+ if (!sudo_json_init(&jsonc, 4, false, false))
goto done;
fd = iolog_openat(dfd, "log.json", O_RDWR);
@@ -286,38 +327,38 @@ store_exit_info_json(int dfd, struct eventlog *evlog)
}
if (sudo_timespecisset(&evlog->run_time)) {
- if (!sudo_json_open_object(&json, "run_time"))
+ if (!sudo_json_open_object(&jsonc, "run_time"))
goto done;
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->run_time.tv_sec;
- if (!sudo_json_add_value(&json, "seconds", &json_value))
+ if (!sudo_json_add_value(&jsonc, "seconds", &json_value))
goto done;
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->run_time.tv_nsec;
- if (!sudo_json_add_value(&json, "nanoseconds", &json_value))
+ if (!sudo_json_add_value(&jsonc, "nanoseconds", &json_value))
goto done;
- if (!sudo_json_close_object(&json))
+ if (!sudo_json_close_object(&jsonc))
goto done;
}
if (evlog->signal_name != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = evlog->signal_name;
- if (!sudo_json_add_value(&json, "signal", &json_value))
+ if (!sudo_json_add_value(&jsonc, "signal", &json_value))
goto done;
json_value.type = JSON_BOOL;
json_value.u.boolean = evlog->dumped_core;
- if (!sudo_json_add_value(&json, "dumped_core", &json_value))
+ if (!sudo_json_add_value(&jsonc, "dumped_core", &json_value))
goto done;
}
json_value.type = JSON_NUMBER;
json_value.u.number = evlog->exit_value;
- if (!sudo_json_add_value(&json, "exit_value", &json_value))
+ if (!sudo_json_add_value(&jsonc, "exit_value", &json_value))
goto done;
/* Back up to overwrite the final "\n}\n" */
@@ -329,11 +370,11 @@ store_exit_info_json(int dfd, struct eventlog *evlog)
}
/* Append the exit data and close the object. */
- iov[0].iov_base = ",";
+ iov[0].iov_base = (char *)",";
iov[0].iov_len = 1;
- iov[1].iov_base = sudo_json_get_buf(&json);
- iov[1].iov_len = sudo_json_get_len(&json);
- iov[2].iov_base = "\n}\n";
+ iov[1].iov_base = sudo_json_get_buf(&jsonc);
+ iov[1].iov_len = sudo_json_get_len(&jsonc);
+ iov[2].iov_base = (char *)"\n}\n";
iov[2].iov_len = 3;
if (writev(fd, iov, 3) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
@@ -350,7 +391,7 @@ store_exit_info_json(int dfd, struct eventlog *evlog)
done:
if (fd != -1)
close(fd);
- sudo_json_free(&json);
+ sudo_json_free(&jsonc);
debug_return_bool(ret);
}
diff --git a/logsrvd/logsrvd_queue.c b/logsrvd/logsrvd_queue.c
index ba013d5a2..f164e8256 100644
--- a/logsrvd/logsrvd_queue.c
+++ b/logsrvd/logsrvd_queue.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -127,7 +132,7 @@ outgoing_queue_cb(int unused, int what, void *v)
success = connect_relay(closure);
if (!success) {
- sudo_warnx(U_("unable to connect to relay"));
+ sudo_warnx("%s", U_("unable to connect to relay"));
connection_close(closure);
}
break;
diff --git a/logsrvd/logsrvd_relay.c b/logsrvd/logsrvd_relay.c
index 6937ed82c..dc192888c 100644
--- a/logsrvd/logsrvd_relay.c
+++ b/logsrvd/logsrvd_relay.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -234,7 +239,7 @@ fmt_client_hello(struct connection_closure *closure)
debug_decl(fmt_client_hello, SUDO_DEBUG_UTIL);
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: sending ClientHello", __func__);
- hello_msg.client_id = "Sudo Logsrvd " PACKAGE_VERSION;
+ hello_msg.client_id = (char *)"Sudo Logsrvd " PACKAGE_VERSION;
client_msg.u.hello_msg = &hello_msg;
client_msg.type_case = CLIENT_MESSAGE__TYPE_HELLO_MSG;
@@ -295,7 +300,7 @@ bad:
* Returns 0 on success, -1 on error, setting errno.
* If there is no next relay, errno is set to ENOENT.
*/
-int
+static int
connect_relay_next(struct connection_closure *closure)
{
struct relay_closure *relay_closure = closure->relay_closure;
diff --git a/logsrvd/regress/fuzz/fuzz_logsrvd_conf.c b/logsrvd/regress/fuzz/fuzz_logsrvd_conf.c
index d90fa53c1..1964d443b 100644
--- a/logsrvd/regress/fuzz/fuzz_logsrvd_conf.c
+++ b/logsrvd/regress/fuzz/fuzz_logsrvd_conf.c
@@ -44,6 +44,8 @@
#include "logsrvd.h"
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
/*
* Stub version that always succeeds for small inputs and fails for large.
* We want to fuzz our parser, not libc's regular expression code.
diff --git a/logsrvd/regress/logsrvd_conf/logsrvd_conf_test.c b/logsrvd/regress/logsrvd_conf/logsrvd_conf_test.c
index 773536679..84e66edb6 100644
--- a/logsrvd/regress/logsrvd_conf/logsrvd_conf_test.c
+++ b/logsrvd/regress/logsrvd_conf/logsrvd_conf_test.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "sudo_compat.h"
#include "sudo_util.h"
diff --git a/logsrvd/sendlog.c b/logsrvd/sendlog.c
index 50d7f59c1..98d5ecc10 100644
--- a/logsrvd/sendlog.c
+++ b/logsrvd/sendlog.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -232,7 +237,7 @@ connect_server(struct peer_info *server, const char *port)
/*
* Get a buffer from the free list if possible, else allocate a new one.
*/
-struct connection_buffer *
+static struct connection_buffer *
get_free_buf(size_t len, struct client_closure *closure)
{
struct connection_buffer *buf;
@@ -283,7 +288,7 @@ read_io_buf(struct client_closure *closure)
free(closure->buf);
closure->bufsize = sudo_pow2_roundup(timing->u.nbytes);
if ((closure->buf = malloc(closure->bufsize)) == NULL) {
- sudo_warn(NULL);
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
timing->u.nbytes = 0;
debug_return_bool(false);
}
@@ -355,7 +360,7 @@ fmt_client_hello(struct client_closure *closure)
debug_decl(fmt_client_hello, SUDO_DEBUG_UTIL);
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: sending ClientHello", __func__);
- hello_msg.client_id = "Sudo Sendlog " PACKAGE_VERSION;
+ hello_msg.client_id = (char *)"Sudo Sendlog " PACKAGE_VERSION;
/* Schedule ClientMessage */
client_msg.u.hello_msg = &hello_msg;
@@ -549,82 +554,52 @@ fmt_info_messages(const struct eventlog *evlog, char *hostname,
info_message__init(info_msgs[n]);
}
+#define fill_str(_n, _v) do { \
+ info_msgs[n]->key = (char *)(_n); \
+ info_msgs[n]->u.strval = (_v); \
+ info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; \
+ n++; \
+} while (0)
+
+#define fill_strlist(_n, _v) do { \
+ info_msgs[n]->key = (char *)(_n); \
+ info_msgs[n]->u.strlistval = (_v); \
+ info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL; \
+ n++; \
+} while (0)
+
+#define fill_num(_n, _v) do { \
+ info_msgs[n]->key = (char *)(_n); \
+ info_msgs[n]->u.numval = (_v); \
+ info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL; \
+ n++; \
+} while (0)
+
/* Fill in info_msgs */
n = 0;
- info_msgs[n]->key = "command";
- info_msgs[n]->u.strval = evlog->command;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
- info_msgs[n]->key = "columns";
- info_msgs[n]->u.numval = evlog->columns;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
-
- info_msgs[n]->key = "lines";
- info_msgs[n]->u.numval = evlog->lines;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
-
- info_msgs[n]->key = "runargv";
- info_msgs[n]->u.strlistval = runargv;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL;
+ fill_num("columns", evlog->columns);
+ fill_str("command", evlog->command);
+ fill_num("lines", evlog->lines);
+ fill_strlist("runargv", runargv);
runargv = NULL;
- n++;
-
if (runenv != NULL) {
- info_msgs[n]->key = "runenv";
- info_msgs[n]->u.strlistval = runenv;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL;
+ fill_strlist("runenv", runenv);
runenv = NULL;
- n++;
}
-
if (evlog->rungid != (gid_t)-1) {
- info_msgs[n]->key = "rungid";
- info_msgs[n]->u.numval = evlog->rungid;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
+ fill_num("rungid", evlog->rungid);
}
-
if (evlog->rungroup != NULL) {
- info_msgs[n]->key = "rungroup";
- info_msgs[n]->u.strval = evlog->rungroup;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
+ fill_str("rungroup", evlog->rungroup);
}
-
if (evlog->runuid != (uid_t)-1) {
- info_msgs[n]->key = "runuid";
- info_msgs[n]->u.numval = evlog->runuid;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
+ fill_num("runuid", evlog->runuid);
}
-
- info_msgs[n]->key = "runuser";
- info_msgs[n]->u.strval = evlog->runuser;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
- info_msgs[n]->key = "submitcwd";
- info_msgs[n]->u.strval = evlog->cwd;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
- info_msgs[n]->key = "submithost";
- info_msgs[n]->u.strval = hostname;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
- info_msgs[n]->key = "submituser";
- info_msgs[n]->u.strval = evlog->submituser;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
- info_msgs[n]->key = "ttyname";
- info_msgs[n]->u.strval = evlog->ttyname;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
+ fill_str("runuser", evlog->runuser);
+ fill_str("submitcwd", evlog->cwd);
+ fill_str("submithost", hostname);
+ fill_str("submituser", evlog->submituser);
+ fill_str("ttyname", evlog->ttyname);
/* Update n_info_msgs. */
*n_info_msgs = n;
@@ -1823,7 +1798,7 @@ main(int argc, char *argv[])
goto bad;
if ((evbase = sudo_ev_base_alloc()) == NULL)
- sudo_fatal(NULL);
+ sudo_fatal(U_("%s: %s"), __func__, U_("unable to allocate memory"));
if (testrun)
printf("connecting clients...\n");
diff --git a/logsrvd/sendlog.h b/logsrvd/sendlog.h
index 49d6f6273..74014efd9 100644
--- a/logsrvd/sendlog.h
+++ b/logsrvd/sendlog.h
@@ -24,7 +24,7 @@
# error protobuf-c version 1.30 or higher required
#endif
-#include "config.h"
+#include <config.h>
#if defined(HAVE_OPENSSL)
# if defined(HAVE_WOLFSSL)
diff --git a/logsrvd/tls_client.c b/logsrvd/tls_client.c
index 9be07fd2a..dde6a6009 100644
--- a/logsrvd/tls_client.c
+++ b/logsrvd/tls_client.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#include <errno.h>
#ifdef HAVE_STDBOOL_H
@@ -230,7 +235,7 @@ tls_client_setup(int sock, const char *ca_bundle_file, const char *cert_file,
ssl_ctx = init_tls_context(ca_bundle_file, cert_file, key_file,
dhparam_file, ciphers_v12, ciphers_v13, verify_server);
if (ssl_ctx == NULL) {
- sudo_warnx(U_("unable to initialize TLS context"));
+ sudo_warnx("%s", U_("unable to initialize TLS context"));
debug_return_bool(false);
}
diff --git a/logsrvd/tls_common.h b/logsrvd/tls_common.h
index 2524037b9..505801c3e 100644
--- a/logsrvd/tls_common.h
+++ b/logsrvd/tls_common.h
@@ -19,7 +19,7 @@
#ifndef SUDO_TLS_COMMON_H
#define SUDO_TLS_COMMON_H
-#include "config.h"
+#include <config.h>
#if defined(HAVE_OPENSSL)
# if defined(HAVE_WOLFSSL)
diff --git a/logsrvd/tls_init.c b/logsrvd/tls_init.c
index 6a24fcc83..65cc8daa2 100644
--- a/logsrvd/tls_init.c
+++ b/logsrvd/tls_init.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
diff --git a/plugins/audit_json/Makefile.in b/plugins/audit_json/Makefile.in
index 2ec476bcc..199a60d97 100644
--- a/plugins/audit_json/Makefile.in
+++ b/plugins/audit_json/Makefile.in
@@ -191,8 +191,8 @@ check: check-fuzzer
check-verbose: check
clean:
- -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a *.i *.plog \
- stamp-* core *.core core.*
+ -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a
+ -rm -f *.i *.plog stamp-* core *.core core.*
mostlyclean: clean
diff --git a/plugins/audit_json/audit_json.c b/plugins/audit_json/audit_json.c
index c6c1f73f8..b419ca386 100644
--- a/plugins/audit_json/audit_json.c
+++ b/plugins/audit_json/audit_json.c
@@ -68,7 +68,7 @@ static struct audit_state {
} state = { -1 };
/* Filter out entries in settings[] that are not really options. */
-char * const settings_filter[] = {
+const char * const settings_filter[] = {
"debug_flags",
"max_groups",
"network_addrs",
@@ -189,7 +189,7 @@ done:
}
static bool
-add_key_value(struct json_container *json, const char *str)
+add_key_value(struct json_container *jsonc, const char *str)
{
struct json_value json_value;
const char *cp, *errstr;
@@ -256,35 +256,35 @@ add_key_value(struct json_container *json, const char *str)
json_value.u.string = cp;
}
- debug_return_bool(sudo_json_add_value(json, name, &json_value));
+ debug_return_bool(sudo_json_add_value(jsonc, name, &json_value));
}
static bool
-add_array(struct json_container *json, const char *name, char * const * array)
+add_array(struct json_container *jsonc, const char *name, char * const * array)
{
const char *cp;
struct json_value json_value;
debug_decl(add_array, SUDO_DEBUG_PLUGIN);
- if (!sudo_json_open_array(json, name))
+ if (!sudo_json_open_array(jsonc, name))
debug_return_bool(false);
while ((cp = *array) != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = cp;
- if (!sudo_json_add_value(json, name, &json_value))
+ if (!sudo_json_add_value(jsonc, name, &json_value))
debug_return_bool(false);
array++;
}
- if (!sudo_json_close_array(json))
+ if (!sudo_json_close_array(jsonc))
debug_return_bool(false);
debug_return_bool(true);
}
static bool
-filter_key_value(const char *kv, char * const * filter)
+filter_key_value(const char *kv, const char * const * filter)
{
- char * const *cur;
+ const char * const *cur;
const char *cp;
size_t namelen;
@@ -299,8 +299,8 @@ filter_key_value(const char *kv, char * const * filter)
}
static bool
-add_key_value_object(struct json_container *json, const char *name,
- char * const * array, char * const * filter)
+add_key_value_object(struct json_container *jsonc, const char *name,
+ char * const * array, const char * const * filter)
{
char * const *cur;
const char *cp;
@@ -318,15 +318,15 @@ add_key_value_object(struct json_container *json, const char *name,
}
}
if (!empty) {
- if (!sudo_json_open_object(json, name))
+ if (!sudo_json_open_object(jsonc, name))
goto bad;
for (cur = array; (cp = *cur) != NULL; cur++) {
if (filter_key_value(cp, filter))
continue;
- if (!add_key_value(json, cp))
+ if (!add_key_value(jsonc, cp))
goto bad;
}
- if (!sudo_json_close_object(json))
+ if (!sudo_json_close_object(jsonc))
goto bad;
}
@@ -336,7 +336,7 @@ bad:
}
static bool
-add_timestamp(struct json_container *json, struct timespec *ts)
+add_timestamp(struct json_container *jsonc, struct timespec *ts)
{
struct json_value json_value;
time_t secs = ts->tv_sec;
@@ -348,22 +348,22 @@ add_timestamp(struct json_container *json, struct timespec *ts)
if (gmtime_r(&secs, &gmt) == NULL)
debug_return_bool(false);
- sudo_json_open_object(json, "timestamp");
+ sudo_json_open_object(jsonc, "timestamp");
json_value.type = JSON_NUMBER;
json_value.u.number = ts->tv_sec;
- sudo_json_add_value(json, "seconds", &json_value);
+ sudo_json_add_value(jsonc, "seconds", &json_value);
json_value.type = JSON_NUMBER;
json_value.u.number = ts->tv_nsec;
- sudo_json_add_value(json, "nanoseconds", &json_value);
+ sudo_json_add_value(jsonc, "nanoseconds", &json_value);
timebuf[sizeof(timebuf) - 1] = '\0';
len = strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", &gmt);
if (len != 0 && timebuf[sizeof(timebuf) - 1] == '\0'){
json_value.type = JSON_STRING;
json_value.u.string = timebuf;
- sudo_json_add_value(json, "iso8601", &json_value);
+ sudo_json_add_value(jsonc, "iso8601", &json_value);
}
timebuf[sizeof(timebuf) - 1] = '\0';
@@ -371,16 +371,16 @@ add_timestamp(struct json_container *json, struct timespec *ts)
if (len != 0 && timebuf[sizeof(timebuf) - 1] == '\0'){
json_value.type = JSON_STRING;
json_value.u.string = timebuf;
- sudo_json_add_value(json, "localtime", &json_value);
+ sudo_json_add_value(jsonc, "localtime", &json_value);
}
- sudo_json_close_object(json);
+ sudo_json_close_object(jsonc);
debug_return_bool(true);
}
static int
-audit_write_json(struct json_container *json)
+audit_write_json(struct json_container *jsonc)
{
struct stat sb;
int ret = -1;
@@ -410,7 +410,7 @@ audit_write_json(struct json_container *json)
goto done;
}
- fputs(sudo_json_get_buf(json), state.log_fp);
+ fputs(sudo_json_get_buf(jsonc), state.log_fp);
fputs("\n}\n", state.log_fp);
fflush(state.log_fp);
(void)sudo_lock_file(fileno(state.log_fp), SUDO_UNLOCK);
@@ -426,7 +426,7 @@ done:
static int
audit_write_exit_record(int exit_status, int error)
{
- struct json_container json;
+ struct json_container jsonc;
struct json_value json_value;
struct timespec now;
int ret = -1;
@@ -437,33 +437,33 @@ audit_write_exit_record(int exit_status, int error)
goto done;
}
- if (!sudo_json_init(&json, 4, false, false))
+ if (!sudo_json_init(&jsonc, 4, false, false))
goto oom;
- if (!sudo_json_open_object(&json, "exit"))
+ if (!sudo_json_open_object(&jsonc, "exit"))
goto oom;
/* Write UUID */
json_value.type = JSON_STRING;
json_value.u.string = state.uuid_str;
- if (!sudo_json_add_value(&json, "uuid", &json_value))
+ if (!sudo_json_add_value(&jsonc, "uuid", &json_value))
goto oom;
/* Write time stamp */
- if (!add_timestamp(&json, &now))
+ if (!add_timestamp(&jsonc, &now))
goto oom;
if (error != 0) {
/* Error executing command */
json_value.type = JSON_STRING;
json_value.u.string = strerror(error);
- if (!sudo_json_add_value(&json, "error", &json_value))
+ if (!sudo_json_add_value(&jsonc, "error", &json_value))
goto oom;
} else {
if (WIFEXITED(exit_status)) {
/* Command exited normally. */
json_value.type = JSON_NUMBER;
json_value.u.number = WEXITSTATUS(exit_status);
- if (!sudo_json_add_value(&json, "exit_value", &json_value))
+ if (!sudo_json_add_value(&jsonc, "exit_value", &json_value))
goto oom;
} else if (WIFSIGNALED(exit_status)) {
/* Command killed by signal. */
@@ -472,37 +472,37 @@ audit_write_exit_record(int exit_status, int error)
if (signo <= 0 || sig2str(signo, signame) == -1) {
json_value.type = JSON_NUMBER;
json_value.u.number = signo;
- if (!sudo_json_add_value(&json, "signal", &json_value))
+ if (!sudo_json_add_value(&jsonc, "signal", &json_value))
goto oom;
} else {
json_value.type = JSON_STRING;
json_value.u.string = signame; // -V507
- if (!sudo_json_add_value(&json, "signal", &json_value))
+ if (!sudo_json_add_value(&jsonc, "signal", &json_value))
goto oom;
}
/* Core dump? */
json_value.type = JSON_BOOL;
json_value.u.boolean = WCOREDUMP(exit_status);
- if (!sudo_json_add_value(&json, "dumped_core", &json_value))
+ if (!sudo_json_add_value(&jsonc, "dumped_core", &json_value))
goto oom;
/* Exit value */
json_value.type = JSON_NUMBER;
json_value.u.number = WTERMSIG(exit_status) | 128;
- if (!sudo_json_add_value(&json, "exit_value", &json_value))
+ if (!sudo_json_add_value(&jsonc, "exit_value", &json_value))
goto oom;
}
}
- if (!sudo_json_close_object(&json))
+ if (!sudo_json_close_object(&jsonc))
goto oom;
- ret = audit_write_json(&json);
- sudo_json_free(&json);
+ ret = audit_write_json(&jsonc);
+ sudo_json_free(&jsonc);
done:
debug_return_int(ret);
oom:
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
- sudo_json_free(&json);
+ sudo_json_free(&jsonc);
debug_return_int(-1);
}
@@ -511,7 +511,7 @@ audit_write_record(const char *audit_str, const char *plugin_name,
unsigned int plugin_type, const char *reason, char * const command_info[],
char * const run_argv[], char * const run_envp[])
{
- struct json_container json;
+ struct json_container jsonc;
struct json_value json_value;
struct timespec now;
int ret = -1;
@@ -522,14 +522,14 @@ audit_write_record(const char *audit_str, const char *plugin_name,
goto done;
}
- if (!sudo_json_init(&json, 4, false, false))
+ if (!sudo_json_init(&jsonc, 4, false, false))
goto oom;
- if (!sudo_json_open_object(&json, audit_str))
+ if (!sudo_json_open_object(&jsonc, audit_str))
goto oom;
json_value.type = JSON_STRING;
json_value.u.string = plugin_name;
- if (!sudo_json_add_value(&json, "plugin_name", &json_value))
+ if (!sudo_json_add_value(&jsonc, "plugin_name", &json_value))
goto oom;
switch (plugin_type) {
@@ -553,85 +553,85 @@ audit_write_record(const char *audit_str, const char *plugin_name,
break;
}
json_value.type = JSON_STRING;
- if (!sudo_json_add_value(&json, "plugin_type", &json_value))
+ if (!sudo_json_add_value(&jsonc, "plugin_type", &json_value))
goto oom;
/* error and reject audit events usually contain a reason. */
if (reason != NULL) {
json_value.type = JSON_STRING;
json_value.u.string = reason;
- if (!sudo_json_add_value(&json, "reason", &json_value))
+ if (!sudo_json_add_value(&jsonc, "reason", &json_value))
goto oom;
}
json_value.type = JSON_STRING;
json_value.u.string = state.uuid_str;
- if (!sudo_json_add_value(&json, "uuid", &json_value))
+ if (!sudo_json_add_value(&jsonc, "uuid", &json_value))
goto oom;
- if (!add_timestamp(&json, &now))
+ if (!add_timestamp(&jsonc, &now))
goto oom;
/* Write key=value objects. */
if (state.settings != NULL) {
- if (!add_key_value_object(&json, "options", state.settings, settings_filter))
+ if (!add_key_value_object(&jsonc, "options", state.settings, settings_filter))
goto oom;
} else {
sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
"missing settings list");
}
if (state.user_info != NULL) {
- if (!add_key_value_object(&json, "user_info", state.user_info, NULL))
+ if (!add_key_value_object(&jsonc, "user_info", state.user_info, NULL))
goto oom;
} else {
sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
"missing user_info list");
}
if (command_info != NULL) {
- if (!add_key_value_object(&json, "command_info", command_info, NULL))
+ if (!add_key_value_object(&jsonc, "command_info", command_info, NULL))
goto oom;
}
/* Write submit_optind before submit_argv */
json_value.type = JSON_NUMBER;
json_value.u.number = state.submit_optind;
- if (!sudo_json_add_value(&json, "submit_optind", &json_value))
+ if (!sudo_json_add_value(&jsonc, "submit_optind", &json_value))
goto oom;
if (state.submit_argv != NULL) {
- if (!add_array(&json, "submit_argv", state.submit_argv))
+ if (!add_array(&jsonc, "submit_argv", state.submit_argv))
goto oom;
} else {
sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
"missing submit_argv array");
}
if (state.submit_envp != NULL) {
- if (!add_array(&json, "submit_envp", state.submit_envp))
+ if (!add_array(&jsonc, "submit_envp", state.submit_envp))
goto oom;
} else {
sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
"missing submit_envp array");
}
if (run_argv != NULL) {
- if (!add_array(&json, "run_argv", run_argv))
+ if (!add_array(&jsonc, "run_argv", run_argv))
goto oom;
}
if (run_envp != NULL) {
- if (!add_array(&json, "run_envp", run_envp))
+ if (!add_array(&jsonc, "run_envp", run_envp))
goto oom;
}
- if (!sudo_json_close_object(&json))
+ if (!sudo_json_close_object(&jsonc))
goto oom;
- ret = audit_write_json(&json);
- sudo_json_free(&json);
+ ret = audit_write_json(&jsonc);
+ sudo_json_free(&jsonc);
done:
debug_return_int(ret);
oom:
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
- sudo_json_free(&json);
+ sudo_json_free(&jsonc);
debug_return_int(-1);
}
diff --git a/plugins/group_file/getgrent.c b/plugins/group_file/getgrent.c
index 142fd39e1..efb74b25b 100644
--- a/plugins/group_file/getgrent.c
+++ b/plugins/group_file/getgrent.c
@@ -22,7 +22,7 @@
*/
/*
- * Trivial replacements for the libc getgr{uid,nam}() routines.
+ * Trivial replacements for the libc getgrent() family of functions.
*/
#include <config.h>
diff --git a/plugins/python/Makefile.in b/plugins/python/Makefile.in
index a4b71e57a..1510d22e7 100644
--- a/plugins/python/Makefile.in
+++ b/plugins/python/Makefile.in
@@ -36,6 +36,7 @@ cross_compiling = @CROSS_COMPILING@
# Compiler & tools to use
CC = @CC@
LIBTOOL = @LIBTOOL@
+GREP = @GREP@
SED = @SED@
AWK = @AWK@
@@ -227,7 +228,7 @@ check-fuzzer:
check: $(TEST_PROGS) check-fuzzer
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -276,11 +277,13 @@ check_python_examples.i: $(srcdir)/regress/check_python_examples.c \
$(CC) -E -o $@ $(CPPFLAGS) $<
check_python_examples.plog: check_python_examples.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/check_python_examples.c --i-file $< --output-file $@
-iohelpers.o: $(srcdir)/regress/iohelpers.c $(incdir)/sudo_compat.h \
- $(srcdir)/regress/iohelpers.h $(top_builddir)/config.h
+iohelpers.o: $(srcdir)/regress/iohelpers.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(srcdir)/regress/iohelpers.h \
+ $(top_builddir)/config.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/iohelpers.c
-iohelpers.i: $(srcdir)/regress/iohelpers.c $(incdir)/sudo_compat.h \
- $(srcdir)/regress/iohelpers.h $(top_builddir)/config.h
+iohelpers.i: $(srcdir)/regress/iohelpers.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(srcdir)/regress/iohelpers.h \
+ $(top_builddir)/config.h
$(CC) -E -o $@ $(CPPFLAGS) $<
iohelpers.plog: iohelpers.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iohelpers.c --i-file $< --output-file $@
diff --git a/plugins/python/pyhelpers.c b/plugins/python/pyhelpers.c
index 2670752d8..882b31a6b 100644
--- a/plugins/python/pyhelpers.c
+++ b/plugins/python/pyhelpers.c
@@ -67,13 +67,6 @@ struct PythonContext py_ctx = {
};
-int
-py_is_sudo_log_available(void)
-{
- debug_decl(py_is_sudo_log_available, PYTHON_DEBUG_INTERNAL);
- debug_return_int(py_ctx.sudo_log != &_sudo_printf_default);
-}
-
char *
py_join_str_list(PyObject *py_str_list, const char *separator)
{
@@ -104,7 +97,7 @@ cleanup:
debug_return_str(result);
}
-char *
+static char *
py_create_traceback_string(PyObject *py_traceback)
{
debug_decl(py_create_traceback_string, PYTHON_DEBUG_INTERNAL);
diff --git a/plugins/python/pyhelpers.h b/plugins/python/pyhelpers.h
index 524b14e3b..5448e1d48 100644
--- a/plugins/python/pyhelpers.h
+++ b/plugins/python/pyhelpers.h
@@ -22,7 +22,7 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include "config.h"
+#include <config.h>
#include "sudo_compat.h"
#include "sudo_plugin.h"
diff --git a/plugins/python/python_convmessage.c b/plugins/python/python_convmessage.c
index 14283dcd7..7b2aa6d0e 100644
--- a/plugins/python/python_convmessage.c
+++ b/plugins/python/python_convmessage.c
@@ -36,8 +36,8 @@ _sudo_ConvMessage__Init(PyObject *py_self, PyObject *py_args, PyObject *py_kwarg
struct sudo_conv_message conv_message = { 0, 0, NULL };
- static char *keywords[] = { "self", "msg_type", "msg", "timeout", NULL };
- if (!PyArg_ParseTupleAndKeywords(py_args ? py_args : py_empty, py_kwargs, "Ois|i:sudo.ConvMessage", keywords,
+ static const char *keywords[] = { "self", "msg_type", "msg", "timeout", NULL };
+ if (!PyArg_ParseTupleAndKeywords(py_args ? py_args : py_empty, py_kwargs, "Ois|i:sudo.ConvMessage", (char **)keywords,
&py_self, &(conv_message.msg_type), &(conv_message.msg),
&(conv_message.timeout)))
goto cleanup;
diff --git a/plugins/python/python_importblocker.c b/plugins/python/python_importblocker.c
index 2bce36c0b..109a816a4 100644
--- a/plugins/python/python_importblocker.c
+++ b/plugins/python/python_importblocker.c
@@ -78,17 +78,18 @@ cleanup:
}
static PyObject *
-_sudo_ImportBlocker__find_module(PyObject *py_self, PyObject *py_args)
+_sudo_ImportBlocker__find_spec(PyObject *py_self, PyObject *py_args)
{
- debug_decl(_sudo_ImportBlocker__find_module, PYTHON_DEBUG_C_CALLS);
+ debug_decl(_sudo_ImportBlocker__find_spec, PYTHON_DEBUG_C_CALLS);
- PyObject *py_fullname = NULL, *py_path = NULL, *py_meta_path = NULL,
- *py_meta_path_iterator = NULL, *py_finder = NULL,
- *py_importer = NULL, *py_import_path = NULL;
+ PyObject *py_fullname = NULL, *py_path = NULL, *py_target = NULL,
+ *py_meta_path = NULL, *py_meta_path_iterator = NULL,
+ *py_finder = NULL, *py_spec = NULL, *py_loader = NULL,
+ *py_import_path = NULL;
- py_debug_python_call("ImportBlocker", "find_module", py_args, NULL, PYTHON_DEBUG_C_CALLS);
+ py_debug_python_call("ImportBlocker", "find_spec", py_args, NULL, PYTHON_DEBUG_C_CALLS);
- if (!PyArg_UnpackTuple(py_args, "sudo.ImportBlocker.find_module", 2, 3, &py_self, &py_fullname, &py_path))
+ if (!PyArg_UnpackTuple(py_args, "sudo.ImportBlocker.find_spec", 2, 4, &py_self, &py_fullname, &py_path, &py_target))
goto cleanup;
py_meta_path = PyObject_GetAttrString(py_self, "meta_path");
@@ -100,16 +101,18 @@ _sudo_ImportBlocker__find_module(PyObject *py_self, PyObject *py_args)
goto cleanup;
while ((py_finder = PyIter_Next(py_meta_path_iterator)) != NULL) {
- py_importer = PyObject_CallMethod(py_finder, "find_module", "(OO)",
- py_fullname, py_path);
- if (py_importer == NULL) {
+ py_spec = PyObject_CallMethod(py_finder, "find_spec", "(OO)",
+ py_fullname, py_path, py_target);
+ if (py_spec == NULL) {
goto cleanup;
}
- if (py_importer != Py_None) { // the import could be resolved
- if (PyObject_HasAttrString(py_importer, "get_filename")) {
+ if (py_spec != Py_None && PyObject_HasAttrString(py_spec, "loader")) {
+ // the finder could be resolved and contains a loader
+ py_loader = PyObject_GetAttrString(py_spec, "loader");
+ if (py_loader != NULL && PyObject_HasAttrString(py_loader, "get_filename")) {
// there is a file associated with the import (.py, .so, etc)
- py_import_path = PyObject_CallMethod(py_importer, "get_filename", "");
+ py_import_path = PyObject_CallMethod(py_loader, "get_filename", "");
const char *import_path = PyUnicode_AsUTF8(py_import_path);
sudo_debug_printf(SUDO_DEBUG_DIAG, "ImportBlocker: verifying permissions "
@@ -127,32 +130,33 @@ _sudo_ImportBlocker__find_module(PyObject *py_self, PyObject *py_args)
goto cleanup;
}
- Py_CLEAR(py_importer);
+ Py_CLEAR(py_spec);
Py_CLEAR(py_finder);
}
- Py_CLEAR(py_importer);
- py_importer = Py_None;
- Py_INCREF(py_importer);
+ Py_CLEAR(py_spec);
+ py_spec = Py_None;
+ Py_INCREF(py_spec);
cleanup:
Py_CLEAR(py_meta_path_iterator);
Py_CLEAR(py_meta_path);
Py_CLEAR(py_finder);
Py_CLEAR(py_import_path);
+ Py_CLEAR(py_loader);
if (PyErr_Occurred()) {
- Py_CLEAR(py_importer);
+ Py_CLEAR(py_spec);
debug_return_ptr(NULL);
}
- debug_return_ptr(py_importer);
+ debug_return_ptr(py_spec);
}
static PyMethodDef _sudo_ImportBlocker_class_methods[] =
{
{"__init__", _sudo_ImportBlocker__Init, METH_VARARGS, ""},
- {"find_module", _sudo_ImportBlocker__find_module, METH_VARARGS, ""},
+ {"find_spec", _sudo_ImportBlocker__find_spec, METH_VARARGS, ""},
{NULL, NULL, 0, NULL}
};
diff --git a/plugins/python/python_plugin_approval.c b/plugins/python/python_plugin_approval.c
index 31c479f19..b9c746ed4 100644
--- a/plugins/python/python_plugin_approval.c
+++ b/plugins/python/python_plugin_approval.c
@@ -38,6 +38,7 @@ struct ApprovalPluginContext
// This also verifies compile time that the name matches the sudo plugin API.
#define CALLBACK_PYNAME(func_name) ((void)CALLBACK_PLUGINFUNC(func_name), #func_name)
+sudo_dso_public struct approval_plugin *python_approval_clone(void);
static int
python_plugin_approval_open(struct ApprovalPluginContext *approval_ctx,
@@ -133,7 +134,7 @@ python_plugin_approval_check(struct ApprovalPluginContext *approval_ctx,
debug_return_int(rc);
}
-int
+static int
python_plugin_approval_show_version(struct ApprovalPluginContext *approval_ctx, int verbose)
{
debug_decl(python_plugin_approval_show_version, PYTHON_DEBUG_CALLBACKS);
@@ -175,7 +176,7 @@ static struct approval_plugin *extra_approval_plugins[] = {
&python_approval7
};
-sudo_dso_public struct approval_plugin *
+struct approval_plugin *
python_approval_clone(void)
{
static size_t counter = 0;
diff --git a/plugins/python/python_plugin_approval_multi.inc b/plugins/python/python_plugin_approval_multi.inc
index 941c14d32..d5b15ffe6 100644
--- a/plugins/python/python_plugin_approval_multi.inc
+++ b/plugins/python/python_plugin_approval_multi.inc
@@ -11,7 +11,7 @@ extern struct approval_plugin APPROVAL_SYMBOL_NAME(python_approval);
static struct ApprovalPluginContext PLUGIN_CTX = { { NULL }, &APPROVAL_SYMBOL_NAME(python_approval) };
-int
+static int
CALLBACK_CFUNC(open)(unsigned int version, sudo_conv_t conversation,
sudo_printf_t sudo_printf, char * const settings[],
char * const user_info[], int submit_optind,
@@ -23,13 +23,13 @@ CALLBACK_CFUNC(open)(unsigned int version, sudo_conv_t conversation,
submit_envp, plugin_options, errstr);
}
-void
+static void
CALLBACK_CFUNC(close)(void)
{
python_plugin_approval_close(&PLUGIN_CTX);
}
-int
+static int
CALLBACK_CFUNC(check)(char * const command_info[], char * const run_argv[],
char * const run_envp[], const char **errstr)
{
@@ -37,7 +37,7 @@ CALLBACK_CFUNC(check)(char * const command_info[], char * const run_argv[],
run_envp, errstr);
}
-int
+static int
CALLBACK_CFUNC(show_version)(int verbose)
{
return python_plugin_approval_show_version(&PLUGIN_CTX, verbose);
diff --git a/plugins/python/python_plugin_audit.c b/plugins/python/python_plugin_audit.c
index ac4093482..e2036ed6e 100644
--- a/plugins/python/python_plugin_audit.c
+++ b/plugins/python/python_plugin_audit.c
@@ -44,6 +44,7 @@ struct AuditPluginContext
(void **)&CALLBACK_PLUGINFUNC(function_name)); \
} while(0)
+sudo_dso_public struct audit_plugin *python_audit_clone(void);
static int
_call_plugin_open(struct AuditPluginContext *audit_ctx, int submit_optind, char * const submit_argv[])
@@ -126,7 +127,7 @@ python_plugin_audit_close(struct AuditPluginContext *audit_ctx, int status_type,
debug_return;
}
-int
+static int
python_plugin_audit_accept(struct AuditPluginContext *audit_ctx,
const char *plugin_name, unsigned int plugin_type,
char * const command_info[], char * const run_argv[],
@@ -164,7 +165,7 @@ cleanup:
debug_return_int(rc);
}
-int
+static int
python_plugin_audit_reject(struct AuditPluginContext *audit_ctx,
const char *plugin_name, unsigned int plugin_type,
const char *audit_msg, char * const command_info[], const char **errstr)
@@ -194,7 +195,7 @@ cleanup:
debug_return_int(rc);
}
-int
+static int
python_plugin_audit_error(struct AuditPluginContext *audit_ctx,
const char *plugin_name, unsigned int plugin_type,
const char *audit_msg, char * const command_info[], const char **errstr)
@@ -221,7 +222,7 @@ cleanup:
debug_return_int(rc);
}
-int
+static int
python_plugin_audit_show_version(struct AuditPluginContext *audit_ctx, int verbose)
{
debug_decl(python_plugin_audit_show_version, PYTHON_DEBUG_CALLBACKS);
@@ -263,7 +264,7 @@ static struct audit_plugin *extra_audit_plugins[] = {
&python_audit7
};
-sudo_dso_public struct audit_plugin *
+struct audit_plugin *
python_audit_clone(void)
{
static size_t counter = 0;
diff --git a/plugins/python/python_plugin_audit_multi.inc b/plugins/python/python_plugin_audit_multi.inc
index 3dc8c1768..015b4d145 100644
--- a/plugins/python/python_plugin_audit_multi.inc
+++ b/plugins/python/python_plugin_audit_multi.inc
@@ -29,7 +29,7 @@ CALLBACK_CFUNC(close)(int status_type, int status)
python_plugin_audit_close(&PLUGIN_CTX, status_type, status);
}
-int
+static int
CALLBACK_CFUNC(accept)(const char *plugin_name, unsigned int plugin_type,
char * const command_info[], char * const run_argv[],
char * const run_envp[], const char **errstr)
@@ -38,7 +38,7 @@ CALLBACK_CFUNC(accept)(const char *plugin_name, unsigned int plugin_type,
command_info, run_argv, run_envp, errstr);
}
-int
+static int
CALLBACK_CFUNC(reject)(const char *plugin_name, unsigned int plugin_type,
const char *audit_msg, char * const command_info[], const char **errstr)
{
@@ -46,7 +46,7 @@ CALLBACK_CFUNC(reject)(const char *plugin_name, unsigned int plugin_type,
audit_msg, command_info, errstr);
}
-int
+static int
CALLBACK_CFUNC(error)(const char *plugin_name, unsigned int plugin_type,
const char *audit_msg, char * const command_info[], const char **errstr)
{
@@ -54,7 +54,7 @@ CALLBACK_CFUNC(error)(const char *plugin_name, unsigned int plugin_type,
audit_msg, command_info, errstr);
}
-int
+static int
CALLBACK_CFUNC(show_version)(int verbose)
{
return python_plugin_audit_show_version(&PLUGIN_CTX, verbose);
diff --git a/plugins/python/python_plugin_common.c b/plugins/python/python_plugin_common.c
index c337dd730..a583a5e58 100644
--- a/plugins/python/python_plugin_common.c
+++ b/plugins/python/python_plugin_common.c
@@ -42,7 +42,7 @@ static size_t python_inittab_copy_len = 0;
# define Py_FinalizeEx() (Py_Finalize(), 0)
#endif
-const char *
+static const char *
_lookup_value(char * const keyvalues[], const char *key)
{
debug_decl(_lookup_value, PYTHON_DEBUG_INTERNAL);
@@ -101,7 +101,7 @@ _import_module(const char *path)
if (strlcpy(path_copy, path, sizeof(path_copy)) >= sizeof(path_copy))
debug_return_ptr(NULL);
- char *module_dir = path_copy;
+ const char *module_dir = path_copy;
char *module_name = strrchr(path_copy, '/');
if (module_name == NULL) {
module_name = path_copy;
@@ -190,7 +190,7 @@ _restore_inittab(void)
debug_return;
}
-void
+static void
python_plugin_handle_plugin_error_exception(PyObject **py_result, struct PluginContext *plugin_ctx)
{
debug_decl(python_plugin_handle_plugin_error_exception, PYTHON_DEBUG_INTERNAL);
@@ -396,7 +396,7 @@ _python_plugin_register_plugin_in_py_ctx(void)
debug_return_int(SUDO_RC_OK);
}
-int
+static int
_python_plugin_set_path(struct PluginContext *plugin_ctx, const char *path)
{
if (path == NULL) {
diff --git a/plugins/python/python_plugin_group.c b/plugins/python/python_plugin_group.c
index d0ea3c113..b1514c7e5 100644
--- a/plugins/python/python_plugin_group.c
+++ b/plugins/python/python_plugin_group.c
@@ -36,7 +36,7 @@ extern struct sudoers_group_plugin group_plugin;
#define CALLBACK_PYNAME(func_name) ((void)CALLBACK_PLUGINFUNC(func_name), #func_name)
-int
+static int
python_plugin_group_init(int version, sudo_printf_t sudo_printf, char *const plugin_options[])
{
debug_decl(python_plugin_group_init, PYTHON_DEBUG_CALLBACKS);
@@ -79,7 +79,7 @@ python_plugin_group_init(int version, sudo_printf_t sudo_printf, char *const plu
debug_return_int(rc);
}
-void
+static void
python_plugin_group_cleanup(void)
{
debug_decl(python_plugin_group_cleanup, PYTHON_DEBUG_CALLBACKS);
@@ -87,7 +87,7 @@ python_plugin_group_cleanup(void)
python_plugin_deinit(&plugin_ctx);
}
-int
+static int
python_plugin_group_query(const char *user, const char *group, const struct passwd *pwd)
{
debug_decl(python_plugin_group_query, PYTHON_DEBUG_CALLBACKS);
diff --git a/plugins/python/python_plugin_io.c b/plugins/python/python_plugin_io.c
index b12480846..46289c361 100644
--- a/plugins/python/python_plugin_io.c
+++ b/plugins/python/python_plugin_io.c
@@ -44,6 +44,7 @@ struct IOPluginContext
(void **)&CALLBACK_PLUGINFUNC(function_name)); \
} while(0)
+sudo_dso_public struct io_plugin *python_io_clone(void);
static int
_call_plugin_open(struct IOPluginContext *io_ctx, int argc, char * const argv[], char * const command_info[])
@@ -75,7 +76,7 @@ _call_plugin_open(struct IOPluginContext *io_ctx, int argc, char * const argv[],
debug_return_int(rc);
}
-int
+static int
python_plugin_io_open(struct IOPluginContext *io_ctx,
unsigned int version, sudo_conv_t conversation,
sudo_printf_t sudo_printf, char * const settings[],
@@ -125,7 +126,7 @@ python_plugin_io_open(struct IOPluginContext *io_ctx,
debug_return_int(rc);
}
-void
+static void
python_plugin_io_close(struct IOPluginContext *io_ctx, int exit_status, int error)
{
debug_decl(python_plugin_io_close, PYTHON_DEBUG_CALLBACKS);
@@ -134,7 +135,7 @@ python_plugin_io_close(struct IOPluginContext *io_ctx, int exit_status, int erro
debug_return;
}
-int
+static int
python_plugin_io_show_version(struct IOPluginContext *io_ctx, int verbose)
{
debug_decl(python_plugin_io_show_version, PYTHON_DEBUG_CALLBACKS);
@@ -145,7 +146,7 @@ python_plugin_io_show_version(struct IOPluginContext *io_ctx, int verbose)
verbose, PY_IO_PLUGIN_VERSION, "io"));
}
-int
+static int
python_plugin_io_log_ttyin(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr)
{
debug_decl(python_plugin_io_log_ttyin, PYTHON_DEBUG_CALLBACKS);
@@ -157,7 +158,7 @@ python_plugin_io_log_ttyin(struct IOPluginContext *io_ctx, const char *buf, unsi
debug_return_int(rc);
}
-int
+static int
python_plugin_io_log_ttyout(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr)
{
debug_decl(python_plugin_io_log_ttyout, PYTHON_DEBUG_CALLBACKS);
@@ -169,7 +170,7 @@ python_plugin_io_log_ttyout(struct IOPluginContext *io_ctx, const char *buf, uns
debug_return_int(rc);
}
-int
+static int
python_plugin_io_log_stdin(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr)
{
debug_decl(python_plugin_io_log_stdin, PYTHON_DEBUG_CALLBACKS);
@@ -181,7 +182,7 @@ python_plugin_io_log_stdin(struct IOPluginContext *io_ctx, const char *buf, unsi
debug_return_int(rc);
}
-int
+static int
python_plugin_io_log_stdout(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr)
{
debug_decl(python_plugin_io_log_stdout, PYTHON_DEBUG_CALLBACKS);
@@ -193,7 +194,7 @@ python_plugin_io_log_stdout(struct IOPluginContext *io_ctx, const char *buf, uns
debug_return_int(rc);
}
-int
+static int
python_plugin_io_log_stderr(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr)
{
debug_decl(python_plugin_io_log_stderr, PYTHON_DEBUG_CALLBACKS);
@@ -205,7 +206,7 @@ python_plugin_io_log_stderr(struct IOPluginContext *io_ctx, const char *buf, uns
debug_return_int(rc);
}
-int
+static int
python_plugin_io_change_winsize(struct IOPluginContext *io_ctx, unsigned int line, unsigned int cols, const char **errstr)
{
debug_decl(python_plugin_io_change_winsize, PYTHON_DEBUG_CALLBACKS);
@@ -217,7 +218,7 @@ python_plugin_io_change_winsize(struct IOPluginContext *io_ctx, unsigned int lin
debug_return_int(rc);
}
-int
+static int
python_plugin_io_log_suspend(struct IOPluginContext *io_ctx, int signo, const char **errstr)
{
debug_decl(python_plugin_io_log_suspend, PYTHON_DEBUG_CALLBACKS);
@@ -258,7 +259,7 @@ static struct io_plugin *extra_io_plugins[] = {
&python_io7
};
-sudo_dso_public struct io_plugin *
+struct io_plugin *
python_io_clone(void)
{
static size_t counter = 0;
diff --git a/plugins/python/python_plugin_io_multi.inc b/plugins/python/python_plugin_io_multi.inc
index 2ccdb5e68..d5d58d2d2 100644
--- a/plugins/python/python_plugin_io_multi.inc
+++ b/plugins/python/python_plugin_io_multi.inc
@@ -10,7 +10,7 @@
extern struct io_plugin IO_SYMBOL_NAME(python_io);
static struct IOPluginContext PLUGIN_CTX = { { NULL }, &IO_SYMBOL_NAME(python_io) };
-int
+static int
CALLBACK_CFUNC(open)(
unsigned int version, sudo_conv_t conversation,
sudo_printf_t sudo_printf, char * const settings[],
@@ -22,55 +22,55 @@ CALLBACK_CFUNC(open)(
sudo_printf, settings, user_info, command_info, argc, argv, user_env, plugin_options, errstr);
}
-void
+static void
CALLBACK_CFUNC(close)(int exit_status, int error)
{
python_plugin_io_close(&PLUGIN_CTX, exit_status, error);
}
-int
+static int
CALLBACK_CFUNC(show_version)(int verbose)
{
return python_plugin_io_show_version(&PLUGIN_CTX, verbose);
}
-int
+static int
CALLBACK_CFUNC(log_ttyin)(const char *buf, unsigned int len, const char **errstr)
{
return python_plugin_io_log_ttyin(&PLUGIN_CTX, buf, len, errstr);
}
-int
+static int
CALLBACK_CFUNC(log_ttyout)(const char *buf, unsigned int len, const char **errstr)
{
return python_plugin_io_log_ttyout(&PLUGIN_CTX, buf, len, errstr);
}
-int
+static int
CALLBACK_CFUNC(log_stdin)(const char *buf, unsigned int len, const char **errstr)
{
return python_plugin_io_log_stdin(&PLUGIN_CTX, buf, len, errstr);
}
-int
+static int
CALLBACK_CFUNC(log_stdout)(const char *buf, unsigned int len, const char **errstr)
{
return python_plugin_io_log_stdout(&PLUGIN_CTX, buf, len, errstr);
}
-int
+static int
CALLBACK_CFUNC(log_stderr)(const char *buf, unsigned int len, const char **errstr)
{
return python_plugin_io_log_stderr(&PLUGIN_CTX, buf, len, errstr);
}
-int
+static int
CALLBACK_CFUNC(change_winsize)(unsigned int line, unsigned int cols, const char **errstr)
{
return python_plugin_io_change_winsize(&PLUGIN_CTX, line, cols, errstr);
}
-int
+static int
CALLBACK_CFUNC(log_suspend)(int signo, const char **errstr)
{
return python_plugin_io_log_suspend(&PLUGIN_CTX, signo, errstr);
diff --git a/plugins/python/python_plugin_policy.c b/plugins/python/python_plugin_policy.c
index ded793aa5..776c9e0a4 100644
--- a/plugins/python/python_plugin_policy.c
+++ b/plugins/python/python_plugin_policy.c
@@ -203,7 +203,7 @@ python_plugin_policy_version(int verbose)
verbose, PY_POLICY_PLUGIN_VERSION, "policy"));
}
-int
+static int
python_plugin_policy_validate(const char **errstr)
{
debug_decl(python_plugin_policy_validate, PYTHON_DEBUG_CALLBACKS);
@@ -213,7 +213,7 @@ python_plugin_policy_validate(const char **errstr)
debug_return_int(rc);
}
-void
+static void
python_plugin_policy_invalidate(int unlinkit)
{
debug_decl(python_plugin_policy_invalidate, PYTHON_DEBUG_CALLBACKS);
@@ -223,7 +223,7 @@ python_plugin_policy_invalidate(int unlinkit)
debug_return;
}
-int
+static int
python_plugin_policy_init_session(struct passwd *pwd, char **user_env[], const char **errstr)
{
debug_decl(python_plugin_policy_init_session, PYTHON_DEBUG_CALLBACKS);
diff --git a/plugins/python/regress/check_python_examples.c b/plugins/python/regress/check_python_examples.c
index 10eefac6c..122797a5e 100644
--- a/plugins/python/regress/check_python_examples.c
+++ b/plugins/python/regress/check_python_examples.c
@@ -22,6 +22,7 @@
*/
#include "testhelpers.h"
+#include <unistd.h>
#include "sudo_dso.h"
@@ -49,7 +50,7 @@ static bool verbose;
static int _init_symbols(void);
static int _unlink_symbols(void);
-void
+static void
create_plugin_options(const char *module_name, const char *class_name, const char *extra_option)
{
char opt_module_path[PATH_MAX + 256];
@@ -65,7 +66,7 @@ create_plugin_options(const char *module_name, const char *class_name, const cha
opt_classname, extra_option, NULL);
}
-void
+static void
create_io_plugin_options(const char *log_path)
{
char opt_logpath[PATH_MAX + 16];
@@ -73,19 +74,19 @@ create_io_plugin_options(const char *log_path)
create_plugin_options("example_io_plugin", "SudoIOPlugin", opt_logpath);
}
-void
+static void
create_debugging_plugin_options(void)
{
create_plugin_options("example_debugging", "DebugDemoPlugin", NULL);
}
-void
+static void
create_audit_plugin_options(const char *extra_argument)
{
create_plugin_options("example_audit_plugin", "SudoAuditPlugin", extra_argument);
}
-void
+static void
create_conversation_plugin_options(void)
{
char opt_logpath[PATH_MAX + 16];
@@ -93,24 +94,24 @@ create_conversation_plugin_options(void)
create_plugin_options("example_conversation", "ReasonLoggerIOPlugin", opt_logpath);
}
-void
+static void
create_policy_plugin_options(void)
{
create_plugin_options("example_policy_plugin", "SudoPolicyPlugin", NULL);
}
-int
+static int
init(void)
{
// always start each test from clean state
memset(&data, 0, sizeof(data));
memset(&example_pwd, 0, sizeof(example_pwd));
- example_pwd.pw_name = "pw_name";
- example_pwd.pw_passwd = "pw_passwd";
- example_pwd.pw_gecos = "pw_gecos";
- example_pwd.pw_shell ="pw_shell";
- example_pwd.pw_dir = "pw_dir";
+ example_pwd.pw_name = (char *)"pw_name";
+ example_pwd.pw_passwd = (char *)"pw_passwd";
+ example_pwd.pw_gecos = (char *)"pw_gecos";
+ example_pwd.pw_shell = (char *)"pw_shell";
+ example_pwd.pw_dir = (char *)"pw_dir";
example_pwd.pw_uid = (uid_t)1001;
example_pwd.pw_gid = (gid_t)101;
@@ -134,7 +135,7 @@ init(void)
return true;
}
-int
+static int
cleanup(int success)
{
if (!success) {
@@ -160,7 +161,7 @@ cleanup(int success)
return true;
}
-int
+static int
check_example_io_plugin_version_display(int is_verbose)
{
const char *errstr = NULL;
@@ -188,7 +189,7 @@ check_example_io_plugin_version_display(int is_verbose)
return true;
}
-int
+static int
check_example_io_plugin_command_log(void)
{
const char *errstr = NULL;
@@ -233,7 +234,7 @@ check_example_io_plugin_command_log(void)
typedef struct io_plugin * (io_clone_func)(void);
-int
+static int
check_example_io_plugin_command_log_multiple(void)
{
const char *errstr = NULL;
@@ -330,7 +331,7 @@ check_example_io_plugin_command_log_multiple(void)
return true;
}
-int
+static int
check_example_io_plugin_failed_to_start_command(void)
{
const char *errstr = NULL;
@@ -358,7 +359,7 @@ check_example_io_plugin_failed_to_start_command(void)
return true;
}
-int
+static int
check_example_io_plugin_fails_with_python_backtrace(void)
{
const char *errstr = NULL;
@@ -377,7 +378,7 @@ check_example_io_plugin_fails_with_python_backtrace(void)
return true;
}
-int
+static int
check_io_plugin_reports_error(void)
{
const char *errstr = NULL;
@@ -445,7 +446,7 @@ check_io_plugin_reports_error(void)
return true;
}
-int
+static int
check_example_group_plugin(void)
{
create_plugin_options("example_group_plugin", "SudoGroupPlugin", NULL);
@@ -463,7 +464,7 @@ check_example_group_plugin(void)
return true;
}
-const char *
+static const char *
create_debug_config(const char *debug_spec)
{
char *result = NULL;
@@ -493,7 +494,7 @@ cleanup:
return result;
}
-int
+static int
check_example_group_plugin_is_able_to_debug(void)
{
const char *config_path = create_debug_config("py_calls@diag");
@@ -516,7 +517,7 @@ check_example_group_plugin_is_able_to_debug(void)
return true;
}
-int
+static int
check_plugin_unload(void)
{
// You can call this test to avoid having a lot of subinterpreters
@@ -528,7 +529,7 @@ check_plugin_unload(void)
return true;
}
-int
+static int
check_example_debugging(const char *debug_spec)
{
const char *errstr = NULL;
@@ -559,7 +560,7 @@ check_example_debugging(const char *debug_spec)
return true;
}
-int
+static int
check_loading_fails(const char *name)
{
const char *errstr = NULL;
@@ -576,7 +577,7 @@ check_loading_fails(const char *name)
return true;
}
-int
+static int
check_loading_fails_with_missing_path(void)
{
str_array_free(&data.plugin_options);
@@ -584,7 +585,7 @@ check_loading_fails_with_missing_path(void)
return check_loading_fails("missing_path");
}
-int
+static int
check_loading_succeeds_with_missing_classname(void)
{
str_array_free(&data.plugin_options);
@@ -605,7 +606,7 @@ check_loading_succeeds_with_missing_classname(void)
return true;
}
-int
+static int
check_loading_fails_with_missing_classname(void)
{
str_array_free(&data.plugin_options);
@@ -613,14 +614,14 @@ check_loading_fails_with_missing_classname(void)
return check_loading_fails("missing_classname");
}
-int
+static int
check_loading_fails_with_wrong_classname(void)
{
create_plugin_options("example_debugging", "MispelledPluginName", NULL);
return check_loading_fails("wrong_classname");
}
-int
+static int
check_loading_fails_with_wrong_path(void)
{
str_array_free(&data.plugin_options);
@@ -628,7 +629,7 @@ check_loading_fails_with_wrong_path(void)
return check_loading_fails("wrong_path");
}
-int
+static int
check_loading_fails_plugin_is_not_owned_by_root(void)
{
sudo_conf_clear_paths();
@@ -638,7 +639,7 @@ check_loading_fails_plugin_is_not_owned_by_root(void)
return check_loading_fails("not_owned_by_root");
}
-int
+static int
check_example_conversation_plugin_reason_log(int simulate_suspend, const char *description)
{
const char *errstr = NULL;
@@ -667,7 +668,7 @@ check_example_conversation_plugin_reason_log(int simulate_suspend, const char *d
return true;
}
-int
+static int
check_example_conversation_plugin_user_interrupts(void)
{
const char *errstr = NULL;
@@ -692,7 +693,7 @@ check_example_conversation_plugin_user_interrupts(void)
return true;
}
-int
+static int
check_example_policy_plugin_version_display(int is_verbose)
{
const char *errstr = NULL;
@@ -721,7 +722,7 @@ check_example_policy_plugin_version_display(int is_verbose)
return true;
}
-int
+static int
check_example_policy_plugin_accepted_execution(void)
{
const char *errstr = NULL;
@@ -773,7 +774,7 @@ check_example_policy_plugin_accepted_execution(void)
return true;
}
-int
+static int
check_example_policy_plugin_failed_execution(void)
{
const char *errstr = NULL;
@@ -811,7 +812,7 @@ check_example_policy_plugin_failed_execution(void)
return true;
}
-int
+static int
check_example_policy_plugin_denied_execution(void)
{
const char *errstr = NULL;
@@ -846,7 +847,7 @@ check_example_policy_plugin_denied_execution(void)
return true;
}
-int
+static int
check_example_policy_plugin_list(void)
{
const char *errstr = NULL;
@@ -904,7 +905,7 @@ check_example_policy_plugin_list(void)
return true;
}
-int
+static int
check_example_policy_plugin_validate_invalidate(void)
{
const char *errstr = NULL;
@@ -935,7 +936,7 @@ check_example_policy_plugin_validate_invalidate(void)
return true;
}
-int
+static int
check_policy_plugin_callbacks_are_optional(void)
{
const char *errstr = NULL;
@@ -961,7 +962,7 @@ check_policy_plugin_callbacks_are_optional(void)
return true;
}
-int
+static int
check_policy_plugin_reports_error(void)
{
const char *errstr = NULL;
@@ -1024,7 +1025,7 @@ check_policy_plugin_reports_error(void)
return true;
}
-int
+static int
check_io_plugin_callbacks_are_optional(void)
{
const char *errstr = NULL;
@@ -1051,7 +1052,7 @@ check_io_plugin_callbacks_are_optional(void)
return true;
}
-int
+static int
check_python_plugins_do_not_affect_each_other(void)
{
const char *errstr = NULL;
@@ -1078,7 +1079,7 @@ check_python_plugins_do_not_affect_each_other(void)
return true;
}
-int
+static int
check_example_audit_plugin_receives_accept(void)
{
create_audit_plugin_options("");
@@ -1117,7 +1118,7 @@ check_example_audit_plugin_receives_accept(void)
return true;
}
-int
+static int
check_example_audit_plugin_receives_reject(void)
{
create_audit_plugin_options(NULL);
@@ -1147,7 +1148,7 @@ check_example_audit_plugin_receives_reject(void)
return true;
}
-int
+static int
check_example_audit_plugin_receives_error(void)
{
create_audit_plugin_options("");
@@ -1179,7 +1180,7 @@ check_example_audit_plugin_receives_error(void)
typedef struct audit_plugin * (audit_clone_func)(void);
-int
+static int
check_example_audit_plugin_workflow_multiple(void)
{
// verify multiple python audit plugins are available
@@ -1247,7 +1248,7 @@ check_example_audit_plugin_workflow_multiple(void)
return true;
}
-int
+static int
check_example_audit_plugin_version_display(void)
{
create_audit_plugin_options(NULL);
@@ -1275,7 +1276,7 @@ check_example_audit_plugin_version_display(void)
return true;
}
-int
+static int
check_audit_plugin_callbacks_are_optional(void)
{
const char *errstr = NULL;
@@ -1300,7 +1301,7 @@ check_audit_plugin_callbacks_are_optional(void)
return true;
}
-int
+static int
check_audit_plugin_reports_error(void)
{
const char *errstr = NULL;
diff --git a/plugins/python/regress/iohelpers.h b/plugins/python/regress/iohelpers.h
index b2383af76..ed21d56ca 100644
--- a/plugins/python/regress/iohelpers.h
+++ b/plugins/python/regress/iohelpers.h
@@ -19,17 +19,21 @@
#ifndef PYTHON_IO_HELPERS
#define PYTHON_IO_HELPERS
-#include "config.h"
-#include "sudo_compat.h"
+#include <config.h>
#include <stdio.h>
#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
#include <string.h>
#include <stdarg.h>
#include <signal.h>
#include <pwd.h>
-#include <stdbool.h>
+#include "sudo_compat.h"
#define MAX_OUTPUT (2 << 16)
diff --git a/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout b/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout
index d0c1566cf..9884aa0df 100644
--- a/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout
+++ b/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout
@@ -26,7 +26,7 @@
"INFO1=VALUE1",
"info2=value2"
],
- "version": "1.19"
+ "version": "1.20"
}
(APPROVAL 2) Constructed:
{
@@ -56,7 +56,7 @@
"INFO1=VALUE1",
"info2=value2"
],
- "version": "1.19"
+ "version": "1.20"
}
(APPROVAL 1) Show version was called with arguments: (0,)
Python approval plugin (API 1.0): ApprovalTestPlugin (loaded from 'SRC_DIR/regress/plugin_approval_test.py')
diff --git a/plugins/python/sudo_python_module.c b/plugins/python/sudo_python_module.c
index 897d471fc..ee94101c9 100644
--- a/plugins/python/sudo_python_module.c
+++ b/plugins/python/sudo_python_module.c
@@ -79,8 +79,8 @@ _parse_log_function_args(PyObject *py_args, PyObject *py_kwargs, char **args_joi
if (py_empty == NULL)
goto cleanup;
- static char *keywords[] = { "sep", "end", NULL };
- if (py_kwargs != NULL && !PyArg_ParseTupleAndKeywords(py_empty, py_kwargs, "|zz:sudo.log", keywords, &sep, end))
+ static const char *keywords[] = { "sep", "end", NULL };
+ if (py_kwargs != NULL && !PyArg_ParseTupleAndKeywords(py_empty, py_kwargs, "|zz:sudo.log", (char **)keywords, &sep, end))
goto cleanup;
if (sep == NULL)
@@ -293,13 +293,13 @@ _call_conversation_callback(PyObject *py_callback, int signo)
debug_return_int(rc);
}
-int
+static int
python_sudo_conversation_suspend_cb(int signo, struct py_conv_callback_closure *closure)
{
return _call_conversation_callback(closure->py_on_suspend, signo);
}
-int
+static int
python_sudo_conversation_resume_cb(int signo, struct py_conv_callback_closure *closure)
{
return _call_conversation_callback(closure->py_on_resume, signo);
@@ -330,8 +330,8 @@ python_sudo_conversation(PyObject *Py_UNUSED(self), PyObject *py_args, PyObject
if (py_empty == NULL)
goto cleanup;
- static char *keywords[] = { "on_suspend", "on_resume", NULL };
- if (py_kwargs != NULL && !PyArg_ParseTupleAndKeywords(py_empty, py_kwargs, "|OO:sudo.conv", keywords,
+ static const char *keywords[] = { "on_suspend", "on_resume", NULL };
+ if (py_kwargs != NULL && !PyArg_ParseTupleAndKeywords(py_empty, py_kwargs, "|OO:sudo.conv", (char **)keywords,
&callback_closure.py_on_suspend,
&callback_closure.py_on_resume))
goto cleanup;
@@ -467,7 +467,7 @@ cleanup:
}
CPYCHECKER_STEALS_REFERENCE_TO_ARG(3)
-void
+static void
sudo_module_register_enum(PyObject *py_module, const char *enum_name, PyObject *py_constants_dict)
{
// pseudo code:
diff --git a/plugins/sample/Makefile.in b/plugins/sample/Makefile.in
index 412dac3a6..e0a814c3e 100644
--- a/plugins/sample/Makefile.in
+++ b/plugins/sample/Makefile.in
@@ -1,7 +1,7 @@
#
# SPDX-License-Identifier: ISC
#
-# Copyright (c) 2011-2018 Todd C. Miller <Todd.Miller@sudo.ws>
+# Copyright (c) 2011-2022 Todd C. Miller <Todd.Miller@sudo.ws>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/plugins/sample/sample_plugin.c b/plugins/sample/sample_plugin.c
index 1b57e9c1d..e09a8da83 100644
--- a/plugins/sample/sample_plugin.c
+++ b/plugins/sample/sample_plugin.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2010-2016 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2010-2016, 2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -39,6 +39,7 @@
# include <strings.h>
#endif /* HAVE_STRINGS_H */
#include <unistd.h>
+#include <ctype.h>
#include <fcntl.h>
#include <limits.h>
#include <grp.h>
@@ -72,8 +73,9 @@ static int use_sudoedit = false;
*/
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[])
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
+ char * const user_info[], char * const user_env[], char * const args[],
+ const char **errstr)
{
char * const *ui;
struct passwd *pw;
@@ -142,20 +144,20 @@ static char *
find_in_path(char *command, char **envp)
{
struct stat sb;
- char *path, *path0, **ep, *cp;
+ char *path = NULL;
+ char *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);
+ path = path0 = strdup(path ? path : _PATH_DEFPATH);
do {
if ((cp = strchr(path, ':')))
*cp = '\0';
@@ -231,18 +233,18 @@ build_command_info(const char *command)
static char *
find_editor(int nfiles, char * const files[], char **argv_out[])
{
- char *cp, *last, **ep, **nargv, *editor, *editor_path;
+ char *cp, *last, **ep, **nargv, *editor_path;
+ char *editor = NULL;
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);
+ editor = strdup(editor ? editor : _PATH_VI);
if (editor == NULL) {
sudo_log(SUDO_CONV_ERROR_MSG, "unable to allocate memory\n");
return NULL;
@@ -281,7 +283,7 @@ find_editor(int nfiles, char * const files[], char **argv_out[])
nargv[ac] = cp;
cp = strtok_r(NULL, " \t", &last);
}
- nargv[ac++] = "--";
+ nargv[ac++] = (char *)"--";
for (i = 0; i < nfiles; )
nargv[ac++] = files[i++];
nargv[ac] = NULL;
@@ -297,7 +299,7 @@ find_editor(int nfiles, char * const files[], char **argv_out[])
static int
policy_check(int argc, char * const argv[],
char *env_add[], char **command_info_out[],
- char **argv_out[], char **user_env_out[])
+ char **argv_out[], char **user_env_out[], const char **errstr)
{
char *command;
@@ -348,7 +350,8 @@ policy_check(int argc, char * const argv[],
}
static int
-policy_list(int argc, char * const argv[], int verbose, const char *list_user)
+policy_list(int argc, char * const argv[], int verbose, const char *list_user,
+ const char **errstr)
{
/*
* List user's capabilities.
@@ -360,7 +363,8 @@ policy_list(int argc, char * const argv[], int verbose, const char *list_user)
static int
policy_version(int verbose)
{
- sudo_log(SUDO_CONV_INFO_MSG, "Sample policy plugin version %s\n", PACKAGE_VERSION);
+ sudo_log(SUDO_CONV_INFO_MSG, "Sample policy plugin version %s\n",
+ PACKAGE_VERSION);
return true;
}
@@ -386,9 +390,10 @@ policy_close(int exit_status, int error)
static int
io_open(unsigned int version, sudo_conv_t conversation,
- sudo_printf_t sudo_printf, char * const settings[],
+ sudo_printf_t sudo_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[])
+ int argc, char * const argv[], char * const user_env[], char * const args[],
+ const char **errstr)
{
int fd;
char path[PATH_MAX];
@@ -432,14 +437,14 @@ io_version(int verbose)
}
static int
-io_log_input(const char *buf, unsigned int len)
+io_log_input(const char *buf, unsigned int len, const char **errstr)
{
ignore_result(fwrite(buf, len, 1, input));
return true;
}
static int
-io_log_output(const char *buf, unsigned int len)
+io_log_output(const char *buf, unsigned int len, const char **errstr)
{
const char *cp, *ep;
bool ret = true;
@@ -471,7 +476,8 @@ sudo_dso_public struct policy_plugin sample_policy = {
NULL, /* invalidate */
NULL, /* init_session */
NULL, /* register_hooks */
- NULL /* deregister_hooks */
+ NULL, /* deregister_hooks */
+ NULL /* event_alloc() filled in by sudo */
};
/*
@@ -488,5 +494,10 @@ sudo_dso_public struct io_plugin sample_io = {
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 */
+ io_log_output, /* command stderr if not tty */
+ NULL, /* register_hooks */
+ NULL, /* deregister_hooks */
+ NULL, /* change_winsize */
+ NULL, /* log_suspend */
+ NULL /* event_alloc() filled in by sudo */
};
diff --git a/plugins/sample_approval/Makefile.in b/plugins/sample_approval/Makefile.in
index 212fe8d8e..fb3b435cd 100644
--- a/plugins/sample_approval/Makefile.in
+++ b/plugins/sample_approval/Makefile.in
@@ -191,8 +191,8 @@ check: check-fuzzer
check-verbose: check
clean:
- -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a *.i *.plog \
- stamp-* core *.core core.*
+ -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a
+ -rm -f *.i *.plog stamp-* core *.core core.*
mostlyclean: clean
diff --git a/plugins/sudoers/Makefile.in b/plugins/sudoers/Makefile.in
index 5cf8ef243..29110dcfd 100644
--- a/plugins/sudoers/Makefile.in
+++ b/plugins/sudoers/Makefile.in
@@ -47,6 +47,7 @@ LIBTOOL = @LIBTOOL@
SHA1SUM = @SHA1SUM@
FLEX = @FLEX@
YACC = @YACC@
+GREP = @GREP@
SED = @SED@
AWK = @AWK@
@@ -429,7 +430,7 @@ fuzz_policy_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_policy: fuzz_policy
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -456,7 +457,7 @@ fuzz_sudoers_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_sudoers: fuzz_sudoers
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -483,7 +484,7 @@ fuzz_sudoers_ldif_seed_corpus.zip:
rm -rf $$tdir
run-fuzz_sudoers_ldif: fuzz_sudoers_ldif
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -633,7 +634,7 @@ fuzz: run-fuzz_policy run-fuzz_sudoers run-fuzz_sudoers_ldif
check-fuzzer: $(FUZZ_PROGS)
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -652,7 +653,7 @@ check-fuzzer: $(FUZZ_PROGS)
check: $(TEST_PROGS) visudo testsudoers cvtsudoers check-fuzzer
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -1687,10 +1688,10 @@ fuzz_policy.o: $(srcdir)/regress/fuzz/fuzz_policy.c $(devdir)/def_data.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \
$(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.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 \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.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) $(HARDENING_CFLAGS) $(srcdir)/regress/fuzz/fuzz_policy.c
@@ -1699,10 +1700,10 @@ fuzz_policy.i: $(srcdir)/regress/fuzz/fuzz_policy.c $(devdir)/def_data.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \
$(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.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 \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.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) $<
@@ -2320,15 +2321,19 @@ 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 $@
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_plugin.h \
- $(incdir)/sudo_queue.h $(top_builddir)/config.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 $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.h $(top_srcdir)/src/sudo.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_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_plugin.h \
- $(incdir)/sudo_queue.h $(top_builddir)/config.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 $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.h $(top_srcdir)/src/sudo.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 $@
@@ -2808,18 +2813,20 @@ 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_eventlog.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 \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \
+ $(srcdir)/defaults.h $(srcdir)/interfaces.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) $(HARDENING_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_eventlog.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 \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \
+ $(srcdir)/defaults.h $(srcdir)/interfaces.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) $<
stubs.plog: stubs.i
@@ -3072,13 +3079,25 @@ timestamp.i: $(srcdir)/timestamp.c $(devdir)/def_data.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
+timestr.lo: $(srcdir)/timestr.c $(devdir)/def_data.h \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.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) $(HARDENING_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
+timestr.i: $(srcdir)/timestr.c $(devdir)/def_data.h \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.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) $<
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 $@
@@ -3172,9 +3191,27 @@ tsgetgrpw.i: $(srcdir)/tsgetgrpw.c $(devdir)/def_data.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 $@
-unesc_str.lo: $(srcdir)/unesc_str.c
+unesc_str.lo: $(srcdir)/unesc_str.c $(devdir)/def_data.h \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.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) $(HARDENING_CFLAGS) $(srcdir)/unesc_str.c
-unesc_str.i: $(srcdir)/unesc_str.c
+unesc_str.i: $(srcdir)/unesc_str.c $(devdir)/def_data.h \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.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) $<
unesc_str.plog: unesc_str.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/unesc_str.c --i-file $< --output-file $@
diff --git a/plugins/sudoers/audit.c b/plugins/sudoers/audit.c
index 0dfb99f72..5a03bfeec 100644
--- a/plugins/sudoers/audit.c
+++ b/plugins/sudoers/audit.c
@@ -208,7 +208,7 @@ audit_to_eventlog(struct eventlog *evlog, char * const command_info[],
debug_decl(audit_to_eventlog, SUDOERS_DEBUG_PLUGIN);
/* Fill in evlog from sudoers Defaults, run_argv and run_envp. */
- sudoers_to_eventlog(evlog, run_argv, run_envp, uuid_str);
+ sudoers_to_eventlog(evlog, NULL, run_argv, run_envp, uuid_str);
/* Update iolog and execution environment from command_info[]. */
if (command_info != NULL) {
@@ -261,7 +261,7 @@ log_server_accept(struct eventlog *evlog)
debug_return_bool(true);
} else {
/* Only send accept event to log server if I/O log plugin did not. */
- if (def_log_input || def_log_output)
+ if (iolog_enabled)
debug_return_bool(true);
}
@@ -341,6 +341,7 @@ sudoers_audit_accept(const char *plugin_name, unsigned int plugin_type,
{
const char *uuid_str = NULL;
struct eventlog evlog;
+ static bool first = true;
int ret = true;
debug_decl(sudoers_audit_accept, SUDOERS_DEBUG_PLUGIN);
@@ -366,6 +367,13 @@ sudoers_audit_accept(const char *plugin_name, unsigned int plugin_type,
ret = false;
}
+ if (first) {
+ /* log_subcmds doesn't go through sudo_policy_main again to set this. */
+ if (def_log_subcmds)
+ SET(sudo_mode, MODE_POLICY_INTERCEPTED);
+ first = false;
+ }
+
debug_return_int(ret);
}
@@ -432,7 +440,7 @@ sudoers_audit_error(const char *plugin_name, unsigned int plugin_type,
debug_return_int(ret);
}
-void
+static void
sudoers_audit_close(int status_type, int status)
{
log_server_exit(status_type, status);
diff --git a/plugins/sudoers/auth/bsdauth.c b/plugins/sudoers/auth/bsdauth.c
index 356efd713..c34785a3b 100644
--- a/plugins/sudoers/auth/bsdauth.c
+++ b/plugins/sudoers/auth/bsdauth.c
@@ -68,7 +68,7 @@ bsdauth_init(struct passwd *pw, sudo_auth *auth)
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);
+ state.lc = login_getclass(pw->pw_uid ? (char *)LOGIN_DEFCLASS : (char *)LOGIN_DEFROOTCLASS);
if (state.lc == NULL) {
log_warning(0,
N_("unable to get login class for user %s"), pw->pw_name);
@@ -82,7 +82,7 @@ bsdauth_init(struct passwd *pw, sudo_auth *auth)
}
/* XXX - maybe check the auth style earlier? */
- login_style = login_getstyle(state.lc, login_style, "auth-sudo");
+ login_style = login_getstyle(state.lc, login_style, (char *)"auth-sudo");
if (login_style == NULL) {
log_warningx(0, N_("invalid authentication type"));
auth_close(state.as);
@@ -170,7 +170,7 @@ bsdauth_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_con
if (!pass)
debug_return_int(AUTH_INTR);
- if ((s = auth_getvalue(as, "errormsg")) != NULL)
+ if ((s = auth_getvalue(as, (char *)"errormsg")) != NULL)
log_warningx(0, "%s", s);
debug_return_int(AUTH_FAILURE);
}
@@ -181,7 +181,7 @@ 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_approval(state->as, state->lc, pw->pw_name, (char *)"auth-sudo") == 0) {
if (auth_getstate(state->as) & AUTH_EXPIRED)
log_warningx(0, "%s", N_("your account has expired"));
else
diff --git a/plugins/sudoers/auth/pam.c b/plugins/sudoers/auth/pam.c
index eef26bb8a..4f6e89c85 100644
--- a/plugins/sudoers/auth/pam.c
+++ b/plugins/sudoers/auth/pam.c
@@ -90,7 +90,7 @@ 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 const char *def_prompt = PASSPROMPT;
static bool getpass_error;
static bool noninteractive;
static pam_handle_t *pamh;
diff --git a/plugins/sudoers/auth/sudo_auth.h b/plugins/sudoers/auth/sudo_auth.h
index d8780c496..de41e6fdc 100644
--- a/plugins/sudoers/auth/sudo_auth.h
+++ b/plugins/sudoers/auth/sudo_auth.h
@@ -29,7 +29,7 @@
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 */
+ const 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);
diff --git a/plugins/sudoers/check.c b/plugins/sudoers/check.c
index 6f5d9cc0a..d7bfd9ad1 100644
--- a/plugins/sudoers/check.c
+++ b/plugins/sudoers/check.c
@@ -165,6 +165,16 @@ check_user(int validated, int mode)
debug_decl(check_user, SUDOERS_DEBUG_AUTH);
/*
+ * In intercept mode, only check the user if configured to do so.
+ * We already have a session so no need to init the auth subsystem.
+ */
+ if (ISSET(sudo_mode, MODE_POLICY_INTERCEPTED)) {
+ if (!def_intercept_authenticate) {
+ debug_return_int(true);
+ }
+ }
+
+ /*
* Init authentication system regardless of whether we need a password.
* Required for proper PAM session support.
*/
@@ -215,8 +225,8 @@ done:
* 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))
+ if (ret == true && ISSET(validated, VALIDATE_SUCCESS)) {
+ if (ISSET(mode, MODE_UPDATE_TICKET) && closure.tstat != TS_ERROR)
(void)timestamp_update(closure.cookie, closure.auth_pw);
}
}
@@ -310,10 +320,6 @@ user_is_exempt(void)
bool ret = false;
debug_decl(user_is_exempt, SUDOERS_DEBUG_AUTH);
- if (ISSET(sudo_mode, MODE_POLICY_INTERCEPTED)) {
- if (!def_intercept_authenticate)
- ret = true;
- }
if (def_exempt_group) {
if (user_in_group(sudo_user.pw, def_exempt_group))
ret = true;
diff --git a/plugins/sudoers/check_aliases.c b/plugins/sudoers/check_aliases.c
index 959a220cc..1b3d03009 100644
--- a/plugins/sudoers/check_aliases.c
+++ b/plugins/sudoers/check_aliases.c
@@ -38,7 +38,7 @@ struct alias_warned {
};
SLIST_HEAD(alias_warned_list, alias_warned);
-static bool alias_warnx(const char *file, int line, int column, bool strict, bool quiet, const char *fmt, ...) __printflike(6, 7);
+static bool alias_warnx(const char *file, int line, int column, bool strict, bool quiet, const char *fmt, ...) sudo_printflike(6, 7);
static bool
alias_warned(struct alias_warned_list *warned, char *name)
diff --git a/plugins/sudoers/cvtsudoers.c b/plugins/sudoers/cvtsudoers.c
index 847c5c750..a6f17e9c8 100644
--- a/plugins/sudoers/cvtsudoers.c
+++ b/plugins/sudoers/cvtsudoers.c
@@ -87,8 +87,8 @@ static struct option long_opts[] = {
};
sudo_dso_public int main(int argc, char *argv[]);
-static void help(void) __attribute__((__noreturn__));
-static void usage(int);
+static sudo_noreturn void help(void);
+static sudo_noreturn void usage(void);
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);
@@ -207,7 +207,7 @@ main(int argc, char *argv[])
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);
+ usage();
}
break;
case 'l':
@@ -226,7 +226,7 @@ main(int argc, char *argv[])
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);
+ usage();
}
break;
case 'p':
@@ -236,7 +236,7 @@ main(int argc, char *argv[])
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);
+ usage();
}
break;
case 's':
@@ -256,7 +256,7 @@ main(int argc, char *argv[])
pwfile = optarg;
break;
default:
- usage(1);
+ usage();
}
}
argc -= optind;
@@ -275,7 +275,7 @@ main(int argc, char *argv[])
input_format = format_sudoers;
} else {
sudo_warnx(U_("unsupported input format %s"), conf->input_format);
- usage(1);
+ usage();
}
}
if (conf->output_format != NULL) {
@@ -293,23 +293,23 @@ main(int argc, char *argv[])
conf->store_options = false;
} else {
sudo_warnx(U_("unsupported output format %s"), conf->output_format);
- usage(1);
+ usage();
}
}
if (conf->filter != NULL) {
/* We always expand aliases when filtering (may change in future). */
if (!cvtsudoers_parse_filter(conf->filter))
- usage(1);
+ usage();
}
if (conf->defstr != NULL) {
conf->defaults = cvtsudoers_parse_defaults(conf->defstr);
if (conf->defaults == -1)
- usage(1);
+ usage();
}
if (conf->supstr != NULL) {
conf->suppress = cvtsudoers_parse_suppression(conf->supstr);
if (conf->suppress == -1)
- usage(1);
+ usage();
}
/* Apply padding to sudo_order if present. */
@@ -691,7 +691,7 @@ cvtsudoers_parse_filter(char *expression)
/* Parse keyword = value */
keyword = cp;
if ((cp = strchr(cp, '=')) == NULL) {
- sudo_warnx(U_("invalid filter: %s"), keyword);;
+ sudo_warnx(U_("invalid filter: %s"), keyword);
free(s);
debug_return_bool(false);
}
@@ -707,7 +707,7 @@ cvtsudoers_parse_filter(char *expression)
} else if (strcmp(keyword, "cmnd") == 0 || strcmp(keyword, "cmd") == 0) {
STAILQ_INSERT_TAIL(&filters->cmnds, s, entries);
} else {
- sudo_warnx(U_("invalid filter: %s"), keyword);;
+ sudo_warnx(U_("invalid filter: %s"), keyword);
free(s);
debug_return_bool(false);
}
@@ -787,7 +787,7 @@ userlist_matches_filter(struct sudoers_parse_tree *parse_tree,
* can do its thing.
*/
memset(&pw, 0, sizeof(pw));
- pw.pw_name = "_nobody";
+ pw.pw_name = (char *)"_nobody";
pw.pw_uid = (uid_t)-1;
pw.pw_gid = (gid_t)-1;
@@ -1384,7 +1384,7 @@ alias_prune_helper(struct sudoers_parse_tree *parse_tree, struct alias *a,
{
struct cvtsudoers_config *conf = v;
- /* XXX - misue of these functions */
+ /* XXX - misuse of these functions */
switch (a->type) {
case USERALIAS:
userlist_matches_filter(parse_tree, &a->members, conf);
@@ -1485,21 +1485,26 @@ done:
}
static void
-usage(int fatal)
+print_usage(FILE *fp)
{
- (void) fprintf(fatal ? stderr : stdout, "usage: %s [-ehMpV] [-b dn] "
+ (void) fprintf(fp, "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(EXIT_FAILURE);
+}
+
+static void
+usage(void)
+{
+ print_usage(stderr);
+ exit(EXIT_FAILURE);
}
static void
help(void)
{
(void) printf(_("%s - convert between sudoers file formats\n\n"), getprogname());
- usage(0);
+ print_usage(stdout);
(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"
diff --git a/plugins/sudoers/cvtsudoers.h b/plugins/sudoers/cvtsudoers.h
index cf48d1a9a..6aaaeb2fd 100644
--- a/plugins/sudoers/cvtsudoers.h
+++ b/plugins/sudoers/cvtsudoers.h
@@ -87,7 +87,7 @@ struct cvtsudoers_filter {
/* cvtsudoers.c */
extern struct cvtsudoers_filter *filters;
-void log_warnx(const char *fmt, ...) __printflike(1, 2);
+void log_warnx(const char *fmt, ...) sudo_printflike(1, 2);
/* cvtsudoers_csv.c */
bool convert_sudoers_csv(struct sudoers_parse_tree *parse_tree, const char *output_file, struct cvtsudoers_config *conf);
diff --git a/plugins/sudoers/cvtsudoers_csv.c b/plugins/sudoers/cvtsudoers_csv.c
index 63512c5dc..aa96c5d63 100644
--- a/plugins/sudoers/cvtsudoers_csv.c
+++ b/plugins/sudoers/cvtsudoers_csv.c
@@ -167,7 +167,7 @@ format_cmnd(struct sudo_command *c, bool negated)
int len;
debug_decl(format_cmnd, SUDOERS_DEBUG_UTIL);
- cmnd = c->cmnd ? c->cmnd : "ALL";
+ cmnd = c->cmnd ? c->cmnd : (char *)"ALL";
bufsiz = negated + strlen(cmnd) + 1;
if (c->args != NULL)
bufsiz += 1 + strlen(c->args);
@@ -597,7 +597,7 @@ print_cmndspec_csv(FILE *fp, struct sudoers_parse_tree *parse_tree,
|| cs->role != next->role || cs->type != next->type
#endif /* HAVE_SELINUX */
#ifdef HAVE_APPARMOR
- || cs->apparmor_profile != next->apparmor_profile
+ || cs->apparmor_profile != next->apparmor_profile
#endif /* HAVE_APPARMOR */
|| cs->runchroot != next->runchroot || cs->runcwd != next->runcwd;
diff --git a/plugins/sudoers/cvtsudoers_json.c b/plugins/sudoers/cvtsudoers_json.c
index a89ef82b3..ab686e1d7 100644
--- a/plugins/sudoers/cvtsudoers_json.c
+++ b/plugins/sudoers/cvtsudoers_json.c
@@ -77,7 +77,7 @@ print_command_json(struct json_container *jsonc, const char *name, bool negated)
}
}
value.type = JSON_STRING;
- value.u.string = cmnd ? cmnd : "ALL";
+ value.u.string = cmnd ? cmnd : (char *)"ALL";
if (!negated && TAILQ_EMPTY(&c->digests)) {
/* Print as { "command": "command and args" } */
@@ -759,13 +759,13 @@ print_cmndspec_json(struct json_container *jsonc,
#endif /* HAVE_SELINUX */
#ifdef HAVE_APPARMOR
- if (cs->apparmor_profile != NULL) {
+ if (cs->apparmor_profile != NULL) {
sudo_json_open_array(jsonc, "AppArmor_Spec");
value.type = JSON_STRING;
value.u.string = cs->apparmor_profile;
sudo_json_add_value(jsonc, "apparmor_profile", &value);
sudo_json_close_array(jsonc);
- }
+ }
#endif /* HAVE_APPARMOR */
#ifdef HAVE_PRIV_SET
diff --git a/plugins/sudoers/cvtsudoers_ldif.c b/plugins/sudoers/cvtsudoers_ldif.c
index 91acfcd86..9be75e504 100644
--- a/plugins/sudoers/cvtsudoers_ldif.c
+++ b/plugins/sudoers/cvtsudoers_ldif.c
@@ -219,7 +219,7 @@ format_cmnd(struct sudo_command *c, bool negated)
int len;
debug_decl(format_cmnd, SUDOERS_DEBUG_UTIL);
- cmnd = c->cmnd ? c->cmnd : "ALL";
+ cmnd = c->cmnd ? c->cmnd : (char *)"ALL";
bufsiz = negated + strlen(cmnd) + 1;
if (c->args != NULL)
bufsiz += 1 + strlen(c->args);
@@ -461,15 +461,15 @@ print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree,
#endif /* HAVE_SELINUX */
#ifdef HAVE_APPARMOR
- /* Print AppArmor profile */
- if (cs->apparmor_profile != NULL) {
- if (asprintf(&attr_val, "apparmor_profile=%s", cs->apparmor_profile) == -1) {
- sudo_fatalx(U_("%s: %s"), __func__,
- U_("unable to allocate memory"));
- }
- print_attribute_ldif(fp, "sudoOption", attr_val);
- free(attr_val);
+ /* Print AppArmor profile */
+ if (cs->apparmor_profile != NULL) {
+ if (asprintf(&attr_val, "apparmor_profile=%s", cs->apparmor_profile) == -1) {
+ sudo_fatalx(U_("%s: %s"), __func__,
+ U_("unable to allocate memory"));
}
+ print_attribute_ldif(fp, "sudoOption", attr_val);
+ free(attr_val);
+ }
#endif /* HAVE_APPARMOR */
#ifdef HAVE_PRIV_SET
diff --git a/plugins/sudoers/cvtsudoers_merge.c b/plugins/sudoers/cvtsudoers_merge.c
index dde5b9b37..bd62cc068 100644
--- a/plugins/sudoers/cvtsudoers_merge.c
+++ b/plugins/sudoers/cvtsudoers_merge.c
@@ -978,11 +978,11 @@ cmndspec_equivalent(struct cmndspec *cs1, struct cmndspec *cs2, bool check_negat
#endif
#ifdef HAVE_APPARMOR
if (cs1->apparmor_profile != NULL && cs2->apparmor_profile != NULL) {
- if (strcmp(cs1->apparmor_profile, cs2->apparmor_profile) != 0)
- debug_return_bool(false);
- } else if (cs1->apparmor_profile != cs2->apparmor_profile) {
- debug_return_bool(false);
- }
+ if (strcmp(cs1->apparmor_profile, cs2->apparmor_profile) != 0)
+ debug_return_bool(false);
+ } else if (cs1->apparmor_profile != cs2->apparmor_profile) {
+ debug_return_bool(false);
+ }
#endif
#ifdef HAVE_PRIV_SET
if (cs1->privs != NULL && cs2->privs != NULL) {
diff --git a/plugins/sudoers/cvtsudoers_pwutil.c b/plugins/sudoers/cvtsudoers_pwutil.c
index a7b163e91..6b30d03ac 100644
--- a/plugins/sudoers/cvtsudoers_pwutil.c
+++ b/plugins/sudoers/cvtsudoers_pwutil.c
@@ -126,11 +126,11 @@ cvtsudoers_make_pwitem(uid_t uid, const char *name)
/* Fake up a passwd struct. */
memset(&pw, 0, sizeof(pw));
pw.pw_name = name ? s->str : uidstr;
- pw.pw_passwd = "*";
+ pw.pw_passwd = (char *)"*";
pw.pw_uid = uid;
pw.pw_gid = (gid_t)-1;
- pw.pw_shell = _PATH_BSHELL;
- pw.pw_dir = "/";
+ pw.pw_shell = (char *)_PATH_BSHELL;
+ pw.pw_dir = (char *)"/";
/* Allocate in one big chunk for easy freeing. */
total = sizeof(*pwitem);
diff --git a/plugins/sudoers/def_data.c b/plugins/sudoers/def_data.c
index 41de8fc0b..b8c1212d2 100644
--- a/plugins/sudoers/def_data.c
+++ b/plugins/sudoers/def_data.c
@@ -352,10 +352,30 @@ struct sudo_defs_types sudo_defs_table[] = {
N_("Log user's input for the command being run"),
NULL,
}, {
+ "log_stdin", T_FLAG,
+ N_("Log the command's standard input if not connected to a terminal"),
+ NULL,
+ }, {
+ "log_ttyin", T_FLAG,
+ N_("Log the user's terminal input for the command being run"),
+ NULL,
+ }, {
"log_output", T_FLAG,
N_("Log the output of the command being run"),
NULL,
}, {
+ "log_stdout", T_FLAG,
+ N_("Log the command's standard output if not connected to a terminal"),
+ NULL,
+ }, {
+ "log_stderr", T_FLAG,
+ N_("Log the command's standard error if not connected to a terminal"),
+ NULL,
+ }, {
+ "log_ttyout", T_FLAG,
+ N_("Log the terminal output of the command being run"),
+ NULL,
+ }, {
"compress_io", T_FLAG,
N_("Compress I/O logs using zlib"),
NULL,
@@ -668,6 +688,10 @@ struct sudo_defs_types sudo_defs_table[] = {
N_("The mechanism used by the intercept and log_subcmds options: %s"),
def_data_intercept_type,
}, {
+ "intercept_verify", T_FLAG,
+ N_("Attempt to verify the command and arguments after execution"),
+ NULL,
+ }, {
"apparmor_profile", T_STR,
N_("AppArmor profile to use in the new security context: %s"),
NULL,
diff --git a/plugins/sudoers/def_data.h b/plugins/sudoers/def_data.h
index 38de4386b..5c244a45c 100644
--- a/plugins/sudoers/def_data.h
+++ b/plugins/sudoers/def_data.h
@@ -150,165 +150,177 @@
#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 I_LOG_STDIN 75
+#define def_log_stdin (sudo_defs_table[I_LOG_STDIN].sd_un.flag)
+#define I_LOG_TTYIN 76
+#define def_log_ttyin (sudo_defs_table[I_LOG_TTYIN].sd_un.flag)
+#define I_LOG_OUTPUT 77
#define def_log_output (sudo_defs_table[I_LOG_OUTPUT].sd_un.flag)
-#define I_COMPRESS_IO 76
+#define I_LOG_STDOUT 78
+#define def_log_stdout (sudo_defs_table[I_LOG_STDOUT].sd_un.flag)
+#define I_LOG_STDERR 79
+#define def_log_stderr (sudo_defs_table[I_LOG_STDERR].sd_un.flag)
+#define I_LOG_TTYOUT 80
+#define def_log_ttyout (sudo_defs_table[I_LOG_TTYOUT].sd_un.flag)
+#define I_COMPRESS_IO 81
#define def_compress_io (sudo_defs_table[I_COMPRESS_IO].sd_un.flag)
-#define I_USE_PTY 77
+#define I_USE_PTY 82
#define def_use_pty (sudo_defs_table[I_USE_PTY].sd_un.flag)
-#define I_GROUP_PLUGIN 78
+#define I_GROUP_PLUGIN 83
#define def_group_plugin (sudo_defs_table[I_GROUP_PLUGIN].sd_un.str)
-#define I_IOLOG_DIR 79
+#define I_IOLOG_DIR 84
#define def_iolog_dir (sudo_defs_table[I_IOLOG_DIR].sd_un.str)
-#define I_IOLOG_FILE 80
+#define I_IOLOG_FILE 85
#define def_iolog_file (sudo_defs_table[I_IOLOG_FILE].sd_un.str)
-#define I_SET_UTMP 81
+#define I_SET_UTMP 86
#define def_set_utmp (sudo_defs_table[I_SET_UTMP].sd_un.flag)
-#define I_UTMP_RUNAS 82
+#define I_UTMP_RUNAS 87
#define def_utmp_runas (sudo_defs_table[I_UTMP_RUNAS].sd_un.flag)
-#define I_PRIVS 83
+#define I_PRIVS 88
#define def_privs (sudo_defs_table[I_PRIVS].sd_un.str)
-#define I_LIMITPRIVS 84
+#define I_LIMITPRIVS 89
#define def_limitprivs (sudo_defs_table[I_LIMITPRIVS].sd_un.str)
-#define I_EXEC_BACKGROUND 85
+#define I_EXEC_BACKGROUND 90
#define def_exec_background (sudo_defs_table[I_EXEC_BACKGROUND].sd_un.flag)
-#define I_PAM_SERVICE 86
+#define I_PAM_SERVICE 91
#define def_pam_service (sudo_defs_table[I_PAM_SERVICE].sd_un.str)
-#define I_PAM_LOGIN_SERVICE 87
+#define I_PAM_LOGIN_SERVICE 92
#define def_pam_login_service (sudo_defs_table[I_PAM_LOGIN_SERVICE].sd_un.str)
-#define I_PAM_ASKPASS_SERVICE 88
+#define I_PAM_ASKPASS_SERVICE 93
#define def_pam_askpass_service (sudo_defs_table[I_PAM_ASKPASS_SERVICE].sd_un.str)
-#define I_PAM_SETCRED 89
+#define I_PAM_SETCRED 94
#define def_pam_setcred (sudo_defs_table[I_PAM_SETCRED].sd_un.flag)
-#define I_PAM_SESSION 90
+#define I_PAM_SESSION 95
#define def_pam_session (sudo_defs_table[I_PAM_SESSION].sd_un.flag)
-#define I_PAM_ACCT_MGMT 91
+#define I_PAM_ACCT_MGMT 96
#define def_pam_acct_mgmt (sudo_defs_table[I_PAM_ACCT_MGMT].sd_un.flag)
-#define I_MAXSEQ 92
+#define I_MAXSEQ 97
#define def_maxseq (sudo_defs_table[I_MAXSEQ].sd_un.str)
-#define I_USE_NETGROUPS 93
+#define I_USE_NETGROUPS 98
#define def_use_netgroups (sudo_defs_table[I_USE_NETGROUPS].sd_un.flag)
-#define I_SUDOEDIT_CHECKDIR 94
+#define I_SUDOEDIT_CHECKDIR 99
#define def_sudoedit_checkdir (sudo_defs_table[I_SUDOEDIT_CHECKDIR].sd_un.flag)
-#define I_SUDOEDIT_FOLLOW 95
+#define I_SUDOEDIT_FOLLOW 100
#define def_sudoedit_follow (sudo_defs_table[I_SUDOEDIT_FOLLOW].sd_un.flag)
-#define I_ALWAYS_QUERY_GROUP_PLUGIN 96
+#define I_ALWAYS_QUERY_GROUP_PLUGIN 101
#define def_always_query_group_plugin (sudo_defs_table[I_ALWAYS_QUERY_GROUP_PLUGIN].sd_un.flag)
-#define I_NETGROUP_TUPLE 97
+#define I_NETGROUP_TUPLE 102
#define def_netgroup_tuple (sudo_defs_table[I_NETGROUP_TUPLE].sd_un.flag)
-#define I_IGNORE_AUDIT_ERRORS 98
+#define I_IGNORE_AUDIT_ERRORS 103
#define def_ignore_audit_errors (sudo_defs_table[I_IGNORE_AUDIT_ERRORS].sd_un.flag)
-#define I_IGNORE_IOLOG_ERRORS 99
+#define I_IGNORE_IOLOG_ERRORS 104
#define def_ignore_iolog_errors (sudo_defs_table[I_IGNORE_IOLOG_ERRORS].sd_un.flag)
-#define I_IGNORE_LOGFILE_ERRORS 100
+#define I_IGNORE_LOGFILE_ERRORS 105
#define def_ignore_logfile_errors (sudo_defs_table[I_IGNORE_LOGFILE_ERRORS].sd_un.flag)
-#define I_MATCH_GROUP_BY_GID 101
+#define I_MATCH_GROUP_BY_GID 106
#define def_match_group_by_gid (sudo_defs_table[I_MATCH_GROUP_BY_GID].sd_un.flag)
-#define I_SYSLOG_MAXLEN 102
+#define I_SYSLOG_MAXLEN 107
#define def_syslog_maxlen (sudo_defs_table[I_SYSLOG_MAXLEN].sd_un.uival)
-#define I_IOLOG_USER 103
+#define I_IOLOG_USER 108
#define def_iolog_user (sudo_defs_table[I_IOLOG_USER].sd_un.str)
-#define I_IOLOG_GROUP 104
+#define I_IOLOG_GROUP 109
#define def_iolog_group (sudo_defs_table[I_IOLOG_GROUP].sd_un.str)
-#define I_IOLOG_MODE 105
+#define I_IOLOG_MODE 110
#define def_iolog_mode (sudo_defs_table[I_IOLOG_MODE].sd_un.mode)
-#define I_FDEXEC 106
+#define I_FDEXEC 111
#define def_fdexec (sudo_defs_table[I_FDEXEC].sd_un.tuple)
-#define I_IGNORE_UNKNOWN_DEFAULTS 107
+#define I_IGNORE_UNKNOWN_DEFAULTS 112
#define def_ignore_unknown_defaults (sudo_defs_table[I_IGNORE_UNKNOWN_DEFAULTS].sd_un.flag)
-#define I_COMMAND_TIMEOUT 108
+#define I_COMMAND_TIMEOUT 113
#define def_command_timeout (sudo_defs_table[I_COMMAND_TIMEOUT].sd_un.ival)
-#define I_USER_COMMAND_TIMEOUTS 109
+#define I_USER_COMMAND_TIMEOUTS 114
#define def_user_command_timeouts (sudo_defs_table[I_USER_COMMAND_TIMEOUTS].sd_un.flag)
-#define I_IOLOG_FLUSH 110
+#define I_IOLOG_FLUSH 115
#define def_iolog_flush (sudo_defs_table[I_IOLOG_FLUSH].sd_un.flag)
-#define I_SYSLOG_PID 111
+#define I_SYSLOG_PID 116
#define def_syslog_pid (sudo_defs_table[I_SYSLOG_PID].sd_un.flag)
-#define I_TIMESTAMP_TYPE 112
+#define I_TIMESTAMP_TYPE 117
#define def_timestamp_type (sudo_defs_table[I_TIMESTAMP_TYPE].sd_un.tuple)
-#define I_AUTHFAIL_MESSAGE 113
+#define I_AUTHFAIL_MESSAGE 118
#define def_authfail_message (sudo_defs_table[I_AUTHFAIL_MESSAGE].sd_un.str)
-#define I_CASE_INSENSITIVE_USER 114
+#define I_CASE_INSENSITIVE_USER 119
#define def_case_insensitive_user (sudo_defs_table[I_CASE_INSENSITIVE_USER].sd_un.flag)
-#define I_CASE_INSENSITIVE_GROUP 115
+#define I_CASE_INSENSITIVE_GROUP 120
#define def_case_insensitive_group (sudo_defs_table[I_CASE_INSENSITIVE_GROUP].sd_un.flag)
-#define I_LOG_ALLOWED 116
+#define I_LOG_ALLOWED 121
#define def_log_allowed (sudo_defs_table[I_LOG_ALLOWED].sd_un.flag)
-#define I_LOG_DENIED 117
+#define I_LOG_DENIED 122
#define def_log_denied (sudo_defs_table[I_LOG_DENIED].sd_un.flag)
-#define I_LOG_SERVERS 118
+#define I_LOG_SERVERS 123
#define def_log_servers (sudo_defs_table[I_LOG_SERVERS].sd_un.list)
-#define I_LOG_SERVER_TIMEOUT 119
+#define I_LOG_SERVER_TIMEOUT 124
#define def_log_server_timeout (sudo_defs_table[I_LOG_SERVER_TIMEOUT].sd_un.ival)
-#define I_LOG_SERVER_KEEPALIVE 120
+#define I_LOG_SERVER_KEEPALIVE 125
#define def_log_server_keepalive (sudo_defs_table[I_LOG_SERVER_KEEPALIVE].sd_un.flag)
-#define I_LOG_SERVER_CABUNDLE 121
+#define I_LOG_SERVER_CABUNDLE 126
#define def_log_server_cabundle (sudo_defs_table[I_LOG_SERVER_CABUNDLE].sd_un.str)
-#define I_LOG_SERVER_PEER_CERT 122
+#define I_LOG_SERVER_PEER_CERT 127
#define def_log_server_peer_cert (sudo_defs_table[I_LOG_SERVER_PEER_CERT].sd_un.str)
-#define I_LOG_SERVER_PEER_KEY 123
+#define I_LOG_SERVER_PEER_KEY 128
#define def_log_server_peer_key (sudo_defs_table[I_LOG_SERVER_PEER_KEY].sd_un.str)
-#define I_LOG_SERVER_VERIFY 124
+#define I_LOG_SERVER_VERIFY 129
#define def_log_server_verify (sudo_defs_table[I_LOG_SERVER_VERIFY].sd_un.flag)
-#define I_RUNAS_ALLOW_UNKNOWN_ID 125
+#define I_RUNAS_ALLOW_UNKNOWN_ID 130
#define def_runas_allow_unknown_id (sudo_defs_table[I_RUNAS_ALLOW_UNKNOWN_ID].sd_un.flag)
-#define I_RUNAS_CHECK_SHELL 126
+#define I_RUNAS_CHECK_SHELL 131
#define def_runas_check_shell (sudo_defs_table[I_RUNAS_CHECK_SHELL].sd_un.flag)
-#define I_PAM_RUSER 127
+#define I_PAM_RUSER 132
#define def_pam_ruser (sudo_defs_table[I_PAM_RUSER].sd_un.flag)
-#define I_PAM_RHOST 128
+#define I_PAM_RHOST 133
#define def_pam_rhost (sudo_defs_table[I_PAM_RHOST].sd_un.flag)
-#define I_RUNCWD 129
+#define I_RUNCWD 134
#define def_runcwd (sudo_defs_table[I_RUNCWD].sd_un.str)
-#define I_RUNCHROOT 130
+#define I_RUNCHROOT 135
#define def_runchroot (sudo_defs_table[I_RUNCHROOT].sd_un.str)
-#define I_LOG_FORMAT 131
+#define I_LOG_FORMAT 136
#define def_log_format (sudo_defs_table[I_LOG_FORMAT].sd_un.tuple)
-#define I_SELINUX 132
+#define I_SELINUX 137
#define def_selinux (sudo_defs_table[I_SELINUX].sd_un.flag)
-#define I_ADMIN_FLAG 133
+#define I_ADMIN_FLAG 138
#define def_admin_flag (sudo_defs_table[I_ADMIN_FLAG].sd_un.str)
-#define I_INTERCEPT 134
+#define I_INTERCEPT 139
#define def_intercept (sudo_defs_table[I_INTERCEPT].sd_un.flag)
-#define I_LOG_SUBCMDS 135
+#define I_LOG_SUBCMDS 140
#define def_log_subcmds (sudo_defs_table[I_LOG_SUBCMDS].sd_un.flag)
-#define I_LOG_EXIT_STATUS 136
+#define I_LOG_EXIT_STATUS 141
#define def_log_exit_status (sudo_defs_table[I_LOG_EXIT_STATUS].sd_un.flag)
-#define I_INTERCEPT_AUTHENTICATE 137
+#define I_INTERCEPT_AUTHENTICATE 142
#define def_intercept_authenticate (sudo_defs_table[I_INTERCEPT_AUTHENTICATE].sd_un.flag)
-#define I_INTERCEPT_ALLOW_SETID 138
+#define I_INTERCEPT_ALLOW_SETID 143
#define def_intercept_allow_setid (sudo_defs_table[I_INTERCEPT_ALLOW_SETID].sd_un.flag)
-#define I_RLIMIT_AS 139
+#define I_RLIMIT_AS 144
#define def_rlimit_as (sudo_defs_table[I_RLIMIT_AS].sd_un.str)
-#define I_RLIMIT_CORE 140
+#define I_RLIMIT_CORE 145
#define def_rlimit_core (sudo_defs_table[I_RLIMIT_CORE].sd_un.str)
-#define I_RLIMIT_CPU 141
+#define I_RLIMIT_CPU 146
#define def_rlimit_cpu (sudo_defs_table[I_RLIMIT_CPU].sd_un.str)
-#define I_RLIMIT_DATA 142
+#define I_RLIMIT_DATA 147
#define def_rlimit_data (sudo_defs_table[I_RLIMIT_DATA].sd_un.str)
-#define I_RLIMIT_FSIZE 143
+#define I_RLIMIT_FSIZE 148
#define def_rlimit_fsize (sudo_defs_table[I_RLIMIT_FSIZE].sd_un.str)
-#define I_RLIMIT_LOCKS 144
+#define I_RLIMIT_LOCKS 149
#define def_rlimit_locks (sudo_defs_table[I_RLIMIT_LOCKS].sd_un.str)
-#define I_RLIMIT_MEMLOCK 145
+#define I_RLIMIT_MEMLOCK 150
#define def_rlimit_memlock (sudo_defs_table[I_RLIMIT_MEMLOCK].sd_un.str)
-#define I_RLIMIT_NOFILE 146
+#define I_RLIMIT_NOFILE 151
#define def_rlimit_nofile (sudo_defs_table[I_RLIMIT_NOFILE].sd_un.str)
-#define I_RLIMIT_NPROC 147
+#define I_RLIMIT_NPROC 152
#define def_rlimit_nproc (sudo_defs_table[I_RLIMIT_NPROC].sd_un.str)
-#define I_RLIMIT_RSS 148
+#define I_RLIMIT_RSS 153
#define def_rlimit_rss (sudo_defs_table[I_RLIMIT_RSS].sd_un.str)
-#define I_RLIMIT_STACK 149
+#define I_RLIMIT_STACK 154
#define def_rlimit_stack (sudo_defs_table[I_RLIMIT_STACK].sd_un.str)
-#define I_NONINTERACTIVE_AUTH 150
+#define I_NONINTERACTIVE_AUTH 155
#define def_noninteractive_auth (sudo_defs_table[I_NONINTERACTIVE_AUTH].sd_un.flag)
-#define I_LOG_PASSWORDS 151
+#define I_LOG_PASSWORDS 156
#define def_log_passwords (sudo_defs_table[I_LOG_PASSWORDS].sd_un.flag)
-#define I_PASSPROMPT_REGEX 152
+#define I_PASSPROMPT_REGEX 157
#define def_passprompt_regex (sudo_defs_table[I_PASSPROMPT_REGEX].sd_un.list)
-#define I_INTERCEPT_TYPE 153
+#define I_INTERCEPT_TYPE 158
#define def_intercept_type (sudo_defs_table[I_INTERCEPT_TYPE].sd_un.tuple)
-#define I_APPARMOR_PROFILE 154
+#define I_INTERCEPT_VERIFY 159
+#define def_intercept_verify (sudo_defs_table[I_INTERCEPT_VERIFY].sd_un.flag)
+#define I_APPARMOR_PROFILE 160
#define def_apparmor_profile (sudo_defs_table[I_APPARMOR_PROFILE].sd_un.str)
enum def_tuple {
diff --git a/plugins/sudoers/def_data.in b/plugins/sudoers/def_data.in
index 6372048c9..4d627e64b 100644
--- a/plugins/sudoers/def_data.in
+++ b/plugins/sudoers/def_data.in
@@ -238,9 +238,24 @@ umask_override
log_input
T_FLAG
"Log user's input for the command being run"
+log_stdin
+ T_FLAG
+ "Log the command's standard input if not connected to a terminal"
+log_ttyin
+ T_FLAG
+ "Log the user's terminal input for the command being run"
log_output
T_FLAG
"Log the output of the command being run"
+log_stdout
+ T_FLAG
+ "Log the command's standard output if not connected to a terminal"
+log_stderr
+ T_FLAG
+ "Log the command's standard error if not connected to a terminal"
+log_ttyout
+ T_FLAG
+ "Log the terminal output of the command being run"
compress_io
T_FLAG
"Compress I/O logs using zlib"
@@ -479,6 +494,9 @@ intercept_type
T_TUPLE
"The mechanism used by the intercept and log_subcmds options: %s"
dso trace
+intercept_verify
+ T_FLAG
+ "Attempt to verify the command and arguments after execution"
apparmor_profile
T_STR
- "AppArmor profile to use in the new security context: %s" \ No newline at end of file
+ "AppArmor profile to use in the new security context: %s"
diff --git a/plugins/sudoers/defaults.c b/plugins/sudoers/defaults.c
index ec6b64fe9..e90be1f64 100644
--- a/plugins/sudoers/defaults.c
+++ b/plugins/sudoers/defaults.c
@@ -73,7 +73,7 @@ static bool store_timespec(const char *str, struct sudo_defs_types *def);
static bool store_rlimit(const char *str, struct sudo_defs_types *def);
static bool list_op(const char *str, size_t, struct list_members *list, enum list_ops op);
static bool valid_path(struct sudo_defs_types *def, const char *val, const char *file, int line, int column, bool quiet);
-static bool defaults_warnx(const char *file, int line, int column, bool quiet, const char *fmt, ...) __printflike(5, 6);
+static bool defaults_warnx(const char *file, int line, int column, bool quiet, const char *fmt, ...) sudo_printflike(5, 6);
/*
* Table describing compile-time and run-time options.
@@ -89,7 +89,7 @@ dump_defaults(void)
struct sudo_defs_types *cur;
struct list_member *item;
struct def_values *def;
- char *desc;
+ const char *desc;
debug_decl(dump_defaults, SUDOERS_DEBUG_DEFAULTS);
for (cur = sudo_defs_table; cur->name; cur++) {
@@ -549,6 +549,7 @@ init_defaults(void)
if ((def_rlimit_core = strdup("0,0")) == NULL)
goto oom;
def_intercept_type = dso;
+ def_intercept_verify = true;
def_netgroup_tuple = false;
def_sudoedit_checkdir = true;
def_iolog_mode = S_IRUSR|S_IWUSR;
diff --git a/plugins/sudoers/defaults.h b/plugins/sudoers/defaults.h
index 7e9d44fb6..f0bf88ebf 100644
--- a/plugins/sudoers/defaults.h
+++ b/plugins/sudoers/defaults.h
@@ -43,7 +43,7 @@ enum list_ops {
/* Mapping of tuple string value to enum def_tuple. */
struct def_values {
- char *sval; /* string value */
+ const char *sval; /* string value */
enum def_tuple nval;/* numeric value */
};
@@ -62,9 +62,9 @@ union sudo_defs_val {
* Structure describing compile-time and run-time options.
*/
struct sudo_defs_types {
- char *name;
+ const char *name;
int type;
- char *desc;
+ const char *desc;
struct def_values *values;
bool (*callback)(const char *file, int line, int column, const union sudo_defs_val *, int op);
union sudo_defs_val sd_un;
@@ -132,6 +132,11 @@ struct early_default {
#define SETDEF_ALL (SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER|SETDEF_RUNAS|SETDEF_CMND)
/*
+ * Convenience macros
+ */
+#define iolog_enabled (def_log_stdin || def_log_ttyin || def_log_stdout || def_log_stderr || def_log_ttyout)
+
+/*
* Prototypes
*/
struct defaults_list;
diff --git a/plugins/sudoers/editor.c b/plugins/sudoers/editor.c
index db55fc719..5ca4eb0af 100644
--- a/plugins/sudoers/editor.c
+++ b/plugins/sudoers/editor.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2010-2015 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2010-2015, 2020-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -103,10 +103,8 @@ copy_arg(const char *src, size_t len)
if ((copy = malloc(len + 1)) != NULL) {
sudoers_gc_add(GC_PTR, copy);
for (dst = copy; src < src_end; ) {
- if (src[0] == '\\' && src[1] != '\0') {
+ if (src[0] == '\\' && src[1] != '\0')
src++;
- continue;
- }
*dst++ = *src++;
}
*dst = '\0';
@@ -126,7 +124,7 @@ copy_arg(const char *src, size_t len)
* as well as the argument vector.
*/
static char *
-resolve_editor(const char *ed, size_t edlen, int nfiles, char **files,
+resolve_editor(const char *ed, size_t edlen, int nfiles, char * const *files,
int *argc_out, char ***argv_out, char * const *allowlist)
{
char **nargv = NULL, *editor = NULL, *editor_path = NULL;
@@ -177,7 +175,7 @@ resolve_editor(const char *ed, size_t edlen, int nfiles, char **files,
goto oom;
}
if (nfiles != 0) {
- nargv[nargc++] = "--";
+ nargv[nargc++] = (char *)"--";
while (nfiles--)
nargv[nargc++] = *files++;
}
@@ -211,10 +209,11 @@ oom:
* as well as the argument vector.
*/
char *
-find_editor(int nfiles, char **files, int *argc_out, char ***argv_out,
+find_editor(int nfiles, char * const *files, int *argc_out, char ***argv_out,
char * const *allowlist, const char **env_editor)
{
- char *ev[3], *editor_path = NULL;
+ char *editor_path = NULL;
+ const char *ev[3];
unsigned int i;
debug_decl(find_editor, SUDOERS_DEBUG_UTIL);
diff --git a/plugins/sudoers/env.c b/plugins/sudoers/env.c
index 82dc61832..887d6468f 100644
--- a/plugins/sudoers/env.c
+++ b/plugins/sudoers/env.c
@@ -224,6 +224,7 @@ static const char *initial_keepenv_table[] = {
"PS2",
"XAUTHORITY",
"XAUTHORIZATION",
+ "XDG_CURRENT_DESKTOP",
NULL
};
@@ -314,9 +315,22 @@ int
sudo_putenv_nodebug(char *str, bool dupcheck, bool overwrite)
{
char **ep;
- size_t len;
+ const char *equal;
bool found = false;
+ /* Some putenv(3) implementations check for NULL. */
+ if (str == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* The string must contain a '=' char but not start with one. */
+ equal = strchr(str, '=');
+ if (equal == NULL || equal == str) {
+ errno = EINVAL;
+ return -1;
+ }
+
/* 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;
@@ -358,7 +372,7 @@ sudo_putenv_nodebug(char *str, bool dupcheck, bool overwrite)
#endif
if (dupcheck) {
- len = (strchr(str, '=') - str) + 1;
+ size_t len = (size_t)(equal - str) + 1;
for (ep = env.envp; *ep != NULL; ep++) {
if (strncmp(str, *ep, len) == 0) {
if (overwrite)
@@ -818,13 +832,13 @@ env_update_didvar(const char *ep, unsigned int *didvar)
}
#define CHECK_PUTENV(a, b, c) do { \
- if (sudo_putenv((a), (b), (c)) == -1) { \
+ if (sudo_putenv((char *)(a), (b), (c)) == -1) { \
goto bad; \
} \
} while (0)
#define CHECK_SETENV2(a, b, c, d) do { \
- if (sudo_setenv2((a), (b), (c), (d)) == -1) { \
+ if (sudo_setenv2((char *)(a), (b), (c), (d)) == -1) { \
goto bad; \
} \
} while (0)
diff --git a/plugins/sudoers/exptilde.c b/plugins/sudoers/exptilde.c
index 00ab0ac5c..b6e8a602b 100644
--- a/plugins/sudoers/exptilde.c
+++ b/plugins/sudoers/exptilde.c
@@ -74,7 +74,7 @@ expand_tilde(char **path, const char *user)
*slash = '\0';
opath = slash + 1;
} else {
- opath = "";
+ opath = (char *)"";
}
}
pw = sudo_getpwnam(user);
diff --git a/plugins/sudoers/fmtsudoers.c b/plugins/sudoers/fmtsudoers.c
index c4152efbf..8f0ab0539 100644
--- a/plugins/sudoers/fmtsudoers.c
+++ b/plugins/sudoers/fmtsudoers.c
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <pwd.h>
#include <time.h>
#include "sudoers.h"
@@ -51,7 +52,7 @@ sudoers_format_member_int(struct sudo_lbuf *lbuf,
switch (type) {
case MYSELF:
sudo_lbuf_append(lbuf, "%s%s", negated ? "!" : "",
- user_name ? user_name : "");
+ list_pw ? list_pw->pw_name : (user_name ? user_name : ""));
break;
case ALL:
if (name == NULL) {
diff --git a/plugins/sudoers/getdate.c b/plugins/sudoers/getdate.c
index 405ea888b..0f06b466c 100644
--- a/plugins/sudoers/getdate.c
+++ b/plugins/sudoers/getdate.c
@@ -4,18 +4,77 @@
*/
#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#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"
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ 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 <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30802
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.8.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue. */
+#line 1 "getdate.y"
+
/*
** Originally written by Steven M. Bellovin <smb@research.att.com> while
** at the University of North Carolina at Chapel Hill. Later tweaked by
@@ -29,8 +88,8 @@
/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
/* SUPPRESS 288 on yyerrlab *//* Label unused */
-/* PVS Studio suppression*/
-/* -V::1037, 1042*/
+// PVS Studio suppression
+// -V::560, 592, 1037, 1042
#include <config.h>
@@ -58,7 +117,7 @@
** An entry in the lexical lookup table.
*/
typedef struct _TABLE {
- char *name;
+ const char *name;
int type;
time_t value;
} TABLE;
@@ -109,238 +168,1685 @@ static int yylex(void);
int yyparse(void);
void yyerror(const char *s);
+
+#line 167 "getdate.c"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ tAGO = 258, /* tAGO */
+ tID = 259, /* tID */
+ tDST = 260, /* tDST */
+ tDAY = 261, /* tDAY */
+ tDAYZONE = 262, /* tDAYZONE */
+ tMINUTE_UNIT = 263, /* tMINUTE_UNIT */
+ tMONTH = 264, /* tMONTH */
+ tMONTH_UNIT = 265, /* tMONTH_UNIT */
+ tSEC_UNIT = 266, /* tSEC_UNIT */
+ tSNUMBER = 267, /* tSNUMBER */
+ tUNUMBER = 268, /* tUNUMBER */
+ tZONE = 269, /* tZONE */
+ tMERIDIAN = 270 /* tMERIDIAN */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define tAGO 258
+#define tID 259
+#define tDST 260
+#define tDAY 261
+#define tDAYZONE 262
+#define tMINUTE_UNIT 263
+#define tMONTH 264
+#define tMONTH_UNIT 265
+#define tSEC_UNIT 266
+#define tSNUMBER 267
+#define tUNUMBER 268
+#define tZONE 269
+#define tMERIDIAN 270
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
#line 97 "getdate.y"
-#ifndef YYSTYPE_DEFINED
-#define YYSTYPE_DEFINED
-typedef union {
+
time_t Number;
enum _MERIDIAN Meridian;
-} YYSTYPE;
-#endif /* YYSTYPE_DEFINED */
-#line 115 "getdate.c"
-#define tAGO 257
-#define tID 258
-#define tDST 259
-#define tDAY 260
-#define tDAYZONE 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 tMERIDIAN 269
-#define YYERRCODE 256
-const short yylhs[] =
- { -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,
-};
-const short yylen[] =
- { 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,
+
+#line 252 "getdate.c"
+
};
-const short yydefred[] =
- { 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, 30, 0, 37, 34, 0, 9,
- 0, 0, 16, 28, 0, 23, 27, 22, 0, 0,
- 25, 11, 41, 0, 10, 0, 0, 21, 13, 12,
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_tAGO = 3, /* tAGO */
+ YYSYMBOL_tID = 4, /* tID */
+ YYSYMBOL_tDST = 5, /* tDST */
+ YYSYMBOL_tDAY = 6, /* tDAY */
+ YYSYMBOL_tDAYZONE = 7, /* tDAYZONE */
+ YYSYMBOL_tMINUTE_UNIT = 8, /* tMINUTE_UNIT */
+ YYSYMBOL_tMONTH = 9, /* tMONTH */
+ YYSYMBOL_tMONTH_UNIT = 10, /* tMONTH_UNIT */
+ YYSYMBOL_tSEC_UNIT = 11, /* tSEC_UNIT */
+ YYSYMBOL_tSNUMBER = 12, /* tSNUMBER */
+ YYSYMBOL_tUNUMBER = 13, /* tUNUMBER */
+ YYSYMBOL_tZONE = 14, /* tZONE */
+ YYSYMBOL_tMERIDIAN = 15, /* tMERIDIAN */
+ YYSYMBOL_16_ = 16, /* ':' */
+ YYSYMBOL_17_ = 17, /* ',' */
+ YYSYMBOL_18_ = 18, /* '/' */
+ YYSYMBOL_YYACCEPT = 19, /* $accept */
+ YYSYMBOL_spec = 20, /* spec */
+ YYSYMBOL_item = 21, /* item */
+ YYSYMBOL_time = 22, /* time */
+ YYSYMBOL_zone = 23, /* zone */
+ YYSYMBOL_day = 24, /* day */
+ YYSYMBOL_date = 25, /* date */
+ YYSYMBOL_rel = 26, /* rel */
+ YYSYMBOL_relunit = 27, /* relunit */
+ YYSYMBOL_number = 28, /* number */
+ YYSYMBOL_o_merid = 29 /* o_merid */
};
-const short yydgoto[] =
- { 1,
- 45, 11, 12, 13, 14, 15, 16, 17, 18,
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined HAVE_STDINT_H
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int8 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
};
-const short yysindex[] =
- { 0,
- -199, -38, 0, 0, -254, 0, 0, -260, -47, -245,
- 0, 0, 0, 0, 0, 0, 0, -242, 0, -28,
- 0, 0, 0, 0, 0, -259, 0, 0, -249, 0,
- -247, -246, 0, 0, -244, 0, 0, 0, -55, -29,
- 0, 0, 0, -243, 0, -241, -257, 0, 0, 0,};
-const short yyrindex[] =
- { 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 19, 0, 28,
- 0, 0, 0, 0, 0, 55, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 46, 37,
- 0, 0, 0, 0, 0, 0, 46, 0, 0, 0,};
-const short yygindex[] =
- { 0,
- -25, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 2
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 41
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 19
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 11
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 42
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 52
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 270
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_int8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 17, 2, 2, 18, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 16, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15
};
-#define YYTABLESIZE 328
-const short yytable[] =
- { 32,
- 17, 21, 44, 22, 23, 19, 36, 37, 49, 14,
- 31, 43, 20, 33, 34, 35, 38, 46, 29, 39,
- 40, 50, 41, 47, 0, 48, 0, 24, 0, 0,
- 0, 0, 0, 0, 0, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 40, 0, 0, 0, 0,
- 0, 0, 0, 0, 26, 0, 0, 0, 0, 39,
- 2, 3, 4, 5, 6, 7, 8, 9, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 24, 43, 25, 26, 27, 28, 29, 0,
- 0, 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,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 40, 40, 40, 40, 40,
- 40, 0, 40, 40, 26, 26, 26, 26, 26, 26,
- 39, 0, 26, 0, 0, 0, 39, 39,
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 111, 111, 112, 115, 118, 121, 124, 127, 130,
+ 133, 139, 145, 152, 158, 168, 172, 177, 183, 187,
+ 191, 197, 201, 212, 218, 224, 228, 233, 237, 244,
+ 248, 251, 254, 257, 260, 263, 266, 269, 272, 275,
+ 280, 307, 310
};
-const short yycheck[] =
- { 47,
- 0, 262, 58, 264, 265, 44, 266, 267, 266, 0,
- 58, 269, 267, 259, 257, 44, 266, 47, 0, 267,
- 267, 47, 267, 267, -1, 267, -1, 0, -1, -1,
- -1, -1, -1, -1, -1, -1, 0, -1, -1, -1,
- -1, -1, -1, -1, -1, 0, -1, -1, -1, -1,
- -1, -1, -1, -1, 0, -1, -1, -1, -1, 0,
- 260, 261, 262, 263, 264, 265, 266, 267, 268, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 266, -1, 260, 269, 262, 263, 264, 265, 266, -1,
- -1, 269, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 260, 261, 262, 263, 264, 265, 266, 267, 268, 260,
- 261, 262, 263, 264, 265, 266, 267, 268, 260, 261,
- 262, 263, 264, 265, 266, 267, 268, 260, 261, 262,
- 263, 264, 265, 266, 267, 268, 260, 261, 262, 263,
- 264, 265, 266, 267, 268, 260, 261, 262, 263, 264,
- 265, -1, 267, 268, 260, 261, 262, 263, 264, 265,
- 261, -1, 268, -1, -1, -1, 267, 268,
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "tAGO", "tID", "tDST",
+ "tDAY", "tDAYZONE", "tMINUTE_UNIT", "tMONTH", "tMONTH_UNIT", "tSEC_UNIT",
+ "tSNUMBER", "tUNUMBER", "tZONE", "tMERIDIAN", "':'", "','", "'/'",
+ "$accept", "spec", "item", "time", "zone", "day", "date", "rel",
+ "relunit", "number", "o_merid", YY_NULLPTR
};
-#define YYFINAL 1
-#ifndef YYDEBUG
-#define YYDEBUG 0
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
#endif
-#define YYMAXTOKEN 269
-#if YYDEBUG
-const char * const yyname[] =
- {
-"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","tID","tDST",
-"tDAY","tDAYZONE","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT","tSNUMBER",
-"tUNUMBER","tZONE","tMERIDIAN",
+
+#define YYPACT_NINF (-12)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-1)
+
+#define yytable_value_is_error(Yyn) \
+ 0
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int8 yypact[] =
+{
+ -12, 0, -12, -1, -12, -12, 10, -12, -12, 18,
+ 9, 17, -12, -12, -12, -12, -12, -12, 27, -12,
+ -12, 15, -12, -12, -12, -12, -12, -10, -12, -12,
+ 21, -12, 22, 23, -12, -12, 24, -12, -12, -12,
+ -11, 20, -12, -12, -12, 26, -12, 28, 19, -12,
+ -12, -12
};
-const char * const yyrule[] =
- {"$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",
+
+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int8 yydefact[] =
+{
+ 2, 0, 1, 18, 16, 33, 0, 39, 36, 0,
+ 40, 15, 3, 4, 5, 7, 6, 8, 30, 9,
+ 19, 25, 32, 37, 34, 20, 31, 27, 38, 35,
+ 0, 10, 0, 0, 17, 29, 0, 24, 28, 23,
+ 41, 21, 26, 12, 42, 0, 11, 0, 41, 22,
+ 14, 13
};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12,
+ -8
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ 0, 1, 12, 13, 14, 15, 16, 17, 18, 19,
+ 46
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int8 yytable[] =
+{
+ 2, 43, 37, 38, 44, 45, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 25, 20, 26, 27, 28,
+ 29, 30, 34, 21, 31, 32, 22, 33, 23, 24,
+ 35, 50, 36, 39, 44, 40, 41, 42, 47, 48,
+ 51, 49
+};
+
+static const yytype_int8 yycheck[] =
+{
+ 0, 12, 12, 13, 15, 16, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 6, 17, 8, 9, 10,
+ 11, 12, 5, 13, 15, 16, 8, 18, 10, 11,
+ 3, 12, 17, 12, 15, 13, 13, 13, 18, 13,
+ 48, 13
+};
+
+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+ state STATE-NUM. */
+static const yytype_int8 yystos[] =
+{
+ 0, 20, 0, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 21, 22, 23, 24, 25, 26, 27, 28,
+ 17, 13, 8, 10, 11, 6, 8, 9, 10, 11,
+ 12, 15, 16, 18, 5, 3, 17, 12, 13, 12,
+ 13, 13, 13, 12, 15, 16, 29, 18, 13, 13,
+ 12, 29
+};
+
+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr1[] =
+{
+ 0, 19, 20, 20, 21, 21, 21, 21, 21, 21,
+ 22, 22, 22, 22, 22, 23, 23, 23, 24, 24,
+ 24, 25, 25, 25, 25, 25, 25, 25, 25, 26,
+ 26, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 28, 29, 29
+};
+
+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 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
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+#define YYNOMEM goto yyexhaustedlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ if (!yyvaluep)
+ return;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)]);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
#endif
-#ifdef YYSTACKSIZE
-#undef YYMAXDEPTH
-#define YYMAXDEPTH YYSTACKSIZE
-#else
-#ifdef YYMAXDEPTH
-#define YYSTACKSIZE YYMAXDEPTH
-#else
-#define YYSTACKSIZE 10000
-#define YYMAXDEPTH 10000
-#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
#endif
-#define YYINITSTACKSIZE 200
-/* LINTUSED */
-int yydebug;
-int yynerrs;
-int yyerrflag;
+
+
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
+{
+ YY_USE (yyvaluep);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/* Lookahead token kind. */
int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
+
+/* The semantic value of the lookahead symbol. */
YYSTYPE yylval;
-short *yyss;
-short *yysslim;
-YYSTYPE *yyvs;
-unsigned int yystacksize;
-int yyparse(void);
-#line 316 "getdate.y"
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ YYNOMEM;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ YYNOMEM;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ YYNOMEM;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex ();
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 4: /* item: time */
+#line 115 "getdate.y"
+ {
+ yyHaveTime++;
+ }
+#line 1290 "getdate.c"
+ break;
+
+ case 5: /* item: zone */
+#line 118 "getdate.y"
+ {
+ yyHaveZone++;
+ }
+#line 1298 "getdate.c"
+ break;
+
+ case 6: /* item: date */
+#line 121 "getdate.y"
+ {
+ yyHaveDate++;
+ }
+#line 1306 "getdate.c"
+ break;
+
+ case 7: /* item: day */
+#line 124 "getdate.y"
+ {
+ yyHaveDay++;
+ }
+#line 1314 "getdate.c"
+ break;
+
+ case 8: /* item: rel */
+#line 127 "getdate.y"
+ {
+ yyHaveRel++;
+ }
+#line 1322 "getdate.c"
+ break;
+
+ case 10: /* time: tUNUMBER tMERIDIAN */
+#line 133 "getdate.y"
+ {
+ yyHour = (yyvsp[-1].Number);
+ yyMinutes = 0;
+ yySeconds = 0;
+ yyMeridian = (yyvsp[0].Meridian);
+ }
+#line 1333 "getdate.c"
+ break;
+
+ case 11: /* time: tUNUMBER ':' tUNUMBER o_merid */
+#line 139 "getdate.y"
+ {
+ yyHour = (yyvsp[-3].Number);
+ yyMinutes = (yyvsp[-1].Number);
+ yySeconds = 0;
+ yyMeridian = (yyvsp[0].Meridian);
+ }
+#line 1344 "getdate.c"
+ break;
+
+ case 12: /* time: tUNUMBER ':' tUNUMBER tSNUMBER */
+#line 145 "getdate.y"
+ {
+ yyHour = (yyvsp[-3].Number);
+ yyMinutes = (yyvsp[-1].Number);
+ yyMeridian = MER24;
+ yyDSTmode = DSToff;
+ yyTimezone = - ((yyvsp[0].Number) % 100 + ((yyvsp[0].Number) / 100) * 60);
+ }
+#line 1356 "getdate.c"
+ break;
+
+ case 13: /* time: tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid */
+#line 152 "getdate.y"
+ {
+ yyHour = (yyvsp[-5].Number);
+ yyMinutes = (yyvsp[-3].Number);
+ yySeconds = (yyvsp[-1].Number);
+ yyMeridian = (yyvsp[0].Meridian);
+ }
+#line 1367 "getdate.c"
+ break;
+
+ case 14: /* time: tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER */
+#line 158 "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);
+ }
+#line 1380 "getdate.c"
+ break;
+
+ case 15: /* zone: tZONE */
+#line 168 "getdate.y"
+ {
+ yyTimezone = (yyvsp[0].Number);
+ yyDSTmode = DSToff;
+ }
+#line 1389 "getdate.c"
+ break;
+
+ case 16: /* zone: tDAYZONE */
+#line 172 "getdate.y"
+ {
+ yyTimezone = (yyvsp[0].Number);
+ yyDSTmode = DSTon;
+ }
+#line 1398 "getdate.c"
+ break;
+
+ case 17: /* zone: tZONE tDST */
+#line 177 "getdate.y"
+ {
+ yyTimezone = (yyvsp[-1].Number);
+ yyDSTmode = DSTon;
+ }
+#line 1407 "getdate.c"
+ break;
+
+ case 18: /* day: tDAY */
+#line 183 "getdate.y"
+ {
+ yyDayOrdinal = 1;
+ yyDayNumber = (yyvsp[0].Number);
+ }
+#line 1416 "getdate.c"
+ break;
+
+ case 19: /* day: tDAY ',' */
+#line 187 "getdate.y"
+ {
+ yyDayOrdinal = 1;
+ yyDayNumber = (yyvsp[-1].Number);
+ }
+#line 1425 "getdate.c"
+ break;
+
+ case 20: /* day: tUNUMBER tDAY */
+#line 191 "getdate.y"
+ {
+ yyDayOrdinal = (yyvsp[-1].Number);
+ yyDayNumber = (yyvsp[0].Number);
+ }
+#line 1434 "getdate.c"
+ break;
+
+ case 21: /* date: tUNUMBER '/' tUNUMBER */
+#line 197 "getdate.y"
+ {
+ yyMonth = (yyvsp[-2].Number);
+ yyDay = (yyvsp[0].Number);
+ }
+#line 1443 "getdate.c"
+ break;
+
+ case 22: /* date: tUNUMBER '/' tUNUMBER '/' tUNUMBER */
+#line 201 "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);
+ }
+ }
+#line 1459 "getdate.c"
+ break;
+
+ case 23: /* date: tUNUMBER tSNUMBER tSNUMBER */
+#line 212 "getdate.y"
+ {
+ /* ISO 8601 format. yyyy-mm-dd. */
+ yyYear = (yyvsp[-2].Number);
+ yyMonth = -(yyvsp[-1].Number);
+ yyDay = -(yyvsp[0].Number);
+ }
+#line 1470 "getdate.c"
+ break;
+
+ case 24: /* date: tUNUMBER tMONTH tSNUMBER */
+#line 218 "getdate.y"
+ {
+ /* e.g. 17-JUN-1992. */
+ yyDay = (yyvsp[-2].Number);
+ yyMonth = (yyvsp[-1].Number);
+ yyYear = -(yyvsp[0].Number);
+ }
+#line 1481 "getdate.c"
+ break;
+
+ case 25: /* date: tMONTH tUNUMBER */
+#line 224 "getdate.y"
+ {
+ yyMonth = (yyvsp[-1].Number);
+ yyDay = (yyvsp[0].Number);
+ }
+#line 1490 "getdate.c"
+ break;
+
+ case 26: /* date: tMONTH tUNUMBER ',' tUNUMBER */
+#line 228 "getdate.y"
+ {
+ yyMonth = (yyvsp[-3].Number);
+ yyDay = (yyvsp[-2].Number);
+ yyYear = (yyvsp[0].Number);
+ }
+#line 1500 "getdate.c"
+ break;
+
+ case 27: /* date: tUNUMBER tMONTH */
+#line 233 "getdate.y"
+ {
+ yyMonth = (yyvsp[0].Number);
+ yyDay = (yyvsp[-1].Number);
+ }
+#line 1509 "getdate.c"
+ break;
+
+ case 28: /* date: tUNUMBER tMONTH tUNUMBER */
+#line 237 "getdate.y"
+ {
+ yyMonth = (yyvsp[-1].Number);
+ yyDay = (yyvsp[-2].Number);
+ yyYear = (yyvsp[0].Number);
+ }
+#line 1519 "getdate.c"
+ break;
+
+ case 29: /* rel: relunit tAGO */
+#line 244 "getdate.y"
+ {
+ yyRelSeconds = -yyRelSeconds;
+ yyRelMonth = -yyRelMonth;
+ }
+#line 1528 "getdate.c"
+ break;
+
+ case 31: /* relunit: tUNUMBER tMINUTE_UNIT */
+#line 251 "getdate.y"
+ {
+ yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number) * 60L;
+ }
+#line 1536 "getdate.c"
+ break;
+
+ case 32: /* relunit: tSNUMBER tMINUTE_UNIT */
+#line 254 "getdate.y"
+ {
+ yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number) * 60L;
+ }
+#line 1544 "getdate.c"
+ break;
+
+ case 33: /* relunit: tMINUTE_UNIT */
+#line 257 "getdate.y"
+ {
+ yyRelSeconds += (yyvsp[0].Number) * 60L;
+ }
+#line 1552 "getdate.c"
+ break;
+
+ case 34: /* relunit: tSNUMBER tSEC_UNIT */
+#line 260 "getdate.y"
+ {
+ yyRelSeconds += (yyvsp[-1].Number);
+ }
+#line 1560 "getdate.c"
+ break;
+
+ case 35: /* relunit: tUNUMBER tSEC_UNIT */
+#line 263 "getdate.y"
+ {
+ yyRelSeconds += (yyvsp[-1].Number);
+ }
+#line 1568 "getdate.c"
+ break;
+
+ case 36: /* relunit: tSEC_UNIT */
+#line 266 "getdate.y"
+ {
+ yyRelSeconds++;
+ }
+#line 1576 "getdate.c"
+ break;
+
+ case 37: /* relunit: tSNUMBER tMONTH_UNIT */
+#line 269 "getdate.y"
+ {
+ yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
+ }
+#line 1584 "getdate.c"
+ break;
+
+ case 38: /* relunit: tUNUMBER tMONTH_UNIT */
+#line 272 "getdate.y"
+ {
+ yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
+ }
+#line 1592 "getdate.c"
+ break;
+
+ case 39: /* relunit: tMONTH_UNIT */
+#line 275 "getdate.y"
+ {
+ yyRelMonth += (yyvsp[0].Number);
+ }
+#line 1600 "getdate.c"
+ break;
+
+ case 40: /* number: tUNUMBER */
+#line 280 "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;
+ }
+ }
+ }
+#line 1630 "getdate.c"
+ break;
+
+ case 41: /* o_merid: %empty */
+#line 307 "getdate.y"
+ {
+ (yyval.Meridian) = MER24;
+ }
+#line 1638 "getdate.c"
+ break;
+
+ case 42: /* o_merid: tMERIDIAN */
+#line 310 "getdate.y"
+ {
+ (yyval.Meridian) = (yyvsp[0].Meridian);
+ }
+#line 1646 "getdate.c"
+ break;
+
+
+#line 1650 "getdate.c"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+ ++yynerrs;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturnlab;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturnlab;
+
+
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
+`-----------------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturnlab;
+
+
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return. |
+`----------------------------------------------------------*/
+yyreturnlab:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+
+ return yyresult;
+}
+
+#line 315 "getdate.y"
+
/* Month and day table. */
static TABLE const MonthDayTable[] = {
@@ -597,7 +2103,7 @@ Convert(time_t Month, time_t Day, time_t Year, time_t Hours, time_t Minutes,
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])
+ || Day < 1 || Day > DaysInMonth[--Month])
return -1;
for (Julian = Day - 1, i = 0; i < Month; i++)
@@ -854,6 +2360,8 @@ difftm(struct tm *a, struct tm *b)
+ (a->tm_sec - b->tm_sec));
}
+time_t get_date(char *p);
+
time_t
get_date(char *p)
{
@@ -947,550 +2455,3 @@ main(int argc, char *argv[])
/* NOTREACHED */
}
#endif /* TEST */
-#line 937 "getdate.c"
-/* allocate initial stack or double stack size, up to YYMAXDEPTH */
-static int yygrowstack(void)
-{
- 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
-#define YY_SIZE_MAX 0xffffffffU
-#endif
- if (YY_SIZE_MAX / newsize < sizeof *newss)
- goto bail;
- sslen = yyssp - yyss;
- newss = yyss ? realloc(yyss, newsize * sizeof *newss) :
- malloc(newsize * sizeof *newss); /* overflow check above */
- if (newss == NULL)
- goto bail;
- yyss = newss;
- yyssp = newss + sslen;
- newvs = yyvs ? realloc(yyvs, newsize * sizeof *newvs) :
- 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:
- free(yyss);
- 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
-yyparse(void)
-{
- int yym, yyn, yystate;
-#if YYDEBUG
- const char *yys;
-
- 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 115 "getdate.y"
-{
- yyHaveTime++;
- }
-break;
-case 4:
-#line 118 "getdate.y"
-{
- yyHaveZone++;
- }
-break;
-case 5:
-#line 121 "getdate.y"
-{
- yyHaveDate++;
- }
-break;
-case 6:
-#line 124 "getdate.y"
-{
- yyHaveDay++;
- }
-break;
-case 7:
-#line 127 "getdate.y"
-{
- yyHaveRel++;
- }
-break;
-case 9:
-#line 133 "getdate.y"
-{
- yyHour = yyvsp[-1].Number;
- yyMinutes = 0;
- yySeconds = 0;
- yyMeridian = yyvsp[0].Meridian;
- }
-break;
-case 10:
-#line 139 "getdate.y"
-{
- yyHour = yyvsp[-3].Number;
- yyMinutes = yyvsp[-1].Number;
- yySeconds = 0;
- yyMeridian = yyvsp[0].Meridian;
- }
-break;
-case 11:
-#line 145 "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 152 "getdate.y"
-{
- yyHour = yyvsp[-5].Number;
- yyMinutes = yyvsp[-3].Number;
- yySeconds = yyvsp[-1].Number;
- yyMeridian = yyvsp[0].Meridian;
- }
-break;
-case 13:
-#line 158 "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 168 "getdate.y"
-{
- yyTimezone = yyvsp[0].Number;
- yyDSTmode = DSToff;
- }
-break;
-case 15:
-#line 172 "getdate.y"
-{
- yyTimezone = yyvsp[0].Number;
- yyDSTmode = DSTon;
- }
-break;
-case 16:
-#line 177 "getdate.y"
-{
- yyTimezone = yyvsp[-1].Number;
- yyDSTmode = DSTon;
- }
-break;
-case 17:
-#line 183 "getdate.y"
-{
- yyDayOrdinal = 1;
- yyDayNumber = yyvsp[0].Number;
- }
-break;
-case 18:
-#line 187 "getdate.y"
-{
- yyDayOrdinal = 1;
- yyDayNumber = yyvsp[-1].Number;
- }
-break;
-case 19:
-#line 191 "getdate.y"
-{
- yyDayOrdinal = yyvsp[-1].Number;
- yyDayNumber = yyvsp[0].Number;
- }
-break;
-case 20:
-#line 197 "getdate.y"
-{
- yyMonth = yyvsp[-2].Number;
- yyDay = yyvsp[0].Number;
- }
-break;
-case 21:
-#line 201 "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 212 "getdate.y"
-{
- /* ISO 8601 format. yyyy-mm-dd. */
- yyYear = yyvsp[-2].Number;
- yyMonth = -yyvsp[-1].Number;
- yyDay = -yyvsp[0].Number;
- }
-break;
-case 23:
-#line 218 "getdate.y"
-{
- /* e.g. 17-JUN-1992. */
- yyDay = yyvsp[-2].Number;
- yyMonth = yyvsp[-1].Number;
- yyYear = -yyvsp[0].Number;
- }
-break;
-case 24:
-#line 224 "getdate.y"
-{
- yyMonth = yyvsp[-1].Number;
- yyDay = yyvsp[0].Number;
- }
-break;
-case 25:
-#line 228 "getdate.y"
-{
- yyMonth = yyvsp[-3].Number;
- yyDay = yyvsp[-2].Number;
- yyYear = yyvsp[0].Number;
- }
-break;
-case 26:
-#line 233 "getdate.y"
-{
- yyMonth = yyvsp[0].Number;
- yyDay = yyvsp[-1].Number;
- }
-break;
-case 27:
-#line 237 "getdate.y"
-{
- yyMonth = yyvsp[-1].Number;
- yyDay = yyvsp[-2].Number;
- yyYear = yyvsp[0].Number;
- }
-break;
-case 28:
-#line 244 "getdate.y"
-{
- yyRelSeconds = -yyRelSeconds;
- yyRelMonth = -yyRelMonth;
- }
-break;
-case 30:
-#line 251 "getdate.y"
-{
- yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
- }
-break;
-case 31:
-#line 254 "getdate.y"
-{
- yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
- }
-break;
-case 32:
-#line 257 "getdate.y"
-{
- yyRelSeconds += yyvsp[0].Number * 60L;
- }
-break;
-case 33:
-#line 260 "getdate.y"
-{
- yyRelSeconds += yyvsp[-1].Number;
- }
-break;
-case 34:
-#line 263 "getdate.y"
-{
- yyRelSeconds += yyvsp[-1].Number;
- }
-break;
-case 35:
-#line 266 "getdate.y"
-{
- yyRelSeconds++;
- }
-break;
-case 36:
-#line 269 "getdate.y"
-{
- yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
- }
-break;
-case 37:
-#line 272 "getdate.y"
-{
- yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
- }
-break;
-case 38:
-#line 275 "getdate.y"
-{
- yyRelMonth += yyvsp[0].Number;
- }
-break;
-case 39:
-#line 280 "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 307 "getdate.y"
-{
- yyval.Meridian = MER24;
- }
-break;
-case 41:
-#line 310 "getdate.y"
-{
- yyval.Meridian = yyvsp[0].Meridian;
- }
-break;
-#line 1417 "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:
- free(yyss);
- free(yyvs);
- yyss = yyssp = NULL;
- yyvs = yyvsp = NULL;
- yystacksize = 0;
- return (1);
-yyaccept:
- free(yyss);
- free(yyvs);
- yyss = yyssp = NULL;
- yyvs = yyvsp = NULL;
- yystacksize = 0;
- return (0);
-}
diff --git a/plugins/sudoers/getdate.y b/plugins/sudoers/getdate.y
index 0ce8b7a0f..1e3893c99 100644
--- a/plugins/sudoers/getdate.y
+++ b/plugins/sudoers/getdate.y
@@ -13,7 +13,7 @@
/* SUPPRESS 288 on yyerrlab *//* Label unused */
// PVS Studio suppression
-// -V::1037, 1042
+// -V::560, 592, 1037, 1042
#include <config.h>
@@ -41,7 +41,7 @@
** An entry in the lexical lookup table.
*/
typedef struct _TABLE {
- char *name;
+ const char *name;
int type;
time_t value;
} TABLE;
@@ -569,7 +569,7 @@ Convert(time_t Month, time_t Day, time_t Year, time_t Hours, time_t Minutes,
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])
+ || Day < 1 || Day > DaysInMonth[--Month])
return -1;
for (Julian = Day - 1, i = 0; i < Month; i++)
@@ -826,6 +826,8 @@ difftm(struct tm *a, struct tm *b)
+ (a->tm_sec - b->tm_sec));
}
+time_t get_date(char *p);
+
time_t
get_date(char *p)
{
diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c
index 2157d072c..1dffb5723 100644
--- a/plugins/sudoers/gram.c
+++ b/plugins/sudoers/gram.c
@@ -126,7 +126,7 @@
#define this_lineno (sudoerschar == '\n' ? sudolineno - 1 : sudolineno)
// PVS Studio suppression
-// -V::1037, 1042
+// -V::560, 592, 1037, 1042
/*
* Globals
@@ -341,9 +341,10 @@ union YYSTYPE
struct command_options options;
struct cmndtag tag;
char *string;
+ const char *cstring;
int tok;
-#line 341 "gram.c"
+#line 342 "gram.c"
};
typedef union YYSTYPE YYSTYPE;
@@ -874,22 +875,22 @@ static const yytype_int8 yytranslate[] =
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_int16 yyrline[] =
{
- 0, 200, 200, 203, 206, 207, 210, 213, 216, 225,
- 234, 240, 243, 246, 249, 252, 256, 260, 264, 268,
- 274, 277, 283, 286, 292, 293, 300, 309, 318, 328,
- 338, 350, 351, 356, 362, 379, 383, 389, 398, 406,
- 415, 424, 435, 436, 498, 568, 577, 586, 595, 606,
- 607, 614, 617, 631, 635, 641, 657, 673, 678, 682,
- 687, 692, 697, 702, 706, 711, 714, 719, 735, 746,
- 758, 769, 787, 788, 789, 790, 791, 792, 793, 794,
- 795, 796, 797, 800, 806, 809, 814, 819, 828, 837,
- 849, 856, 863, 870, 877, 886, 889, 892, 895, 898,
- 901, 904, 907, 910, 913, 916, 919, 922, 925, 928,
- 931, 934, 939, 953, 962, 985, 986, 989, 989, 1001,
- 1004, 1005, 1012, 1013, 1016, 1016, 1028, 1031, 1032, 1039,
- 1040, 1043, 1043, 1055, 1058, 1059, 1062, 1062, 1074, 1077,
- 1078, 1085, 1089, 1095, 1104, 1112, 1121, 1130, 1141, 1142,
- 1149, 1153, 1159, 1168, 1176
+ 0, 201, 201, 204, 207, 208, 211, 214, 217, 226,
+ 235, 241, 244, 247, 250, 253, 257, 261, 265, 269,
+ 275, 278, 284, 287, 293, 294, 301, 310, 319, 329,
+ 339, 351, 352, 357, 363, 380, 384, 390, 399, 407,
+ 416, 425, 436, 437, 499, 569, 578, 587, 596, 607,
+ 608, 615, 618, 632, 636, 642, 658, 674, 679, 683,
+ 688, 693, 698, 703, 707, 712, 715, 720, 736, 747,
+ 759, 770, 788, 789, 790, 791, 792, 793, 794, 795,
+ 796, 797, 798, 801, 807, 810, 815, 820, 829, 838,
+ 850, 857, 864, 871, 878, 887, 890, 893, 896, 899,
+ 902, 905, 908, 911, 914, 917, 920, 923, 926, 929,
+ 932, 935, 940, 954, 963, 986, 987, 990, 990, 1002,
+ 1005, 1006, 1013, 1014, 1017, 1017, 1029, 1032, 1033, 1040,
+ 1041, 1044, 1044, 1056, 1059, 1060, 1063, 1063, 1075, 1078,
+ 1079, 1086, 1090, 1096, 1105, 1113, 1122, 1131, 1142, 1143,
+ 1150, 1154, 1160, 1169, 1177
};
#endif
@@ -1647,31 +1648,31 @@ yyreduce:
switch (yyn)
{
case 2: /* file: %empty */
-#line 200 "gram.y"
+#line 201 "gram.y"
{
; /* empty file */
}
-#line 1649 "gram.c"
+#line 1650 "gram.c"
break;
case 6: /* entry: '\n' */
-#line 210 "gram.y"
+#line 211 "gram.y"
{
; /* blank line */
}
-#line 1657 "gram.c"
+#line 1658 "gram.c"
break;
case 7: /* entry: error '\n' */
-#line 213 "gram.y"
+#line 214 "gram.y"
{
yyerrok;
}
-#line 1665 "gram.c"
+#line 1666 "gram.c"
break;
case 8: /* entry: include */
-#line 216 "gram.y"
+#line 217 "gram.y"
{
if (!push_include((yyvsp[0].string), false)) {
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
@@ -1681,11 +1682,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
free((yyvsp[0].string));
}
-#line 1679 "gram.c"
+#line 1680 "gram.c"
break;
case 9: /* entry: includedir */
-#line 225 "gram.y"
+#line 226 "gram.y"
{
if (!push_include((yyvsp[0].string), true)) {
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
@@ -1695,143 +1696,143 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
free((yyvsp[0].string));
}
-#line 1693 "gram.c"
+#line 1694 "gram.c"
break;
case 10: /* entry: userlist privileges '\n' */
-#line 234 "gram.y"
+#line 235 "gram.y"
{
if (!add_userspec((yyvsp[-2].member), (yyvsp[-1].privilege))) {
sudoerserror(N_("unable to allocate memory"));
YYERROR;
}
}
-#line 1704 "gram.c"
+#line 1705 "gram.c"
break;
case 11: /* entry: USERALIAS useraliases '\n' */
-#line 240 "gram.y"
+#line 241 "gram.y"
{
;
}
-#line 1712 "gram.c"
+#line 1713 "gram.c"
break;
case 12: /* entry: HOSTALIAS hostaliases '\n' */
-#line 243 "gram.y"
+#line 244 "gram.y"
{
;
}
-#line 1720 "gram.c"
+#line 1721 "gram.c"
break;
case 13: /* entry: CMNDALIAS cmndaliases '\n' */
-#line 246 "gram.y"
+#line 247 "gram.y"
{
;
}
-#line 1728 "gram.c"
+#line 1729 "gram.c"
break;
case 14: /* entry: RUNASALIAS runasaliases '\n' */
-#line 249 "gram.y"
+#line 250 "gram.y"
{
;
}
-#line 1736 "gram.c"
+#line 1737 "gram.c"
break;
case 15: /* entry: DEFAULTS defaults_list '\n' */
-#line 252 "gram.y"
+#line 253 "gram.y"
{
if (!add_defaults(DEFAULTS, NULL, (yyvsp[-1].defaults)))
YYERROR;
}
-#line 1745 "gram.c"
+#line 1746 "gram.c"
break;
case 16: /* entry: DEFAULTS_USER userlist defaults_list '\n' */
-#line 256 "gram.y"
+#line 257 "gram.y"
{
if (!add_defaults(DEFAULTS_USER, (yyvsp[-2].member), (yyvsp[-1].defaults)))
YYERROR;
}
-#line 1754 "gram.c"
+#line 1755 "gram.c"
break;
case 17: /* entry: DEFAULTS_RUNAS userlist defaults_list '\n' */
-#line 260 "gram.y"
+#line 261 "gram.y"
{
if (!add_defaults(DEFAULTS_RUNAS, (yyvsp[-2].member), (yyvsp[-1].defaults)))
YYERROR;
}
-#line 1763 "gram.c"
+#line 1764 "gram.c"
break;
case 18: /* entry: DEFAULTS_HOST hostlist defaults_list '\n' */
-#line 264 "gram.y"
+#line 265 "gram.y"
{
if (!add_defaults(DEFAULTS_HOST, (yyvsp[-2].member), (yyvsp[-1].defaults)))
YYERROR;
}
-#line 1772 "gram.c"
+#line 1773 "gram.c"
break;
case 19: /* entry: DEFAULTS_CMND cmndlist defaults_list '\n' */
-#line 268 "gram.y"
+#line 269 "gram.y"
{
if (!add_defaults(DEFAULTS_CMND, (yyvsp[-2].member), (yyvsp[-1].defaults)))
YYERROR;
}
-#line 1781 "gram.c"
+#line 1782 "gram.c"
break;
case 20: /* include: INCLUDE WORD '\n' */
-#line 274 "gram.y"
+#line 275 "gram.y"
{
(yyval.string) = (yyvsp[-1].string);
}
-#line 1789 "gram.c"
+#line 1790 "gram.c"
break;
case 21: /* include: INCLUDE WORD error '\n' */
-#line 277 "gram.y"
+#line 278 "gram.y"
{
yyerrok;
(yyval.string) = (yyvsp[-2].string);
}
-#line 1798 "gram.c"
+#line 1799 "gram.c"
break;
case 22: /* includedir: INCLUDEDIR WORD '\n' */
-#line 283 "gram.y"
+#line 284 "gram.y"
{
(yyval.string) = (yyvsp[-1].string);
}
-#line 1806 "gram.c"
+#line 1807 "gram.c"
break;
case 23: /* includedir: INCLUDEDIR WORD error '\n' */
-#line 286 "gram.y"
+#line 287 "gram.y"
{
yyerrok;
(yyval.string) = (yyvsp[-2].string);
}
-#line 1815 "gram.c"
+#line 1816 "gram.c"
break;
case 25: /* defaults_list: defaults_list ',' defaults_entry */
-#line 293 "gram.y"
+#line 294 "gram.y"
{
parser_leak_remove(LEAK_DEFAULTS, (yyvsp[0].defaults));
HLTQ_CONCAT((yyvsp[-2].defaults), (yyvsp[0].defaults), entries);
(yyval.defaults) = (yyvsp[-2].defaults);
}
-#line 1825 "gram.c"
+#line 1826 "gram.c"
break;
case 26: /* defaults_entry: DEFVAR */
-#line 300 "gram.y"
+#line 301 "gram.y"
{
(yyval.defaults) = new_default((yyvsp[0].string), NULL, true);
if ((yyval.defaults) == NULL) {
@@ -1841,11 +1842,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DEFAULTS, (yyval.defaults));
}
-#line 1839 "gram.c"
+#line 1840 "gram.c"
break;
case 27: /* defaults_entry: '!' DEFVAR */
-#line 309 "gram.y"
+#line 310 "gram.y"
{
(yyval.defaults) = new_default((yyvsp[0].string), NULL, false);
if ((yyval.defaults) == NULL) {
@@ -1855,11 +1856,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DEFAULTS, (yyval.defaults));
}
-#line 1853 "gram.c"
+#line 1854 "gram.c"
break;
case 28: /* defaults_entry: DEFVAR '=' WORD */
-#line 318 "gram.y"
+#line 319 "gram.y"
{
(yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), true);
if ((yyval.defaults) == NULL) {
@@ -1870,11 +1871,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DEFAULTS, (yyval.defaults));
}
-#line 1868 "gram.c"
+#line 1869 "gram.c"
break;
case 29: /* defaults_entry: DEFVAR '+' WORD */
-#line 328 "gram.y"
+#line 329 "gram.y"
{
(yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), '+');
if ((yyval.defaults) == NULL) {
@@ -1885,11 +1886,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DEFAULTS, (yyval.defaults));
}
-#line 1883 "gram.c"
+#line 1884 "gram.c"
break;
case 30: /* defaults_entry: DEFVAR '-' WORD */
-#line 338 "gram.y"
+#line 339 "gram.y"
{
(yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), '-');
if ((yyval.defaults) == NULL) {
@@ -1900,30 +1901,30 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DEFAULTS, (yyval.defaults));
}
-#line 1898 "gram.c"
+#line 1899 "gram.c"
break;
case 32: /* privileges: privileges ':' privilege */
-#line 351 "gram.y"
+#line 352 "gram.y"
{
parser_leak_remove(LEAK_PRIVILEGE, (yyvsp[0].privilege));
HLTQ_CONCAT((yyvsp[-2].privilege), (yyvsp[0].privilege), entries);
(yyval.privilege) = (yyvsp[-2].privilege);
}
-#line 1908 "gram.c"
+#line 1909 "gram.c"
break;
case 33: /* privileges: privileges ':' error */
-#line 356 "gram.y"
+#line 357 "gram.y"
{
yyerrok;
(yyval.privilege) = (yyvsp[-2].privilege);
}
-#line 1917 "gram.c"
+#line 1918 "gram.c"
break;
case 34: /* privilege: hostlist '=' cmndspeclist */
-#line 362 "gram.y"
+#line 363 "gram.y"
{
struct privilege *p = calloc(1, sizeof(*p));
if (p == NULL) {
@@ -1939,29 +1940,29 @@ yyreduce:
HLTQ_INIT(p, entries);
(yyval.privilege) = p;
}
-#line 1937 "gram.c"
+#line 1938 "gram.c"
break;
case 35: /* ophost: host */
-#line 379 "gram.y"
+#line 380 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = false;
}
-#line 1946 "gram.c"
+#line 1947 "gram.c"
break;
case 36: /* ophost: '!' host */
-#line 383 "gram.y"
+#line 384 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = true;
}
-#line 1955 "gram.c"
+#line 1956 "gram.c"
break;
case 37: /* host: ALIAS */
-#line 389 "gram.y"
+#line 390 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), ALIAS);
if ((yyval.member) == NULL) {
@@ -1971,11 +1972,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 1969 "gram.c"
+#line 1970 "gram.c"
break;
case 38: /* host: ALL */
-#line 398 "gram.y"
+#line 399 "gram.y"
{
(yyval.member) = new_member(NULL, ALL);
if ((yyval.member) == NULL) {
@@ -1984,11 +1985,11 @@ yyreduce:
}
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 1982 "gram.c"
+#line 1983 "gram.c"
break;
case 39: /* host: NETGROUP */
-#line 406 "gram.y"
+#line 407 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), NETGROUP);
if ((yyval.member) == NULL) {
@@ -1998,11 +1999,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 1996 "gram.c"
+#line 1997 "gram.c"
break;
case 40: /* host: NTWKADDR */
-#line 415 "gram.y"
+#line 416 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), NTWKADDR);
if ((yyval.member) == NULL) {
@@ -2012,11 +2013,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 2010 "gram.c"
+#line 2011 "gram.c"
break;
case 41: /* host: WORD */
-#line 424 "gram.y"
+#line 425 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), WORD);
if ((yyval.member) == NULL) {
@@ -2026,11 +2027,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 2024 "gram.c"
+#line 2025 "gram.c"
break;
case 43: /* cmndspeclist: cmndspeclist ',' cmndspec */
-#line 436 "gram.y"
+#line 437 "gram.y"
{
struct cmndspec *prev;
prev = HLTQ_LAST((yyvsp[-2].cmndspec), cmndspec, entries);
@@ -2091,11 +2092,11 @@ yyreduce:
}
(yyval.cmndspec) = (yyvsp[-2].cmndspec);
}
-#line 2089 "gram.c"
+#line 2090 "gram.c"
break;
case 44: /* cmndspec: runasspec options cmndtag digcmnd */
-#line 498 "gram.y"
+#line 499 "gram.y"
{
struct cmndspec *cs = calloc(1, sizeof(*cs));
if (cs == NULL) {
@@ -2138,8 +2139,8 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[-2].options).type);
#endif
#ifdef HAVE_APPARMOR
- cs->apparmor_profile = (yyvsp[-2].options).apparmor_profile;
- parser_leak_remove(LEAK_PTR, (yyvsp[-2].options).apparmor_profile);
+ cs->apparmor_profile = (yyvsp[-2].options).apparmor_profile;
+ parser_leak_remove(LEAK_PTR, (yyvsp[-2].options).apparmor_profile);
#endif
#ifdef HAVE_PRIV_SET
cs->privs = (yyvsp[-2].options).privs;
@@ -2164,11 +2165,11 @@ yyreduce:
cs->tags.setenv = IMPLIED;
(yyval.cmndspec) = cs;
}
-#line 2162 "gram.c"
+#line 2163 "gram.c"
break;
case 45: /* digestspec: SHA224_TOK ':' DIGEST */
-#line 568 "gram.y"
+#line 569 "gram.y"
{
(yyval.digest) = new_digest(SUDO_DIGEST_SHA224, (yyvsp[0].string));
if ((yyval.digest) == NULL) {
@@ -2178,11 +2179,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DIGEST, (yyval.digest));
}
-#line 2176 "gram.c"
+#line 2177 "gram.c"
break;
case 46: /* digestspec: SHA256_TOK ':' DIGEST */
-#line 577 "gram.y"
+#line 578 "gram.y"
{
(yyval.digest) = new_digest(SUDO_DIGEST_SHA256, (yyvsp[0].string));
if ((yyval.digest) == NULL) {
@@ -2192,11 +2193,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DIGEST, (yyval.digest));
}
-#line 2190 "gram.c"
+#line 2191 "gram.c"
break;
case 47: /* digestspec: SHA384_TOK ':' DIGEST */
-#line 586 "gram.y"
+#line 587 "gram.y"
{
(yyval.digest) = new_digest(SUDO_DIGEST_SHA384, (yyvsp[0].string));
if ((yyval.digest) == NULL) {
@@ -2206,11 +2207,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DIGEST, (yyval.digest));
}
-#line 2204 "gram.c"
+#line 2205 "gram.c"
break;
case 48: /* digestspec: SHA512_TOK ':' DIGEST */
-#line 595 "gram.y"
+#line 596 "gram.y"
{
(yyval.digest) = new_digest(SUDO_DIGEST_SHA512, (yyvsp[0].string));
if ((yyval.digest) == NULL) {
@@ -2220,29 +2221,29 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_DIGEST, (yyval.digest));
}
-#line 2218 "gram.c"
+#line 2219 "gram.c"
break;
case 50: /* digestlist: digestlist ',' digestspec */
-#line 607 "gram.y"
+#line 608 "gram.y"
{
parser_leak_remove(LEAK_DIGEST, (yyvsp[0].digest));
HLTQ_CONCAT((yyvsp[-2].digest), (yyvsp[0].digest), entries);
(yyval.digest) = (yyvsp[-2].digest);
}
-#line 2228 "gram.c"
+#line 2229 "gram.c"
break;
case 51: /* digcmnd: opcmnd */
-#line 614 "gram.y"
+#line 615 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
}
-#line 2236 "gram.c"
+#line 2237 "gram.c"
break;
case 52: /* digcmnd: digestlist opcmnd */
-#line 617 "gram.y"
+#line 618 "gram.y"
{
struct sudo_command *c =
(struct sudo_command *) (yyvsp[0].member)->name;
@@ -2255,29 +2256,29 @@ yyreduce:
HLTQ_TO_TAILQ(&c->digests, (yyvsp[-1].digest), entries);
(yyval.member) = (yyvsp[0].member);
}
-#line 2253 "gram.c"
+#line 2254 "gram.c"
break;
case 53: /* opcmnd: cmnd */
-#line 631 "gram.y"
+#line 632 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = false;
}
-#line 2262 "gram.c"
+#line 2263 "gram.c"
break;
case 54: /* opcmnd: '!' cmnd */
-#line 635 "gram.y"
+#line 636 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = true;
}
-#line 2271 "gram.c"
+#line 2272 "gram.c"
break;
case 55: /* chdirspec: CWD '=' WORD */
-#line 641 "gram.y"
+#line 642 "gram.y"
{
if ((yyvsp[0].string)[0] != '/' && (yyvsp[0].string)[0] != '~') {
if (strcmp((yyvsp[0].string), "*") != 0) {
@@ -2292,11 +2293,11 @@ yyreduce:
}
(yyval.string) = (yyvsp[0].string);
}
-#line 2290 "gram.c"
+#line 2291 "gram.c"
break;
case 56: /* chrootspec: CHROOT '=' WORD */
-#line 657 "gram.y"
+#line 658 "gram.y"
{
if ((yyvsp[0].string)[0] != '/' && (yyvsp[0].string)[0] != '~') {
if (strcmp((yyvsp[0].string), "*") != 0) {
@@ -2311,91 +2312,91 @@ yyreduce:
}
(yyval.string) = (yyvsp[0].string);
}
-#line 2309 "gram.c"
+#line 2310 "gram.c"
break;
case 57: /* timeoutspec: CMND_TIMEOUT '=' WORD */
-#line 673 "gram.y"
+#line 674 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2317 "gram.c"
+#line 2318 "gram.c"
break;
case 58: /* notbeforespec: NOTBEFORE '=' WORD */
-#line 678 "gram.y"
+#line 679 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2325 "gram.c"
+#line 2326 "gram.c"
break;
case 59: /* notafterspec: NOTAFTER '=' WORD */
-#line 682 "gram.y"
+#line 683 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2333 "gram.c"
+#line 2334 "gram.c"
break;
case 60: /* rolespec: ROLE '=' WORD */
-#line 687 "gram.y"
+#line 688 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2341 "gram.c"
+#line 2342 "gram.c"
break;
case 61: /* typespec: TYPE '=' WORD */
-#line 692 "gram.y"
+#line 693 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2349 "gram.c"
+#line 2350 "gram.c"
break;
case 62: /* apparmor_profilespec: APPARMOR_PROFILE '=' WORD */
-#line 697 "gram.y"
+#line 698 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2357 "gram.c"
+#line 2358 "gram.c"
break;
case 63: /* privsspec: PRIVS '=' WORD */
-#line 702 "gram.y"
+#line 703 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2365 "gram.c"
+#line 2366 "gram.c"
break;
case 64: /* limitprivsspec: LIMITPRIVS '=' WORD */
-#line 706 "gram.y"
+#line 707 "gram.y"
{
(yyval.string) = (yyvsp[0].string);
}
-#line 2373 "gram.c"
+#line 2374 "gram.c"
break;
case 65: /* runasspec: %empty */
-#line 711 "gram.y"
+#line 712 "gram.y"
{
(yyval.runas) = NULL;
}
-#line 2381 "gram.c"
+#line 2382 "gram.c"
break;
case 66: /* runasspec: '(' runaslist ')' */
-#line 714 "gram.y"
+#line 715 "gram.y"
{
(yyval.runas) = (yyvsp[-1].runas);
}
-#line 2389 "gram.c"
+#line 2390 "gram.c"
break;
case 67: /* runaslist: %empty */
-#line 719 "gram.y"
+#line 720 "gram.y"
{
(yyval.runas) = calloc(1, sizeof(struct runascontainer));
if ((yyval.runas) != NULL) {
@@ -2412,11 +2413,11 @@ yyreduce:
}
parser_leak_add(LEAK_RUNAS, (yyval.runas));
}
-#line 2410 "gram.c"
+#line 2411 "gram.c"
break;
case 68: /* runaslist: userlist */
-#line 735 "gram.y"
+#line 736 "gram.y"
{
(yyval.runas) = calloc(1, sizeof(struct runascontainer));
if ((yyval.runas) == NULL) {
@@ -2428,11 +2429,11 @@ yyreduce:
(yyval.runas)->runasusers = (yyvsp[0].member);
/* $$->runasgroups = NULL; */
}
-#line 2426 "gram.c"
+#line 2427 "gram.c"
break;
case 69: /* runaslist: userlist ':' grouplist */
-#line 746 "gram.y"
+#line 747 "gram.y"
{
(yyval.runas) = calloc(1, sizeof(struct runascontainer));
if ((yyval.runas) == NULL) {
@@ -2445,11 +2446,11 @@ yyreduce:
(yyval.runas)->runasusers = (yyvsp[-2].member);
(yyval.runas)->runasgroups = (yyvsp[0].member);
}
-#line 2443 "gram.c"
+#line 2444 "gram.c"
break;
case 70: /* runaslist: ':' grouplist */
-#line 758 "gram.y"
+#line 759 "gram.y"
{
(yyval.runas) = calloc(1, sizeof(struct runascontainer));
if ((yyval.runas) == NULL) {
@@ -2461,11 +2462,11 @@ yyreduce:
/* $$->runasusers = NULL; */
(yyval.runas)->runasgroups = (yyvsp[0].member);
}
-#line 2459 "gram.c"
+#line 2460 "gram.c"
break;
case 71: /* runaslist: ':' */
-#line 769 "gram.y"
+#line 770 "gram.y"
{
(yyval.runas) = calloc(1, sizeof(struct runascontainer));
if ((yyval.runas) != NULL) {
@@ -2482,114 +2483,114 @@ yyreduce:
}
parser_leak_add(LEAK_RUNAS, (yyval.runas));
}
-#line 2480 "gram.c"
+#line 2481 "gram.c"
break;
case 72: /* reserved_word: ALL */
-#line 787 "gram.y"
- { (yyval.string) = "ALL"; }
-#line 2486 "gram.c"
+#line 788 "gram.y"
+ { (yyval.cstring) = "ALL"; }
+#line 2487 "gram.c"
break;
case 73: /* reserved_word: CHROOT */
-#line 788 "gram.y"
- { (yyval.string) = "CHROOT"; }
-#line 2492 "gram.c"
+#line 789 "gram.y"
+ { (yyval.cstring) = "CHROOT"; }
+#line 2493 "gram.c"
break;
case 74: /* reserved_word: CWD */
-#line 789 "gram.y"
- { (yyval.string) = "CWD"; }
-#line 2498 "gram.c"
+#line 790 "gram.y"
+ { (yyval.cstring) = "CWD"; }
+#line 2499 "gram.c"
break;
case 75: /* reserved_word: CMND_TIMEOUT */
-#line 790 "gram.y"
- { (yyval.string) = "CMND_TIMEOUT"; }
-#line 2504 "gram.c"
+#line 791 "gram.y"
+ { (yyval.cstring) = "CMND_TIMEOUT"; }
+#line 2505 "gram.c"
break;
case 76: /* reserved_word: NOTBEFORE */
-#line 791 "gram.y"
- { (yyval.string) = "NOTBEFORE"; }
-#line 2510 "gram.c"
+#line 792 "gram.y"
+ { (yyval.cstring) = "NOTBEFORE"; }
+#line 2511 "gram.c"
break;
case 77: /* reserved_word: NOTAFTER */
-#line 792 "gram.y"
- { (yyval.string) = "NOTAFTER"; }
-#line 2516 "gram.c"
+#line 793 "gram.y"
+ { (yyval.cstring) = "NOTAFTER"; }
+#line 2517 "gram.c"
break;
case 78: /* reserved_word: ROLE */
-#line 793 "gram.y"
- { (yyval.string) = "ROLE"; }
-#line 2522 "gram.c"
+#line 794 "gram.y"
+ { (yyval.cstring) = "ROLE"; }
+#line 2523 "gram.c"
break;
case 79: /* reserved_word: TYPE */
-#line 794 "gram.y"
- { (yyval.string) = "TYPE"; }
-#line 2528 "gram.c"
+#line 795 "gram.y"
+ { (yyval.cstring) = "TYPE"; }
+#line 2529 "gram.c"
break;
case 80: /* reserved_word: PRIVS */
-#line 795 "gram.y"
- { (yyval.string) = "PRIVS"; }
-#line 2534 "gram.c"
+#line 796 "gram.y"
+ { (yyval.cstring) = "PRIVS"; }
+#line 2535 "gram.c"
break;
case 81: /* reserved_word: LIMITPRIVS */
-#line 796 "gram.y"
- { (yyval.string) = "LIMITPRIVS"; }
-#line 2540 "gram.c"
+#line 797 "gram.y"
+ { (yyval.cstring) = "LIMITPRIVS"; }
+#line 2541 "gram.c"
break;
case 82: /* reserved_word: APPARMOR_PROFILE */
-#line 797 "gram.y"
- { (yyval.string) = "APPARMOR_PROFILE"; }
-#line 2546 "gram.c"
+#line 798 "gram.y"
+ { (yyval.cstring) = "APPARMOR_PROFILE"; }
+#line 2547 "gram.c"
break;
case 83: /* reserved_alias: reserved_word */
-#line 800 "gram.y"
+#line 801 "gram.y"
{
- sudoerserrorf(U_("syntax error, reserved word %s used as an alias name"), (yyvsp[0].string));
+ sudoerserrorf(U_("syntax error, reserved word %s used as an alias name"), (yyvsp[0].cstring));
YYERROR;
}
-#line 2555 "gram.c"
+#line 2556 "gram.c"
break;
case 84: /* options: %empty */
-#line 806 "gram.y"
+#line 807 "gram.y"
{
init_options(&(yyval.options));
}
-#line 2563 "gram.c"
+#line 2564 "gram.c"
break;
case 85: /* options: options chdirspec */
-#line 809 "gram.y"
+#line 810 "gram.y"
{
parser_leak_remove(LEAK_PTR, (yyval.options).runcwd);
free((yyval.options).runcwd);
(yyval.options).runcwd = (yyvsp[0].string);
}
-#line 2573 "gram.c"
+#line 2574 "gram.c"
break;
case 86: /* options: options chrootspec */
-#line 814 "gram.y"
+#line 815 "gram.y"
{
parser_leak_remove(LEAK_PTR, (yyval.options).runchroot);
free((yyval.options).runchroot);
(yyval.options).runchroot = (yyvsp[0].string);
}
-#line 2583 "gram.c"
+#line 2584 "gram.c"
break;
case 87: /* options: options notbeforespec */
-#line 819 "gram.y"
+#line 820 "gram.y"
{
(yyval.options).notbefore = parse_gentime((yyvsp[0].string));
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
@@ -2599,11 +2600,11 @@ yyreduce:
YYERROR;
}
}
-#line 2597 "gram.c"
+#line 2598 "gram.c"
break;
case 88: /* options: options notafterspec */
-#line 828 "gram.y"
+#line 829 "gram.y"
{
(yyval.options).notafter = parse_gentime((yyvsp[0].string));
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
@@ -2613,11 +2614,11 @@ yyreduce:
YYERROR;
}
}
-#line 2611 "gram.c"
+#line 2612 "gram.c"
break;
case 89: /* options: options timeoutspec */
-#line 837 "gram.y"
+#line 838 "gram.y"
{
(yyval.options).timeout = parse_timeout((yyvsp[0].string));
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
@@ -2630,11 +2631,11 @@ yyreduce:
YYERROR;
}
}
-#line 2628 "gram.c"
+#line 2629 "gram.c"
break;
case 90: /* options: options rolespec */
-#line 849 "gram.y"
+#line 850 "gram.y"
{
#ifdef HAVE_SELINUX
parser_leak_remove(LEAK_PTR, (yyval.options).role);
@@ -2642,11 +2643,11 @@ yyreduce:
(yyval.options).role = (yyvsp[0].string);
#endif
}
-#line 2640 "gram.c"
+#line 2641 "gram.c"
break;
case 91: /* options: options typespec */
-#line 856 "gram.y"
+#line 857 "gram.y"
{
#ifdef HAVE_SELINUX
parser_leak_remove(LEAK_PTR, (yyval.options).type);
@@ -2654,23 +2655,23 @@ yyreduce:
(yyval.options).type = (yyvsp[0].string);
#endif
}
-#line 2652 "gram.c"
+#line 2653 "gram.c"
break;
case 92: /* options: options apparmor_profilespec */
-#line 863 "gram.y"
+#line 864 "gram.y"
{
#ifdef HAVE_APPARMOR
- parser_leak_remove(LEAK_PTR, (yyval.options).apparmor_profile);
- free((yyval.options).apparmor_profile);
- (yyval.options).apparmor_profile = (yyvsp[0].string);
+ parser_leak_remove(LEAK_PTR, (yyval.options).apparmor_profile);
+ free((yyval.options).apparmor_profile);
+ (yyval.options).apparmor_profile = (yyvsp[0].string);
#endif
}
-#line 2664 "gram.c"
+#line 2665 "gram.c"
break;
case 93: /* options: options privsspec */
-#line 870 "gram.y"
+#line 871 "gram.y"
{
#ifdef HAVE_PRIV_SET
parser_leak_remove(LEAK_PTR, (yyval.options).privs);
@@ -2678,11 +2679,11 @@ yyreduce:
(yyval.options).privs = (yyvsp[0].string);
#endif
}
-#line 2676 "gram.c"
+#line 2677 "gram.c"
break;
case 94: /* options: options limitprivsspec */
-#line 877 "gram.y"
+#line 878 "gram.y"
{
#ifdef HAVE_PRIV_SET
parser_leak_remove(LEAK_PTR, (yyval.options).limitprivs);
@@ -2690,147 +2691,147 @@ yyreduce:
(yyval.options).limitprivs = (yyvsp[0].string);
#endif
}
-#line 2688 "gram.c"
+#line 2689 "gram.c"
break;
case 95: /* cmndtag: %empty */
-#line 886 "gram.y"
+#line 887 "gram.y"
{
TAGS_INIT(&(yyval.tag));
}
-#line 2696 "gram.c"
+#line 2697 "gram.c"
break;
case 96: /* cmndtag: cmndtag NOPASSWD */
-#line 889 "gram.y"
+#line 890 "gram.y"
{
(yyval.tag).nopasswd = true;
}
-#line 2704 "gram.c"
+#line 2705 "gram.c"
break;
case 97: /* cmndtag: cmndtag PASSWD */
-#line 892 "gram.y"
+#line 893 "gram.y"
{
(yyval.tag).nopasswd = false;
}
-#line 2712 "gram.c"
+#line 2713 "gram.c"
break;
case 98: /* cmndtag: cmndtag NOEXEC */
-#line 895 "gram.y"
+#line 896 "gram.y"
{
(yyval.tag).noexec = true;
}
-#line 2720 "gram.c"
+#line 2721 "gram.c"
break;
case 99: /* cmndtag: cmndtag EXEC */
-#line 898 "gram.y"
+#line 899 "gram.y"
{
(yyval.tag).noexec = false;
}
-#line 2728 "gram.c"
+#line 2729 "gram.c"
break;
case 100: /* cmndtag: cmndtag INTERCEPT */
-#line 901 "gram.y"
+#line 902 "gram.y"
{
(yyval.tag).intercept = true;
}
-#line 2736 "gram.c"
+#line 2737 "gram.c"
break;
case 101: /* cmndtag: cmndtag NOINTERCEPT */
-#line 904 "gram.y"
+#line 905 "gram.y"
{
(yyval.tag).intercept = false;
}
-#line 2744 "gram.c"
+#line 2745 "gram.c"
break;
case 102: /* cmndtag: cmndtag SETENV */
-#line 907 "gram.y"
+#line 908 "gram.y"
{
(yyval.tag).setenv = true;
}
-#line 2752 "gram.c"
+#line 2753 "gram.c"
break;
case 103: /* cmndtag: cmndtag NOSETENV */
-#line 910 "gram.y"
+#line 911 "gram.y"
{
(yyval.tag).setenv = false;
}
-#line 2760 "gram.c"
+#line 2761 "gram.c"
break;
case 104: /* cmndtag: cmndtag LOG_INPUT */
-#line 913 "gram.y"
+#line 914 "gram.y"
{
(yyval.tag).log_input = true;
}
-#line 2768 "gram.c"
+#line 2769 "gram.c"
break;
case 105: /* cmndtag: cmndtag NOLOG_INPUT */
-#line 916 "gram.y"
+#line 917 "gram.y"
{
(yyval.tag).log_input = false;
}
-#line 2776 "gram.c"
+#line 2777 "gram.c"
break;
case 106: /* cmndtag: cmndtag LOG_OUTPUT */
-#line 919 "gram.y"
+#line 920 "gram.y"
{
(yyval.tag).log_output = true;
}
-#line 2784 "gram.c"
+#line 2785 "gram.c"
break;
case 107: /* cmndtag: cmndtag NOLOG_OUTPUT */
-#line 922 "gram.y"
+#line 923 "gram.y"
{
(yyval.tag).log_output = false;
}
-#line 2792 "gram.c"
+#line 2793 "gram.c"
break;
case 108: /* cmndtag: cmndtag FOLLOWLNK */
-#line 925 "gram.y"
+#line 926 "gram.y"
{
(yyval.tag).follow = true;
}
-#line 2800 "gram.c"
+#line 2801 "gram.c"
break;
case 109: /* cmndtag: cmndtag NOFOLLOWLNK */
-#line 928 "gram.y"
+#line 929 "gram.y"
{
(yyval.tag).follow = false;
}
-#line 2808 "gram.c"
+#line 2809 "gram.c"
break;
case 110: /* cmndtag: cmndtag MAIL */
-#line 931 "gram.y"
+#line 932 "gram.y"
{
(yyval.tag).send_mail = true;
}
-#line 2816 "gram.c"
+#line 2817 "gram.c"
break;
case 111: /* cmndtag: cmndtag NOMAIL */
-#line 934 "gram.y"
+#line 935 "gram.y"
{
(yyval.tag).send_mail = false;
}
-#line 2824 "gram.c"
+#line 2825 "gram.c"
break;
case 112: /* cmnd: ALL */
-#line 939 "gram.y"
+#line 940 "gram.y"
{
struct sudo_command *c;
@@ -2845,11 +2846,11 @@ yyreduce:
}
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 2843 "gram.c"
+#line 2844 "gram.c"
break;
case 113: /* cmnd: ALIAS */
-#line 953 "gram.y"
+#line 954 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), ALIAS);
if ((yyval.member) == NULL) {
@@ -2859,11 +2860,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 2857 "gram.c"
+#line 2858 "gram.c"
break;
case 114: /* cmnd: COMMAND */
-#line 962 "gram.y"
+#line 963 "gram.y"
{
struct sudo_command *c;
@@ -2885,20 +2886,20 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].command).args);
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 2883 "gram.c"
+#line 2884 "gram.c"
break;
case 117: /* $@1: %empty */
-#line 989 "gram.y"
+#line 990 "gram.y"
{
alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1;
}
-#line 2892 "gram.c"
+#line 2893 "gram.c"
break;
case 118: /* hostalias: ALIAS $@1 '=' hostlist */
-#line 992 "gram.y"
+#line 993 "gram.y"
{
if (!alias_add(&parsed_policy, (yyvsp[-3].string), HOSTALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2908,30 +2909,30 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
}
-#line 2906 "gram.c"
+#line 2907 "gram.c"
break;
case 121: /* hostlist: hostlist ',' ophost */
-#line 1005 "gram.y"
+#line 1006 "gram.y"
{
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
(yyval.member) = (yyvsp[-2].member);
}
-#line 2916 "gram.c"
+#line 2917 "gram.c"
break;
case 124: /* $@2: %empty */
-#line 1016 "gram.y"
+#line 1017 "gram.y"
{
alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1;
}
-#line 2925 "gram.c"
+#line 2926 "gram.c"
break;
case 125: /* cmndalias: ALIAS $@2 '=' cmndlist */
-#line 1019 "gram.y"
+#line 1020 "gram.y"
{
if (!alias_add(&parsed_policy, (yyvsp[-3].string), CMNDALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2941,30 +2942,30 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
}
-#line 2939 "gram.c"
+#line 2940 "gram.c"
break;
case 128: /* cmndlist: cmndlist ',' digcmnd */
-#line 1032 "gram.y"
+#line 1033 "gram.y"
{
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
(yyval.member) = (yyvsp[-2].member);
}
-#line 2949 "gram.c"
+#line 2950 "gram.c"
break;
case 131: /* $@3: %empty */
-#line 1043 "gram.y"
+#line 1044 "gram.y"
{
alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1;
}
-#line 2958 "gram.c"
+#line 2959 "gram.c"
break;
case 132: /* runasalias: ALIAS $@3 '=' userlist */
-#line 1046 "gram.y"
+#line 1047 "gram.y"
{
if (!alias_add(&parsed_policy, (yyvsp[-3].string), RUNASALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2974,20 +2975,20 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
}
-#line 2972 "gram.c"
+#line 2973 "gram.c"
break;
case 136: /* $@4: %empty */
-#line 1062 "gram.y"
+#line 1063 "gram.y"
{
alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1;
}
-#line 2981 "gram.c"
+#line 2982 "gram.c"
break;
case 137: /* useralias: ALIAS $@4 '=' userlist */
-#line 1065 "gram.y"
+#line 1066 "gram.y"
{
if (!alias_add(&parsed_policy, (yyvsp[-3].string), USERALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2997,39 +2998,39 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
}
-#line 2995 "gram.c"
+#line 2996 "gram.c"
break;
case 140: /* userlist: userlist ',' opuser */
-#line 1078 "gram.y"
+#line 1079 "gram.y"
{
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
(yyval.member) = (yyvsp[-2].member);
}
-#line 3005 "gram.c"
+#line 3006 "gram.c"
break;
case 141: /* opuser: user */
-#line 1085 "gram.y"
+#line 1086 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = false;
}
-#line 3014 "gram.c"
+#line 3015 "gram.c"
break;
case 142: /* opuser: '!' user */
-#line 1089 "gram.y"
+#line 1090 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = true;
}
-#line 3023 "gram.c"
+#line 3024 "gram.c"
break;
case 143: /* user: ALIAS */
-#line 1095 "gram.y"
+#line 1096 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), ALIAS);
if ((yyval.member) == NULL) {
@@ -3039,11 +3040,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3037 "gram.c"
+#line 3038 "gram.c"
break;
case 144: /* user: ALL */
-#line 1104 "gram.y"
+#line 1105 "gram.y"
{
(yyval.member) = new_member(NULL, ALL);
if ((yyval.member) == NULL) {
@@ -3052,11 +3053,11 @@ yyreduce:
}
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3050 "gram.c"
+#line 3051 "gram.c"
break;
case 145: /* user: NETGROUP */
-#line 1112 "gram.y"
+#line 1113 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), NETGROUP);
if ((yyval.member) == NULL) {
@@ -3066,11 +3067,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3064 "gram.c"
+#line 3065 "gram.c"
break;
case 146: /* user: USERGROUP */
-#line 1121 "gram.y"
+#line 1122 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), USERGROUP);
if ((yyval.member) == NULL) {
@@ -3080,11 +3081,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3078 "gram.c"
+#line 3079 "gram.c"
break;
case 147: /* user: WORD */
-#line 1130 "gram.y"
+#line 1131 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), WORD);
if ((yyval.member) == NULL) {
@@ -3094,39 +3095,39 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3092 "gram.c"
+#line 3093 "gram.c"
break;
case 149: /* grouplist: grouplist ',' opgroup */
-#line 1142 "gram.y"
+#line 1143 "gram.y"
{
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
(yyval.member) = (yyvsp[-2].member);
}
-#line 3102 "gram.c"
+#line 3103 "gram.c"
break;
case 150: /* opgroup: group */
-#line 1149 "gram.y"
+#line 1150 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = false;
}
-#line 3111 "gram.c"
+#line 3112 "gram.c"
break;
case 151: /* opgroup: '!' group */
-#line 1153 "gram.y"
+#line 1154 "gram.y"
{
(yyval.member) = (yyvsp[0].member);
(yyval.member)->negated = true;
}
-#line 3120 "gram.c"
+#line 3121 "gram.c"
break;
case 152: /* group: ALIAS */
-#line 1159 "gram.y"
+#line 1160 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), ALIAS);
if ((yyval.member) == NULL) {
@@ -3136,11 +3137,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3134 "gram.c"
+#line 3135 "gram.c"
break;
case 153: /* group: ALL */
-#line 1168 "gram.y"
+#line 1169 "gram.y"
{
(yyval.member) = new_member(NULL, ALL);
if ((yyval.member) == NULL) {
@@ -3149,11 +3150,11 @@ yyreduce:
}
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3147 "gram.c"
+#line 3148 "gram.c"
break;
case 154: /* group: WORD */
-#line 1176 "gram.y"
+#line 1177 "gram.y"
{
(yyval.member) = new_member((yyvsp[0].string), WORD);
if ((yyval.member) == NULL) {
@@ -3163,11 +3164,11 @@ yyreduce:
parser_leak_remove(LEAK_PTR, (yyvsp[0].string));
parser_leak_add(LEAK_MEMBER, (yyval.member));
}
-#line 3161 "gram.c"
+#line 3162 "gram.c"
break;
-#line 3165 "gram.c"
+#line 3166 "gram.c"
default: break;
}
@@ -3360,7 +3361,7 @@ yyreturnlab:
return yyresult;
}
-#line 1186 "gram.y"
+#line 1187 "gram.y"
/* Like yyerror() but takes a printf-style format string. */
void
@@ -3379,7 +3380,8 @@ sudoerserrorf(const char *fmt, ...)
LEXTRACE("<*> ");
#ifndef TRACELEXER
if (trace_print == NULL || trace_print == sudoers_trace_print) {
- char *s, *tofree = NULL;
+ char *tofree = NULL;
+ const char *s;
int oldlocale;
/* Warnings are displayed in the user's locale. */
@@ -3390,10 +3392,12 @@ sudoerserrorf(const char *fmt, ...)
/* Optimize common case, a single string. */
s = _(va_arg(ap, char *));
} else {
- if (vasprintf(&s, _(fmt), ap) != -1)
- tofree = s;
- else
+ if (vasprintf(&tofree, _(fmt), ap) != -1) {
+ s = tofree;
+ } else {
s = _("syntax error");
+ tofree = NULL;
+ }
}
sudo_printf(SUDO_CONV_ERROR_MSG, _("%s:%d:%d: %s\n"), sudoers,
this_lineno, (int)sudolinebuf.toke_start + 1, s);
@@ -3434,11 +3438,15 @@ sudoerserror(const char *s)
sudoers_errstr = NULL;
}
- // -V:sudoerserror:575, 618
+#pragma pvs(push)
+#pragma pvs(disable: 575, 618)
+
if (s == NULL)
sudoerserrorf(NULL);
else
sudoerserrorf("%s", s);
+
+#pragma pvs(pop)
}
static void
@@ -4092,10 +4100,10 @@ found:
#endif /* NO_LEAKS */
}
-void
+#ifdef NO_LEAKS
+static void
parser_leak_free(void)
{
-#ifdef NO_LEAKS
struct parser_leak_entry *entry;
void *next;
debug_decl(parser_leak_run, SUDOERS_DEBUG_PARSER);
@@ -4177,8 +4185,8 @@ parser_leak_free(void)
}
debug_return;
-#endif /* NO_LEAKS */
}
+#endif /* NO_LEAKS */
void
parser_leak_init(void)
diff --git a/plugins/sudoers/gram.h b/plugins/sudoers/gram.h
index 5ed1beaa0..0319ce164 100644
--- a/plugins/sudoers/gram.h
+++ b/plugins/sudoers/gram.h
@@ -185,9 +185,10 @@ union YYSTYPE
struct command_options options;
struct cmndtag tag;
char *string;
+ const char *cstring;
int tok;
-#line 191 "y.tab.h"
+#line 192 "y.tab.h"
};
typedef union YYSTYPE YYSTYPE;
diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y
index edb931322..2ac370918 100644
--- a/plugins/sudoers/gram.y
+++ b/plugins/sudoers/gram.y
@@ -43,7 +43,7 @@
#define this_lineno (sudoerschar == '\n' ? sudolineno - 1 : sudolineno)
// PVS Studio suppression
-// -V::1037, 1042
+// -V::560, 592, 1037, 1042
/*
* Globals
@@ -95,6 +95,7 @@ static void alias_error(const char *name, int errnum);
struct command_options options;
struct cmndtag tag;
char *string;
+ const char *cstring;
int tok;
}
@@ -144,7 +145,7 @@ static void alias_error(const char *name, int errnum);
%token <tok> CWD /* working directory for command */
%token <tok> TYPE /* SELinux type */
%token <tok> ROLE /* SELinux role */
-%token <tok> APPARMOR_PROFILE /* AppArmor profile */
+%token <tok> APPARMOR_PROFILE /* AppArmor profile */
%token <tok> PRIVS /* Solaris privileges */
%token <tok> LIMITPRIVS /* Solaris limit privileges */
%token <tok> CMND_TIMEOUT /* command timeout */
@@ -193,7 +194,7 @@ static void alias_error(const char *name, int errnum);
%type <string> includedir
%type <digest> digestspec
%type <digest> digestlist
-%type <string> reserved_word
+%type <cstring> reserved_word
%%
@@ -537,8 +538,8 @@ cmndspec : runasspec options cmndtag digcmnd {
parser_leak_remove(LEAK_PTR, $2.type);
#endif
#ifdef HAVE_APPARMOR
- cs->apparmor_profile = $2.apparmor_profile;
- parser_leak_remove(LEAK_PTR, $2.apparmor_profile);
+ cs->apparmor_profile = $2.apparmor_profile;
+ parser_leak_remove(LEAK_PTR, $2.apparmor_profile);
#endif
#ifdef HAVE_PRIV_SET
cs->privs = $2.privs;
@@ -794,7 +795,7 @@ reserved_word : ALL { $$ = "ALL"; }
| TYPE { $$ = "TYPE"; }
| PRIVS { $$ = "PRIVS"; }
| LIMITPRIVS { $$ = "LIMITPRIVS"; }
- | APPARMOR_PROFILE { $$ = "APPARMOR_PROFILE"; }
+ | APPARMOR_PROFILE { $$ = "APPARMOR_PROFILE"; }
;
reserved_alias : reserved_word {
@@ -862,9 +863,9 @@ options : /* empty */ {
}
| options apparmor_profilespec {
#ifdef HAVE_APPARMOR
- parser_leak_remove(LEAK_PTR, $$.apparmor_profile);
- free($$.apparmor_profile);
- $$.apparmor_profile = $2;
+ parser_leak_remove(LEAK_PTR, $$.apparmor_profile);
+ free($$.apparmor_profile);
+ $$.apparmor_profile = $2;
#endif
}
| options privsspec {
@@ -1201,7 +1202,8 @@ sudoerserrorf(const char *fmt, ...)
LEXTRACE("<*> ");
#ifndef TRACELEXER
if (trace_print == NULL || trace_print == sudoers_trace_print) {
- char *s, *tofree = NULL;
+ char *tofree = NULL;
+ const char *s;
int oldlocale;
/* Warnings are displayed in the user's locale. */
@@ -1212,10 +1214,12 @@ sudoerserrorf(const char *fmt, ...)
/* Optimize common case, a single string. */
s = _(va_arg(ap, char *));
} else {
- if (vasprintf(&s, _(fmt), ap) != -1)
- tofree = s;
- else
+ if (vasprintf(&tofree, _(fmt), ap) != -1) {
+ s = tofree;
+ } else {
s = _("syntax error");
+ tofree = NULL;
+ }
}
sudo_printf(SUDO_CONV_ERROR_MSG, _("%s:%d:%d: %s\n"), sudoers,
this_lineno, (int)sudolinebuf.toke_start + 1, s);
@@ -1256,11 +1260,15 @@ sudoerserror(const char *s)
sudoers_errstr = NULL;
}
- // -V:sudoerserror:575, 618
+#pragma pvs(push)
+#pragma pvs(disable: 575, 618)
+
if (s == NULL)
sudoerserrorf(NULL);
else
sudoerserrorf("%s", s);
+
+#pragma pvs(pop)
}
static void
@@ -1914,10 +1922,10 @@ found:
#endif /* NO_LEAKS */
}
-void
+#ifdef NO_LEAKS
+static void
parser_leak_free(void)
{
-#ifdef NO_LEAKS
struct parser_leak_entry *entry;
void *next;
debug_decl(parser_leak_run, SUDOERS_DEBUG_PARSER);
@@ -1999,8 +2007,8 @@ parser_leak_free(void)
}
debug_return;
-#endif /* NO_LEAKS */
}
+#endif /* NO_LEAKS */
void
parser_leak_init(void)
diff --git a/plugins/sudoers/group_plugin.c b/plugins/sudoers/group_plugin.c
index e11cfb1f1..72a35b6ef 100644
--- a/plugins/sudoers/group_plugin.c
+++ b/plugins/sudoers/group_plugin.c
@@ -41,17 +41,102 @@ static struct sudoers_group_plugin *group_plugin;
const char *path_plugin_dir = _PATH_SUDO_PLUGIN_DIR;
/*
+ * Check for a fallback path when the original group plugin is not loadable.
+ * Returns true on success, rewriting path and filling in sb, else false.
+ */
+static bool
+group_plugin_fallback(char *path, size_t pathsize, struct stat *sb)
+{
+#if defined(__LP64__)
+ char newpath[PATH_MAX];
+ bool ret = false;
+ int len;
+ debug_decl(group_plugin_fallback, SUDOERS_DEBUG_UTIL);
+
+# if defined(__sun__) || defined(__linux__)
+ /*
+ * Solaris uses /lib/64 and /usr/lib/64 for 64-bit libraries.
+ * Linux may use /lib64 and /usr/lib64 for 64-bit libraries.
+ * If dirname(path) ends in /lib, try /lib/64 (Solaris) or /lib64 (Linux).
+ */
+# if defined(__sun__)
+ const char *lib64 = "lib/64";
+# else
+ const char *lib64 = "lib64";
+# endif
+ const char *base, *slash;
+ int dirlen;
+
+ slash = strrchr(path, '/');
+ if (slash == NULL) {
+ goto done;
+ }
+ base = slash + 1;
+
+ /* Collapse consecutive slashes. */
+ while (slash > path && slash[-1] == '/') {
+ slash--;
+ }
+
+ /* If directory ends in /lib/, try again with /lib/64/ or /lib64/. */
+ dirlen = slash - path;
+ if (dirlen < 4 || strncmp(slash - 4, "/lib", 4) != 0) {
+ goto done;
+ }
+ dirlen -= 4;
+ len = snprintf(newpath, sizeof(newpath), "%.*s/%s/%s", dirlen, path, lib64,
+ base);
+# else /* !__sun__ && !__linux__ */
+ /*
+ * Multilib not supported, check for a path of the form libfoo64.so.
+ */
+ const char *dot;
+ int plen;
+
+ dot = strrchr(path, '.');
+ if (dot == NULL) {
+ goto done;
+ }
+ plen = dot - path;
+
+ /* If basename(path) doesn't match libfoo64.so, try adding the 64. */
+ if (plen >= 2 && strncmp(dot - 2, "64", 2) == 0) {
+ goto done;
+ }
+ len = snprintf(newpath, sizeof(newpath), "%.*s64%s", plen, path, dot);
+# endif /* __sun__ || __linux__ */
+ if (len < 0 || len >= ssizeof(newpath)) {
+ errno = ENAMETOOLONG;
+ goto done;
+ }
+ if (stat(newpath, sb) == -1) {
+ goto done;
+ }
+ if (strlcpy(path, newpath, pathsize) >= pathsize) {
+ errno = ENAMETOOLONG;
+ goto done;
+ }
+ ret = true;
+done:
+ debug_return_bool(ret);
+#else
+ return false;
+#endif /* __LP64__ */
+}
+
+/*
* 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)
+group_plugin_load(const char *plugin_info)
{
struct stat sb;
char *args, path[PATH_MAX];
char **argv = NULL;
int len, rc = -1;
+ bool retry = true;
debug_decl(group_plugin_load, SUDOERS_DEBUG_UTIL);
/*
@@ -72,31 +157,41 @@ group_plugin_load(char *plugin_info)
(*plugin_info != '/') ? path_plugin_dir : "", plugin_info);
goto done;
}
-
- /* Check owner and mode of plugin path. */
if (stat(path, &sb) != 0) {
sudo_warn("%s", path);
goto done;
}
- if (!sudo_conf_developer_mode()) {
- 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;
+ for (;;) {
+ if (!sudo_conf_developer_mode()) {
+ /* Check owner and mode of plugin path. */
+ 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;
+ }
+ }
+
+ group_handle = sudo_dso_load(path, SUDO_DSO_LAZY|SUDO_DSO_GLOBAL);
+ if (group_handle != NULL) {
+ break;
+ }
+
+ if (!retry || !group_plugin_fallback(path, sizeof(path), &sb)) {
+ const char *errstr = sudo_dso_strerror();
+ sudo_warnx(U_("unable to load %s: %s"), path,
+ errstr ? errstr : "unknown error");
+ goto done;
+ }
+
+ /* Retry once with the fallback path. */
+ retry = false;
}
+
+ /* Map in symbol from group plugin. */
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);
@@ -193,7 +288,7 @@ group_plugin_query(const char *user, const char *group,
*/
int
-group_plugin_load(char *plugin_info)
+group_plugin_load(const char *plugin_info)
{
debug_decl(group_plugin_load, SUDOERS_DEBUG_UTIL);
debug_return_int(false);
diff --git a/plugins/sudoers/insults.h b/plugins/sudoers/insults.h
index d7d8074de..752d7e6e4 100644
--- a/plugins/sudoers/insults.h
+++ b/plugins/sudoers/insults.h
@@ -28,7 +28,7 @@
* Use one or more set of insults as determined by configure
*/
-char *insults[] = {
+const char *insults[] = {
# ifdef HAL_INSULTS
# include "ins_2001.h"
diff --git a/plugins/sudoers/iolog.c b/plugins/sudoers/iolog.c
index aae5713ff..fc1bc7d11 100644
--- a/plugins/sudoers/iolog.c
+++ b/plugins/sudoers/iolog.c
@@ -259,7 +259,7 @@ static void *
set_passprompt_regex(const char *cstr)
{
void *handle;
- char *cp, *last, *str;
+ char *cp, *str, *last = NULL;
debug_decl(set_passprompt_regex, SUDOERS_DEBUG_UTIL);
handle = iolog_pwfilt_alloc();
@@ -288,7 +288,7 @@ bad:
* Pull out I/O log related data from user_info and command_info arrays.
* Returns true if I/O logging is enabled, false if not and -1 on error.
*/
-int
+static int
iolog_deserialize_info(struct log_details *details, char * const user_info[],
char * const command_info[], char * const argv[], char * const user_env[])
{
diff --git a/plugins/sudoers/ldap.c b/plugins/sudoers/ldap.c
index 4f0192265..6f81883d6 100644
--- a/plugins/sudoers/ldap.c
+++ b/plugins/sudoers/ldap.c
@@ -297,7 +297,7 @@ done:
* on error.
*/
static struct berval **
-sudo_ldap_get_values_len(LDAP *ld, LDAPMessage *entry, char *attr, int *rc)
+sudo_ldap_get_values_len(LDAP *ld, LDAPMessage *entry, const char *attr, int *rc)
{
struct berval **bval;
@@ -1613,7 +1613,7 @@ sudo_ldap_bind_s(LDAP *ld)
{
struct berval bv;
- bv.bv_val = ldap_conf.bindpw ? ldap_conf.bindpw : "";
+ bv.bv_val = ldap_conf.bindpw ? ldap_conf.bindpw : (char *)"";
bv.bv_len = strlen(bv.bv_val);
ret = ldap_sasl_bind_s(ld, ldap_conf.binddn, LDAP_SASL_SIMPLE, &bv,
diff --git a/plugins/sudoers/ldap_conf.c b/plugins/sudoers/ldap_conf.c
index 38d54a3a3..7e4a2e3ad 100644
--- a/plugins/sudoers/ldap_conf.c
+++ b/plugins/sudoers/ldap_conf.c
@@ -242,7 +242,8 @@ sudo_ldap_parse_uri(const struct ldap_config_str_list *uri_list)
hostbuf[0] = '\0';
STAILQ_FOREACH(entry, uri_list, entries) {
- char *cp, *host, *last, *port, *uri;
+ char *cp, *last, *uri;
+ const char *host, *port;
buf = strdup(entry->val);
if (buf == NULL) {
diff --git a/plugins/sudoers/log_client.c b/plugins/sudoers/log_client.c
index f1f1c016f..a53ffe427 100644
--- a/plugins/sudoers/log_client.c
+++ b/plugins/sudoers/log_client.c
@@ -16,7 +16,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
+/*
+ * 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 <config.h>
#ifdef SUDOERS_LOG_CLIENT
@@ -755,7 +760,7 @@ done:
* Appends the wire format message to the closure's write queue.
* Returns true on success, false on failure.
*/
-bool
+static bool
fmt_client_hello(struct client_closure *closure)
{
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
@@ -766,7 +771,7 @@ fmt_client_hello(struct client_closure *closure)
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: sending ClientHello", __func__);
/* Client name + version */
- hello_msg.client_id = "sudoers " PACKAGE_VERSION;
+ hello_msg.client_id = (char *)"sudoers " PACKAGE_VERSION;
/* Schedule ClientMessage */
client_msg.u.hello_msg = &hello_msg;
@@ -840,6 +845,27 @@ fmt_info_messages(struct client_closure *closure, struct eventlog *evlog,
info_message__init(info_msgs[n]);
}
+#define fill_str(_n, _v) do { \
+ info_msgs[n]->key = (char *)(_n); \
+ info_msgs[n]->u.strval = (_v); \
+ info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; \
+ n++; \
+} while (0)
+
+#define fill_strlist(_n, _v) do { \
+ info_msgs[n]->key = (char *)(_n); \
+ info_msgs[n]->u.strlistval = (_v); \
+ info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL; \
+ n++; \
+} while (0)
+
+#define fill_num(_n, _v) do { \
+ info_msgs[n]->key = (char *)(_n); \
+ info_msgs[n]->u.numval = (_v); \
+ info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL; \
+ n++; \
+} while (0)
+
/* Fill in info_msgs */
n = 0;
@@ -847,106 +873,45 @@ fmt_info_messages(struct client_closure *closure, struct eventlog *evlog,
/* TODO: clientpid */
/* TODO: clientppid */
/* TODO: clientsid */
-
- info_msgs[n]->key = "columns";
- info_msgs[n]->u.numval = evlog->columns;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
-
- info_msgs[n]->key = "command";
- info_msgs[n]->u.strval = evlog->command;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
- info_msgs[n]->key = "lines";
- info_msgs[n]->u.numval = evlog->lines;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
-
+ fill_num("columns", evlog->columns);
+ fill_str("command", evlog->command);
+ fill_num("lines", evlog->lines);
if (runargv != NULL) {
- info_msgs[n]->key = "runargv";
- info_msgs[n]->u.strlistval = runargv;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL;
- n++;
+ fill_strlist("runargv", runargv);
+ runargv = NULL;
+ }
+ if (evlog->runchroot != NULL) {
+ fill_str("runchroot", evlog->runchroot);
+ }
+ if (evlog->runcwd != NULL) {
+ fill_str("runcwd", evlog->runcwd);
}
-
if (runenv != NULL) {
- info_msgs[n]->key = "runenv";
- info_msgs[n]->u.strlistval = runenv;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL;
- n++;
+ fill_strlist("runenv", runenv);
+ runenv = NULL;
}
-
if (evlog->rungroup != NULL) {
- info_msgs[n]->key = "rungid";
- info_msgs[n]->u.numval = evlog->rungid;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
-
- info_msgs[n]->key = "rungroup";
- info_msgs[n]->u.strval = evlog->rungroup;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
+ fill_num("rungid", evlog->rungid);
+ fill_str("rungroup", evlog->rungroup);
}
-
/* TODO - rungids */
/* TODO - rungroups */
-
- info_msgs[n]->key = "runuid";
- info_msgs[n]->u.numval = evlog->runuid;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL;
- n++;
-
- info_msgs[n]->key = "runuser";
- info_msgs[n]->u.strval = evlog->runuser;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
+ fill_num("runuid", evlog->runuid);
+ fill_str("runuser", evlog->runuser);
if (evlog->cwd != NULL) {
- info_msgs[n]->key = "submitcwd";
- info_msgs[n]->u.strval = evlog->cwd;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
+ fill_str("submitcwd", evlog->cwd);
}
-
- if (evlog->runcwd != NULL) {
- info_msgs[n]->key = "runcwd";
- info_msgs[n]->u.strval = evlog->runcwd;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
- }
-
- if (evlog->runchroot != NULL) {
- info_msgs[n]->key = "runchroot";
- info_msgs[n]->u.strval = evlog->runchroot;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
- }
-
/* TODO - submitenv */
/* TODO - submitgid */
/* TODO - submitgids */
/* TODO - submitgroup */
/* TODO - submitgroups */
-
- info_msgs[n]->key = "submithost";
- info_msgs[n]->u.strval = evlog->submithost;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
+ fill_str("submithost", evlog->submithost);
/* TODO - submituid */
-
- info_msgs[n]->key = "submituser";
- info_msgs[n]->u.strval = evlog->submituser;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
-
- if (evlog->ttyname != NULL) {
- info_msgs[n]->key = "ttyname";
- info_msgs[n]->u.strval = evlog->ttyname;
- info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL;
- n++;
- }
+ fill_str("submituser", evlog->submituser);
+// if (evlog->ttyname != NULL) {
+ fill_str("ttyname", evlog->ttyname);
+ // }
/* Free unused structs. */
while (info_msgs_size > n)
@@ -1569,7 +1534,7 @@ handle_log_id(char *id, struct client_closure *closure)
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: remote log ID: %s", __func__, id);
if (closure->iolog_id != NULL) {
if ((closure->iolog_id = strdup(id)) == NULL)
- sudo_fatal(NULL);
+ sudo_fatal(U_("%s: %s"), __func__, U_("unable to allocate memory"));
}
debug_return_bool(true);
}
diff --git a/plugins/sudoers/logging.c b/plugins/sudoers/logging.c
index 286c6aee8..e240ca692 100644
--- a/plugins/sudoers/logging.c
+++ b/plugins/sudoers/logging.c
@@ -263,7 +263,7 @@ log_reject(const char *message, bool logit, bool mailit)
if (!logit)
SET(evl_flags, EVLOG_MAIL_ONLY);
}
- sudoers_to_eventlog(&evlog, NewArgv, env_get(), uuid_str);
+ sudoers_to_eventlog(&evlog, safe_cmnd, NewArgv, env_get(), uuid_str);
ret = eventlog_reject(&evlog, evl_flags, message, NULL, NULL);
if (!log_server_reject(&evlog, message))
ret = false;
@@ -612,7 +612,8 @@ log_exit_status(int status)
/* Log and mail messages should be in the sudoers locale. */
sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
- sudoers_to_eventlog(&evlog, NewArgv, env_get(), sudo_user.uuid_str);
+ sudoers_to_eventlog(&evlog, saved_cmnd, saved_argv, env_get(),
+ sudo_user.uuid_str);
if (def_mail_always) {
SET(evl_flags, EVLOG_MAIL);
if (!def_log_exit_status)
@@ -695,7 +696,8 @@ vlog_warning(int flags, int errnum, const char *fmt, va_list ap)
if (ISSET(flags, SLOG_NO_LOG))
SET(evl_flags, EVLOG_MAIL_ONLY);
}
- sudoers_to_eventlog(&evlog, NewArgv, env_get(), sudo_user.uuid_str);
+ sudoers_to_eventlog(&evlog, safe_cmnd, NewArgv, env_get(),
+ sudo_user.uuid_str);
eventlog_alert(&evlog, evl_flags, &now, message, errstr);
log_server_alert(&evlog, &now, message, errstr);
}
@@ -791,7 +793,8 @@ mail_parse_errors(void)
ret = false;
goto done;
}
- sudoers_to_eventlog(&evlog, NewArgv, env_get(), sudo_user.uuid_str);
+ sudoers_to_eventlog(&evlog, safe_cmnd, NewArgv, env_get(),
+ sudo_user.uuid_str);
len = strlen(_("problem parsing sudoers")) + 1;
STAILQ_FOREACH(pe, &parse_error_list, entries) {
@@ -849,18 +852,21 @@ log_parse_error(const char *file, int line, int column, const char *fmt,
va_list args)
{
const int flags = SLOG_RAW_MSG|SLOG_NO_STDERR;
- char *errstr, *tofree = NULL;
+ char *tofree = NULL;
+ const char *errstr;
struct parse_error *pe;
bool ret;
debug_decl(log_parse_error, SUDOERS_DEBUG_LOGGING);
- if (strcmp(fmt, "%s") == 0) {
+ if (fmt == NULL) {
+ errstr = _("syntax error");
+ } else if (strcmp(fmt, "%s") == 0) {
/* Optimize common case, a single string. */
errstr = _(va_arg(args, char *));
} else {
- if (vasprintf(&errstr, _(fmt), args) == -1)
+ if (vasprintf(&tofree, _(fmt), args) == -1)
debug_return_bool(false);
- tofree = errstr;
+ errstr = tofree;
}
if (line > 0) {
@@ -916,8 +922,8 @@ should_mail(int status)
* The values in the resulting eventlog struct should not be freed.
*/
void
-sudoers_to_eventlog(struct eventlog *evlog, char * const argv[],
- char * const envp[], const char *uuid_str)
+sudoers_to_eventlog(struct eventlog *evlog, const char *cmnd,
+ char * const argv[], char * const envp[], const char *uuid_str)
{
struct group *grp;
debug_decl(sudoers_to_eventlog, SUDOERS_DEBUG_LOGGING);
@@ -929,7 +935,7 @@ sudoers_to_eventlog(struct eventlog *evlog, char * const argv[],
memset(evlog, 0, sizeof(*evlog));
evlog->iolog_file = sudo_user.iolog_file;
evlog->iolog_path = sudo_user.iolog_path;
- evlog->command = safe_cmnd ? safe_cmnd : (argv ? argv[0] : NULL);
+ evlog->command = cmnd ? (char *)cmnd : (argv ? argv[0] : NULL);
evlog->cwd = user_cwd;
if (def_runchroot != NULL && strcmp(def_runchroot, "*") != 0) {
evlog->runchroot = def_runchroot;
@@ -986,11 +992,11 @@ sudoers_to_eventlog(struct eventlog *evlog, char * const argv[],
static FILE *
sudoers_log_open(int type, const char *log_file)
{
+ const char *omode;
bool uid_changed;
FILE *fp = NULL;
mode_t oldmask;
int fd, flags;
- char *omode;
debug_decl(sudoers_log_open, SUDOERS_DEBUG_LOGGING);
switch (type) {
diff --git a/plugins/sudoers/logging.h b/plugins/sudoers/logging.h
index 887b91aaa..43e5a40c4 100644
--- a/plugins/sudoers/logging.h
+++ b/plugins/sudoers/logging.h
@@ -62,6 +62,7 @@ typedef bool (*sudoers_logger_t)(const char *file, int line, int column, const c
/* XXX - needed for auditing */
extern int NewArgc;
extern char **NewArgv;
+extern char **saved_argv;
extern char *audit_msg;
union sudo_defs_val;
@@ -71,8 +72,8 @@ struct log_details;
bool sudoers_warn_setlocale(bool restore, int *cookie);
bool sudoers_setlocale(int locale_type, int *prev_locale);
int sudoers_getlocale(void);
-int audit_failure(char *const argv[], char const *const fmt, ...) __printflike(2, 3);
-int vaudit_failure(char *const argv[], char const *const fmt, va_list ap) __printflike(2, 0);
+int audit_failure(char *const argv[], char const *const fmt, ...) sudo_printflike(2, 3);
+int vaudit_failure(char *const argv[], char const *const fmt, va_list ap) sudo_printflike(2, 0);
bool log_allowed(struct eventlog *evlog);
bool log_exit_status(int exit_status);
bool log_auth_failure(int status, unsigned int tries);
@@ -80,15 +81,15 @@ bool log_denial(int status, bool inform_user);
bool log_failure(int status, int flags);
bool log_server_alert(struct eventlog *evlog, struct timespec *now, const char *message, const char *errstr);
bool log_server_reject(struct eventlog *evlog, const char *message);
-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 log_warning(int flags, const char *fmt, ...) sudo_printflike(2, 3);
+bool log_warningx(int flags, const char *fmt, ...) sudo_printflike(2, 3);
+bool gai_log_warning(int flags, int errnum, const char *fmt, ...) sudo_printflike(3, 4);
bool sudoers_initlocale(const char *ulocale, const char *slocale);
bool sudoers_locale_callback(const char *file, int line, int column, const union sudo_defs_val *sd_un, int op);
-void sudoers_to_eventlog(struct eventlog *evlog, char * const argv[], char *const envp[], const char *uuid_str);
+void sudoers_to_eventlog(struct eventlog *evlog, const char *cmnd, char * const argv[], char *const envp[], const char *uuid_str);
void init_eventlog_config(void);
bool init_log_details(struct log_details *details, struct eventlog *evlog);
-bool log_parse_error(const char *file, int line, int column, const char *fmt, va_list ap) __printflike(4, 0);
+bool log_parse_error(const char *file, int line, int column, const char *fmt, va_list ap) sudo_printf0like(4, 0);
bool mail_parse_errors(void);
#endif /* SUDOERS_LOGGING_H */
diff --git a/plugins/sudoers/match_command.c b/plugins/sudoers/match_command.c
index deca7d1cf..37d376d32 100644
--- a/plugins/sudoers/match_command.c
+++ b/plugins/sudoers/match_command.c
@@ -89,8 +89,10 @@ command_args_match(const char *sudoers_cmnd, const char *sudoers_args)
* 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)))
+ if (sudoers_args == NULL)
debug_return_bool(true);
+ if (strcmp("\"\"", sudoers_args) == 0)
+ debug_return_bool(user_args ? false : true);
/*
* If args are specified in sudoers, they must match the user args.
@@ -391,15 +393,22 @@ command_matches_all(const char *runchroot,
debug_decl(command_matches_all, SUDOERS_DEBUG_MATCH);
if (user_cmnd[0] == '/') {
- /* Open the file for fdexec or for digest matching. */
- if (!open_cmnd(user_cmnd, runchroot, digests, &fd))
- goto bad;
#ifndef SUDOERS_NAME_MATCH
+ /* Open the file for fdexec or for digest matching. */
+ bool open_error = !open_cmnd(user_cmnd, runchroot, digests, &fd);
+
/* A non-existent file is not an error for "sudo ALL". */
if (do_stat(fd, user_cmnd, runchroot, &sb)) {
+ if (open_error) {
+ /* File exists but we couldn't open it above? */
+ goto bad;
+ }
if (!intercept_ok(user_cmnd, intercepted, &sb))
goto bad;
}
+#else
+ /* Open the file for fdexec or for digest matching. */
+ (void)open_cmnd(user_cmnd, runchroot, digests, &fd);
#endif
}
diff --git a/plugins/sudoers/match_digest.c b/plugins/sudoers/match_digest.c
index 1763e8e30..f1655951e 100644
--- a/plugins/sudoers/match_digest.c
+++ b/plugins/sudoers/match_digest.c
@@ -105,9 +105,9 @@ digest_matches(int fd, const char *path, const char *runchroot,
} else {
/* Convert base64 to binary. */
size_t len = base64_decode(digest->digest_str, sudoers_digest, digest_len);
+ if (len == (size_t)-1)
+ goto bad_format;
if (len != digest_len) {
- if (len == (size_t)-1)
- goto bad_format;
sudo_warnx(
U_("digest for %s (%s) bad length %zu, expected %zu"),
path, digest->digest_str, len, digest_len);
diff --git a/plugins/sudoers/parse.c b/plugins/sudoers/parse.c
index a56f86c81..3745efbe2 100644
--- a/plugins/sudoers/parse.c
+++ b/plugins/sudoers/parse.c
@@ -257,18 +257,18 @@ apply_cmndspec(struct cmndspec *cs)
#ifdef HAVE_APPARMOR
/* Set AppArmor profile, if specified */
if (cs->apparmor_profile != NULL) {
- user_apparmor_profile = strdup(cs->apparmor_profile);
- if (user_apparmor_profile == NULL) {
- sudo_warnx(U_("%s: %s"), __func__,
- U_("unable to allocate memory"));
- debug_return_bool(false);
- }
+ user_apparmor_profile = strdup(cs->apparmor_profile);
+ if (user_apparmor_profile == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__,
+ U_("unable to allocate memory"));
+ debug_return_bool(false);
+ }
} else {
- user_apparmor_profile = def_apparmor_profile;
- def_apparmor_profile = NULL;
+ user_apparmor_profile = def_apparmor_profile;
+ def_apparmor_profile = NULL;
}
if (user_apparmor_profile != NULL) {
- sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+ sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
"user_apparmor_profile -> %s", user_apparmor_profile);
}
#endif
@@ -358,11 +358,13 @@ apply_cmndspec(struct cmndspec *cs)
}
if (cs->tags.log_input != UNSPEC) {
def_log_input = cs->tags.log_input;
+ cb_log_input(NULL, 0, 0, NULL, cs->tags.log_input);
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
"def_log_input -> %s", def_log_input ? "true" : "false");
}
if (cs->tags.log_output != UNSPEC) {
def_log_output = cs->tags.log_output;
+ cb_log_output(NULL, 0, 0, NULL, cs->tags.log_output);
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
"def_log_output -> %s", def_log_output ? "true" : "false");
}
@@ -468,7 +470,7 @@ display_priv_short(struct sudoers_parse_tree *parse_tree, struct passwd *pw,
debug_decl(display_priv_short, SUDOERS_DEBUG_PARSER);
TAILQ_FOREACH(priv, &us->privileges, entries) {
- struct cmndspec *cs, *prev_cs = NULL;
+ struct cmndspec *cs;
struct cmndtag tags;
if (hostlist_matches(parse_tree, pw, &priv->hostlist) != ALLOW)
@@ -476,11 +478,13 @@ display_priv_short(struct sudoers_parse_tree *parse_tree, struct passwd *pw,
sudoers_defaults_list_to_tags(&priv->defaults, &tags);
TAILQ_FOREACH(cs, &priv->cmndlist, entries) {
- /* Start a new line if RunAs changes. */
+ struct cmndspec *prev_cs = TAILQ_PREV(cs, cmndspec_list, entries);
+
if (prev_cs == NULL || RUNAS_CHANGED(cs, prev_cs)) {
struct member *m;
- if (cs != TAILQ_FIRST(&priv->cmndlist))
+ /* Start new line, first entry or RunAs changed. */
+ if (prev_cs != NULL)
sudo_lbuf_append(lbuf, "\n");
sudo_lbuf_append(lbuf, " (");
if (cs->runasuserlist != NULL) {
@@ -505,11 +509,13 @@ display_priv_short(struct sudoers_parse_tree *parse_tree, struct passwd *pw,
}
}
sudo_lbuf_append(lbuf, ") ");
- } else if (cs != TAILQ_FIRST(&priv->cmndlist)) {
+ sudoers_format_cmndspec(lbuf, parse_tree, cs, NULL, tags, true);
+ } else {
+ /* Continue existing line. */
sudo_lbuf_append(lbuf, ", ");
+ sudoers_format_cmndspec(lbuf, parse_tree, cs, prev_cs, tags,
+ true);
}
- sudoers_format_cmndspec(lbuf, parse_tree, cs, prev_cs, tags, true);
- prev_cs = cs;
nfound++;
}
sudo_lbuf_append(lbuf, "\n");
@@ -719,7 +725,7 @@ display_defaults(struct sudoers_parse_tree *parse_tree, struct passwd *pw,
struct sudo_lbuf *lbuf)
{
struct defaults *d;
- char *prefix;
+ const char *prefix;
int nfound = 0;
debug_decl(display_defaults, SUDOERS_DEBUG_PARSER);
@@ -762,7 +768,7 @@ display_bound_defaults_by_type(struct sudoers_parse_tree *parse_tree,
struct defaults *d;
struct defaults_binding *binding = NULL;
struct member *m;
- char *dsep;
+ const char *dsep;
int atype, nfound = 0;
debug_decl(display_bound_defaults_by_type, SUDOERS_DEBUG_PARSER);
diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h
index e276faad0..cac32b611 100644
--- a/plugins/sudoers/parse.h
+++ b/plugins/sudoers/parse.h
@@ -150,7 +150,7 @@ struct command_options {
char *role, *type; /* SELinux role and type */
#endif
#ifdef HAVE_APPARMOR
- char *apparmor_profile; /* AppArmor profile */
+ char *apparmor_profile; /* AppArmor profile */
#endif
#ifdef HAVE_PRIV_SET
char *privs, *limitprivs; /* Solaris privilege sets */
@@ -237,7 +237,7 @@ struct cmndspec {
char *role, *type; /* SELinux role and type */
#endif
#ifdef HAVE_APPARMOR
- char *apparmor_profile; /* AppArmor profile */
+ char *apparmor_profile; /* AppArmor profile */
#endif
#ifdef HAVE_PRIV_SET
char *privs, *limitprivs; /* Solaris privilege sets */
diff --git a/plugins/sudoers/po/de.mo b/plugins/sudoers/po/de.mo
index ae40a6aee..4d6260403 100644
--- a/plugins/sudoers/po/de.mo
+++ b/plugins/sudoers/po/de.mo
Binary files differ
diff --git a/plugins/sudoers/po/de.po b/plugins/sudoers/po/de.po
index 3f813136b..8cbf7a008 100644
--- a/plugins/sudoers/po/de.po
+++ b/plugins/sudoers/po/de.po
@@ -6,10 +6,10 @@
# Jochen Hein <jochen@jochen.org>, 2001-2022.
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.11b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 12:45+0200\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-11 19:01+0200\n"
"Last-Translator: Jochen Hein <jochen@jochen.org>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
"Language: de\n"
@@ -20,7 +20,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
-#: confstr.sh:1 gram.y:1218
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "Syntax-Fehler"
@@ -44,13 +44,13 @@ msgstr "*** Sicherheits-Information für %h ***"
msgid "Sorry, try again."
msgstr "Das hat nicht funktioniert, bitte nochmal probieren."
-#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341
-#: gram.y:365 gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427
-#: gram.y:501 gram.y:511 gram.y:523 gram.y:571 gram.y:580 gram.y:589
-#: gram.y:598 gram.y:730 gram.y:738 gram.y:749 gram.y:761 gram.y:780
-#: gram.y:943 gram.y:948 gram.y:956 gram.y:970 gram.y:976 gram.y:1098
-#: gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133 gram.y:1162 gram.y:1171
-#: gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769 gram.y:1816
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
@@ -60,50 +60,64 @@ msgstr "Das hat nicht funktioniert, bitte nochmal probieren."
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
-#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:168 plugins/sudoers/cvtsudoers.c:131
-#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
-#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
-#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
-#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:862
-#: plugins/sudoers/cvtsudoers.c:870 plugins/sudoers/cvtsudoers.c:1365
-#: plugins/sudoers/cvtsudoers.c:1369 plugins/sudoers/cvtsudoers.c:1471
-#: plugins/sudoers/cvtsudoers_csv.c:183 plugins/sudoers/cvtsudoers_csv.c:246
-#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
-#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
-#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:376
-#: plugins/sudoers/cvtsudoers_ldif.c:430 plugins/sudoers/cvtsudoers_ldif.c:438
-#: plugins/sudoers/cvtsudoers_ldif.c:449 plugins/sudoers/cvtsudoers_ldif.c:456
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:481
-#: plugins/sudoers/cvtsudoers_ldif.c:489 plugins/sudoers/cvtsudoers_ldif.c:636
-#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
+#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
+#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
+#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
+#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
+#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
#: plugins/sudoers/cvtsudoers_merge.c:446
@@ -113,11 +127,11 @@ msgstr "Das hat nicht funktioniert, bitte nochmal probieren."
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1158
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -126,124 +140,125 @@ msgstr "Das hat nicht funktioniert, bitte nochmal probieren."
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
-#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
-#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
-#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
-#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
-#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
-#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
-#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
-#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
-#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
-#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
-#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
-#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
-#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
-#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
-#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
-#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
-#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
-#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
-#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
+#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "Es kann kein Speicher mehr alloziert werden"
-#: gram.y:622
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "Eine Prüfsumme erfordert einen Pfadnamen"
-#: gram.y:644
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "Werte für »CWD« müssen mit »/«, »~« oder »*« beginnen"
-#: gram.y:650
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr "»CWD« (aktuelles Arbeitsverzeichnis) Pfad ist zu lang"
-#: gram.y:660
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "Werte für »CHROOT« müssen mit »/«, »~« oder »*« beginnen"
-#: gram.y:666
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr "»CHROOT« Pfad ist zu lang"
-#: gram.y:801
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "Syntaxfehler, das reservierte Wort »%s« wird als Aliasname verwendet"
-#: gram.y:824
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "ungültiger Wert für »notbefore«"
-#: gram.y:833
+#: gram.y:834
msgid "invalid notafter value"
msgstr "ungültiger Wert für »notafter«"
-#: gram.y:843 plugins/sudoers/policy.c:376
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "Wert für Timeout ist zu groß"
-#: gram.y:845 plugins/sudoers/policy.c:378
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "ungültiger Wert für Timeout"
-#: gram.y:966 plugins/sudoers/sudoers.c:1014
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr "Der Befehl ist zu lang"
-#: gram.y:1220 plugins/sudoers/check_aliases.c:96
-#: plugins/sudoers/defaults.c:1275
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1270
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "Alias »%s« ist bereits definiert"
-#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
@@ -253,33 +268,48 @@ msgstr "Alias »%s« ist bereits definiert"
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
-#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
@@ -309,11 +339,11 @@ msgstr "Alias »%s« ist bereits definiert"
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1157
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -322,46 +352,47 @@ msgstr "Alias »%s« ist bereits definiert"
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
-#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
-#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
-#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
-#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
-#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
-#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
-#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
-#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
-#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
-#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
-#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
-#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
-#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
-#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
-#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
-#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
-#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
-#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
-#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
-#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -374,25 +405,25 @@ msgstr "Alias »%s« ist bereits definiert"
#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
-#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
-#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
-#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
-#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
-#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
-#: toke.l:1226
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
@@ -401,14 +432,14 @@ msgstr "%s: %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
-#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
-#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
@@ -451,7 +482,7 @@ msgstr "%8s : %s"
msgid "%8s : (command continued) %s"
msgstr "%8s : (Befehl fortgesetzt) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -566,14 +597,14 @@ msgstr "%s: Das Feld für die »runas«-Gruppe fehlt"
msgid "%s exists but is not a directory (0%o)"
msgstr "%s existiert, aber ist kein Verzeichnis (0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "Das Verzeichnis »%s« kann nicht erstellt werden"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
-#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "Ändern des Modus von %s auf 0%o gescheitert"
@@ -588,151 +619,157 @@ msgstr "Fehler beim Lesen der Zeitdateizeile: %s"
msgid "invalid timing file line: %s"
msgstr "Ungültige Zeitdateizeile: %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
-#: plugins/sudoers/policy.c:573
-msgid "unable to generate UUID"
-msgstr "UUID kann nicht generiert werden"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s: Protokollfehker: NULL-Schlüssel"
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr "%s: Protokollfehker: falscher Typ für %s"
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s: Protokollfehker: Wert NULL gefunden in %s"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "UUID kann nicht generiert werden"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr "%s: Protokollfehler: %s fehlt in der AcceptMessage"
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr "%s: Session-ID kann nicht formatiert werden"
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr "%s: %s ist nicht gesetzt"
# Kann die Escape-Sequenzen nicht auflösen?
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr "Kann den iolog-Pfad nicht erweitern: %s"
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr "Kann den iolog-Pfad »%s« nicht erstellen"
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr "Ungültiger I/O Dateideskriptor: %d"
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr "Fehler beim Schließen des I/O Dateideskriptors %d: %s"
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr "Fehler beim Leeren des I/O Dateideskriptors %d: %s"
-#: logsrvd/iolog_writer.c:780
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "Ungültiges I/O log %s: »%s« wird verwendet, ist aber nicht vorhanden"
-#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s; Der Wiederaufsetz-Punkt [%lld, %ld] kann nicht gefunden werden"
-#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
-#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
-#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
-#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr "Die Datei »%s« kann nicht geöffnet werden"
-#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "Die Datei »%s/%s« kann nicht geöffnet werden"
-#: logsrvd/iolog_writer.c:839
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "Fehler beim Kopieren von »%s/%s« nach »%s/%s«: %s"
-#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr "Die Datei »%s« kann nicht in »%s« umbenannt werden"
-#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s: Der Wiederaufsetz-Punkt [%lld, %ld] kann nicht gefunden werden"
-#: logsrvd/logsrv_util.c:154
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "Die I/O Logdatei %s/%s fehlt"
-#: logsrvd/logsrv_util.c:161
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: kann nicht zur Position %zu springen"
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr "Verbindung zum Relay kann nicht aufgebaut werden"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr "Server-Nachricht ist zu groß: %zu"
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
-#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
-#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
-#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
-#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
-#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
-#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
-#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
-#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
-#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
-#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
-#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -741,635 +778,660 @@ msgstr "Server-Nachricht ist zu groß: %zu"
msgid "unable to add event to queue"
msgstr "Event kann nicht zur Warteschlange hinzugefügt werden"
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr "Unerwarteter Status %d für %s"
# XXX geht das besser?
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "Fehler der State Machine"
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "ungültige AcceptMessage"
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "ungültige RejectMessage"
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "ungültige ExitMessage"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "ungültige RestartMessage"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "ungültige AlertMessage"
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr "%s: unerwarteter IoBuffer"
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "Protokollfehler"
-#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
-#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
-#: plugins/sudoers/log_client.c:1618
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "Ungültiger IoBuffer"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "ungültige ChangeWindowSize"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "ungültiges CommandSusped"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "Kann »%s« nicht auspacken, Größe %zu"
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "unerwarteter type_case Wert %d in »%s« aus »%s«"
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "unbekannter ClientMessage-Typ"
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr "Zeitablauf beim Senden zum Client %s"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr "Schreib-Puffer fehlt für Client %s"
-#: logsrvd/logsrvd.c:982
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr "Zeitablauf beim Lesen vom Client %s"
-#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "Dateiende (EOF) von %s ohne korrekten TLS-Abscluß"
-#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:716
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr "Client-Nachricht ist zu groß: %zu"
-#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "Client-Nachricht ist zu groß"
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "ungültige ClientMessage"
-#: logsrvd/logsrvd.c:1389
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "Kann die entfernte IP-Adresse nicht finden"
-#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
-#: plugins/sudoers/log_client.c:276
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "Kann die User-Daten nicht an das SSL-Objekt anhängen: %s"
-#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "Konnte keinen Socket zum »Lauschen« einrichten"
-#: logsrvd/logsrvd.c:1718
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr "unerwartete Signal %d"
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "sudo Log-Server"
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "Optionen:"
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "Pfad zur Konfigurationsdatei"
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "Hilfe anzeigen und beenden"
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "Nicht zum Hintergrundprozess werden, sondern im Vordergrund laufen"
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "Wahrscheinlichkeit in Prozent für Verbindungsabbruch"
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "Versionsinformation anzeigen und beenden"
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Protobuf-C Version 1.3 oder höher ist notwendig"
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "ungültiger Wert für »random drop«: %s"
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:180
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s Version %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
-#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
-#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "Unbekannter Benutzer %s"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
-#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr "Unbekannte Gruppe %s"
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr "Iolog mode %s kann nicht geparst werden"
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr "Ungültiger Wert für %s: %s"
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "TLS ist nicht unterstützt"
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s: ist kein voll qualifizierter Pfad"
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr "Unbekannte Syslog-Facility %s"
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr "Unbekannte Syslog-Priorität %s"
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s: %d »[« ohne schliessende Klammer »]«: %s"
# XXX Geht das besser?
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr "%s: %d unsinnige Zeichen nach »]«: %s"
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s/%d Ungültiger Konfigurations-Abschnitt: %s"
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s/%d Ungültige Konfigurationszeile: %s"
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d erwartetder Section Name: %s"
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] ungültiger Schlüssel: %s"
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:1035
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr "Die Protokolldatei kann nicht geöffnet werden %s"
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "Server-SSL-Kontext kann nicht initialisiert werden"
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "SSL-Kontext kann nicht initialisiert werden"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
-#: logsrvd/logsrvd_journal.c:416
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "Kann die Journal-Datei nicht anlegen"
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1020
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr "Die Datei »%s« kann nicht gesperrt werden"
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "Die Journal-Datei »%s« kann nicht gesperrt werden"
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr "Die Journal-Datei kann nicht geöffnet werden"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
-#: logsrvd/logsrvd_journal.c:452
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "In die Logdatei kann nicht geschrieben werden"
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "Die Journal-Datei kann nicht geöffnet werden"
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "unerwartetes Dateiende beim Lesen der Journal-Datei"
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "Fehler beim Lesen der Journal-Datei"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "Ungültige Journal-Datei - kann nicht neu starten"
-#: logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "Kann nicht zu [%lld, %ld] in der Journaldatei »%s« springen"
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "unerwarteter value_case Wert %d in »%s« aus »%s«"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "Fehler beim Parsen der AcceptMessage"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "Fehler beim Erstellen des Ein-/Ausgabe-Protokolls"
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "Fehler beim Protokolliereb des Accept-Events"
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "Fehler beim Parsen der RejectMessage"
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "Fehler beim Protokollieren des Reject-Events"
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr "Fehler beim Protokollieren des Exit-Events"
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "Das Log ist bereits abgeschlossen, kann nicht neu gestartet werden"
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "Das Log konnte nicht wieder begonnen werden"
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "Fehler beim Parsen der AlertMessage"
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "Fehler beim Protokollieren des Alert-Events"
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr "Der Zeitstempel kann nicht formatiert werden, Länge %d"
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr "%s/%s: %s"
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr "Zufällig die Verbindung beenden"
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "Fehler beim Schreiben des IoBuffer"
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "Fehler beim Schreiben der ChangeWindowSize"
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "Fehler beim Schreiben des CommandSusped"
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "TLS-Handshake mit dem Relay-Host fehlgeschlagen"
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "Verbindung zum Relay-Host kann nicht aufgebaut werden"
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s: ungültiges ServerHello, fehlende server_id"
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1504
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "ungültiges ServerHello"
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "unbekannter ServerMessage-Typ"
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr "Zeitablauf beim Lesen vom Relay-Server »%s« (%s)"
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "Zeitablauf beim Lesen vom Relay-Server"
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "Der Name des Relay-Hosts passt nicht zum Zertifikat"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
-#: logsrvd/logsrvd_relay.c:784
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "Fehler beim Lesen vom Relay-Host"
-#: logsrvd/logsrvd_relay.c:805
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "Vom Relay-Server kann nicht gelesen werden"
-#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "Der Relay-Server hat die Verbindung geschlossen"
-#: logsrvd/logsrvd_relay.c:838
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "Server-Nachricht ist zu groß"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "Zeitablauf beim Senden an den Relay-Server »%s« (%s)"
-#: logsrvd/logsrvd_relay.c:904
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "Zeitablauf beim Senden an den Relay-Server"
-#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
-#: logsrvd/logsrvd_relay.c:974
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "Fehler beim Schreiben des zum Relay-Server"
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "sende sudo I/O-Log zu einem entfernten Server"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "Nur einen Accept-Event senden (kein I/O)"
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "Zertifikatsbündel-Datei zur Verifikation des Server-Zertifikats"
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "Zertifikatsdatei für TLS-Handshake"
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "Rechner an den die Logs gesendet werden"
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "Entfernte ID des I/O-Logs zum Wiederaufnehmen"
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "Private Schlüsseldatei"
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "Serverzertifikat nicht überprüfen"
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "Portnummer für die Verbindung zum Host"
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "Restarte die vorhergehende I/O-Log Ãœbertragung"
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "Weise das Kommando mit dem angegebenen Grund zurück"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr "Beende den Transfer nach Erreichen dieser Zeit"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "Teste den Audit-Server durch senden ausgewählter I/O-Logs n-Mal parallel"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "Fehler beim Lookup %s:%s: %s"
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "Kann die Server IP-Adresse nicht finden"
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "Fehler beim Lesen %s/%s: %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
-#: plugins/sudoers/iolog.c:1024
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "unerwarteter I/O Event %d"
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
-#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: unerwarteter Status %d"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "Fehler beim Empfangen der Nachricht vom Server: %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "Abbruch-Nachricht vom Server empfangen: %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: unerwarteter type_case Wert %d"
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "Zeitablauf beim Lesen vom Server"
-#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
msgid "host name does not match certificate"
msgstr "Der Hostname passt nicht zum Zertifikat"
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "unerwartetes Datei-Ende"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "Server-Nachricht ist zu groß: %u"
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "Zeitablauf beim Senden an den Server"
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "Sowohl Restart-Punkt als auch die I/O-Log ID sind notwendig"
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "Ein Restart-Punkt kann nicht angegeben werden, wenn keine Ein/Ausgabe gesendet ist."
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "Vorzeitig beendet mit Status %d"
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "Abgelaufene Zeit zum Server gesendet [%lld, %ld]"
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "Commit Punkt vom Server empfangen [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "Timeout beim TLS-Handshake erreicht"
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "Konnte den Event nicht setzen"
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "TLS-Kommunikation fehlgeschlagen: %s"
-#: logsrvd/tls_client.c:191
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "Kann kein SSL-Objekt anlegen: %s"
-#: logsrvd/tls_client.c:205
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "Kann den Socket nicht an das SSL-Objekt anhängen: %s"
-#: logsrvd/tls_client.c:233
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr "SSL-Kontext kann nicht initialisiert werden"
-#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "Die TLS 1.2 Cyphersuite kann nicht auf »%s« gesetzt werden: %s"
-#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "Die TLS 1.3 Cyphersuite kann nicht auf »%s« gesetzt werden: %s"
-#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "Kann die Diffie-Hellman Parameter nicht setzen: %s"
-#: logsrvd/tls_init.c:277
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr "SSL-Kontext kann nicht erzeugt werden: %s"
-#: logsrvd/tls_init.c:284
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "Kann die minimale Protokollversion nicht auf TLS 1.2 setzen: %s"
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
-#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
-#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
-#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
-#: plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "Die aktuelle Zeit kann nicht ausgelesen werden"
@@ -1507,7 +1569,7 @@ msgstr "Das Konto ist abgelaufen oder in der PAM-Konfiguration fehlt der »accou
msgid "PAM account management error: %s"
msgstr "Fehler beim PAM-Account-Management: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "Der Benutzer existiert in der %s-Datenbank nicht"
@@ -1580,17 +1642,17 @@ msgstr "Der Audit-Zustand kann nicht bestimmt werden"
msgid "unable to commit audit record"
msgstr "Audit-Satz kann nicht auf Platte geschrieben werden"
-#: plugins/sudoers/check.c:275
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "Fehler beim Lesen der Belehrungsdatei %s"
-#: plugins/sudoers/check.c:278
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "Ignoriere Belehrungsdatei %s: es ist keine reguläre Datei"
-#: plugins/sudoers/check.c:291
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1610,14 +1672,14 @@ msgstr ""
" #3) Mit großer Macht kommt große Verantwortung.\n"
"\n"
-#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
-#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "Unbekannte Benutzer-ID %u"
-#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
msgid "%s: %s\n"
msgstr "%s: %s\n"
@@ -1647,7 +1709,7 @@ msgstr "Start der Folge: %s: %s"
msgid "order padding: %s: %s"
msgstr "Auffüllen der Folge: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "%s-Grammatik Version %d\n"
@@ -1667,14 +1729,14 @@ msgstr "Nicht unterstütztes Ausgabeformat %s"
msgid "%s: input and output files must be different"
msgstr "%s: Eingabe- und Ausgabedatei müssen unterschiedlich sein"
-#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:165
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
-#: plugins/sudoers/visudo.c:969
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "Standardwerte für sudoers können nicht initialisiert werden"
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s: %s: %s: %s"
@@ -1699,18 +1761,18 @@ msgstr "ungültiger suppression Typ: %s"
msgid "invalid filter: %s"
msgstr "Ungültiger Filter: %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, c-format
msgid "failed to parse %s file, unknown error"
msgstr "Analyse der Datei %s gescheitert, unbekannter Fehler"
#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "In die Datei »%s« kann nicht geschrieben werden"
-#: plugins/sudoers/cvtsudoers.c:1501
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1719,7 +1781,7 @@ msgstr ""
"%s – zwischen sudoers Dateiformaten konvertieren\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1503
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -2174,361 +2236,385 @@ msgid "Log user's input for the command being run"
msgstr "Benutzereingaben für den ausgeführten Befehl protokollieren"
#: plugins/sudoers/def_data.c:356
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "Standardeingabe des Kommandos protokollieren, wenn kein Terminal angebunden ist"
+
+#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "Benutzereingaben am Terminal für den ausgeführten Befehl protokollieren"
+
+#: plugins/sudoers/def_data.c:364
msgid "Log the output of the command being run"
msgstr "Die Ausgabe des ausgeführten Befehls protokollieren"
-#: plugins/sudoers/def_data.c:360
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "Standardausgabe des Kommandos protokollieren, wenn kein Terminal angebunden ist"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "Standarderror des Kommandos protokollieren, wenn kein Terminal angebunden ist<"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "Die Terminalausgabe des ausgeführten Befehls protokollieren"
+
+#: plugins/sudoers/def_data.c:380
msgid "Compress I/O logs using zlib"
msgstr "Ein-/Ausgabe-Protokolle mittels zlib protokollieren"
-#: plugins/sudoers/def_data.c:364
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "Befehle immer in einem Pseudo-TTY ausführen"
-#: plugins/sudoers/def_data.c:368
+#: plugins/sudoers/def_data.c:388
#, 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:372
+#: plugins/sudoers/def_data.c:392
#, 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:376
+#: plugins/sudoers/def_data.c:396
#, 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:380
+#: plugins/sudoers/def_data.c:400
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:384
+#: plugins/sudoers/def_data.c:404
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:388
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "Menge der erlaubten Privilegien: %s"
# XXX einschränkenden?
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "Menge der eingeschränkten Privilegien: %s"
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr "Befehle mit einem Pseudo-TTY im Hintergrund starten"
-#: plugins/sudoers/def_data.c:400
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "Verwendeter PAM-Service-Name: %s"
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:424
#, c-format
msgid "PAM service name to use for login shells: %s"
msgstr "PAM-Service-Name für Anmelde-Shells: %s"
-#: plugins/sudoers/def_data.c:408
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "PAM-Service-Name für sudo-Aufruf mit der Option »-A«: %s"
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:432
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:416
+#: plugins/sudoers/def_data.c:436
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:420
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "Ausführen vom PAM-Account-Management"
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "Maximale Sequenznummer des Ein-/Ausgabe-Protokolls: %s"
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "Unterstützung für netgroups in sudoers aktivieren"
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:452
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:436
+#: plugins/sudoers/def_data.c:456
msgid "Follow symbolic links when editing files with sudoedit"
msgstr "Folge symbolischen Links beim Editieren von Dateien mit sudoedit"
-#: plugins/sudoers/def_data.c:440
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr "Frage das Group-Plugin nach unbekannten System-Gruppen"
-#: plugins/sudoers/def_data.c:444
+#: plugins/sudoers/def_data.c:464
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:448
+#: plugins/sudoers/def_data.c:468
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:452
+#: plugins/sudoers/def_data.c:472
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:456
+#: plugins/sudoers/def_data.c:476
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:460
+#: plugins/sudoers/def_data.c:480
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:464
+#: plugins/sudoers/def_data.c:484
#, 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:468
+#: plugins/sudoers/def_data.c:488
#, 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:472
+#: plugins/sudoers/def_data.c:492
#, 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:476
+#: plugins/sudoers/def_data.c:496
#, 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:480
+#: plugins/sudoers/def_data.c:500
#, 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:484
+#: plugins/sudoers/def_data.c:504
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:488
+#: plugins/sudoers/def_data.c:508
#, 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:492
+#: plugins/sudoers/def_data.c:512
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:496
+#: plugins/sudoers/def_data.c:516
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:500
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr "Protokolliere auch die Prozess-ID beim Schreiben ins Systemlog"
-#: plugins/sudoers/def_data.c:504
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "Typ des Authentifizierungszeitstempelprotokolls: %s"
-#: plugins/sudoers/def_data.c:508
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "Fehler bei der Authentifizierung: %s"
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "Ignoriere Groß-/Kleinschreibung beim Matchen von Benutzernamen"
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "Ignoriere Groß-/Kleinschreibung beim Matchen von Gruppennamen"
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr "Protokolliere von sudo erlaubte Kommandos"
-#: plugins/sudoers/def_data.c:524
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "Protokolliere von sudo verweigerte Kommandos"
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "Sudo Log Server mit optionalem Port für die Verbindung"
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Sudo Log-Server Timeout in Secunden: %u"
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "Verwende die SO_KEEPALIVE Socket Option für die Verbindung zum Logserver"
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "Pfad zur Zertifikats-Bündel-Datei des Audit Servers: %s"
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "Pfad zur sudoers Zertifikats-Datei: %s"
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "Pfad zur sudoers Datei mit dem privaten Schlüssel: %s"
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "Prüfe das Log-Server-Zertifikat auf Gültigkeit"
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "Erlaube die Verwendung eines unbekannten »runas« Benutzers oder Gruppen-ID"
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "Nur die Ausführung von Kommandos erlauben für Benutzer mit einer gültigen Shell"
-#: plugins/sudoers/def_data.c:564
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "Setze den PAM remote Benutzer auf den Benutzer, der sudo ausführt"
-#: plugins/sudoers/def_data.c:568
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "Setze den PAM remote Rechner auf den lokalen Hostname"
-#: plugins/sudoers/def_data.c:572
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "Arbeitsverzeichnis um vor Ausführung des Kommandos dorthin zu wechseln: %s"
-#: plugins/sudoers/def_data.c:576
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "Root-Verzeichnis zur Verwendung, bevor ein Befehl ausgeführt wird: %s"
-#: plugins/sudoers/def_data.c:580
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "Das Format der zu schreibenden Logs: %s"
-#: plugins/sudoers/def_data.c:584
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "Schalte SELinux RBAC Support ein"
-#: plugins/sudoers/def_data.c:588
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "Pfad zur Datei die beim ersten sudo-Lauf erzeugt wird: %s"
-#: plugins/sudoers/def_data.c:592
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "Weitere Kommando abfangen und sudoers Restriktionen auf sie anwenden"
-#: plugins/sudoers/def_data.c:596
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr "Protokolliere von diesem Kommando gestartete Kind-Prozesse"
-#: plugins/sudoers/def_data.c:600
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr "Den Exitcode des ausgeführten Befehls protokollieren"
# XXX Check!
-#: plugins/sudoers/def_data.c:604
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "Folgende Kommando in einer nachverfolgten Sitzung müssen authentifiziert werden"
-#: plugins/sudoers/def_data.c:608
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "Erlaube einem abgefangenen Kommando die Ausführung von setuid oder setgid Programmen"
-#: plugins/sudoers/def_data.c:612
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "Die maximale Größe zu der der Adressbereich des Prozesse wachsen kann (in Bytes): %s"
-#: plugins/sudoers/def_data.c:616
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "Die maximale Größe eines erzeugten Core Dumps (in Bytes): %s"
-#: plugins/sudoers/def_data.c:620
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "Die maximale CPU Zeit die vom Prozess genutzt werden kann (in Sekunden): %s"
-#: plugins/sudoers/def_data.c:624
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "Die maximale Größe des Data Segments für den Prozess (in Bytes): %s"
-#: plugins/sudoers/def_data.c:628
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "Die maximale Dateigröße für den Prozess (in Bytes): %s"
-#: plugins/sudoers/def_data.c:632
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "Die maximale Anzahl von Sperren des Prozesses: %s"
-#: plugins/sudoers/def_data.c:636
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "Die maximale gesperrte Speichergröße des Prozesses (in Bytes): %s"
-#: plugins/sudoers/def_data.c:640
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "Die maximale Anzahl offener Dateien des Prozesses: %s"
-#: plugins/sudoers/def_data.c:644
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "Die maximale Anzahl von gleichzeitige laufenden Prozessen des Benutzers: %s"
-#: plugins/sudoers/def_data.c:648
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "Die maximle Größe des residenten Speichers vom Prozess (in Bytes): %s"
-#: plugins/sudoers/def_data.c:652
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "Die maximale Größe des Prozess-Stacks (in Bytes): %s"
-#: plugins/sudoers/def_data.c:656
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr "Authentifzierung auch im nicht-interaktiven Modus versuchen"
-#: plugins/sudoers/def_data.c:660
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr "Klartext-Passwörter im Ein-Ausgabe-Log als Eingabe protokollieren"
-#: plugins/sudoers/def_data.c:664
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr "Liste von regulären Ausdrücken zum Matchen des Passwort-Prompts"
-#: plugins/sudoers/def_data.c:668
+#: plugins/sudoers/def_data.c:688
#, c-format
msgid "The mechanism used by the intercept and log_subcmds options: %s"
msgstr "Der Mechanismus für »intercept« und »log_subcmds« Optionen: %s"
-#: plugins/sudoers/def_data.c:672
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "Versuche das Kommando und die Argumente nach der Ausführung zu verifizieren"
+
+#: plugins/sudoers/def_data.c:696
#, c-format
msgid "AppArmor profile to use in the new security context: %s"
msgstr "Im neuen Security-Kontext von AppArmor wird diese Rolle verwendet: %s"
@@ -2563,31 +2649,31 @@ msgstr "Ungültiger »Defaults« Typ 0x%x für Option »%s«"
msgid "value \"%s\" is invalid for option \"%s\""
msgstr "Der Wert »%s« ist für die Option »%s« ungültig"
-#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
-#: plugins/sudoers/policy.c:216
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
msgid "path name for \"%s\" too long"
msgstr "Pfadname für »%s« ist zu lang"
-#: plugins/sudoers/defaults.c:1133
+#: plugins/sudoers/defaults.c:1134
#, c-format
msgid "values for \"%s\" must start with a '/', '~', or '*'"
msgstr "Werte für »%s« müssen mit »/«, »~« oder »*« beginnen"
-#: plugins/sudoers/defaults.c:1140
+#: plugins/sudoers/defaults.c:1141
#, c-format
msgid "values for \"%s\" must start with a '/'"
msgstr "Werte für »%s« müssen mit einem »/« beginnen"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv: envp ist beschädigt, die Längen passen nicht"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "Das Environment kann nicht neu erstellt werden"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, 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"
@@ -2602,27 +2688,27 @@ msgstr "Prüfsummentyp %d wird für %s nicht unterstützt"
msgid "%s: read error"
msgstr "%s: Fehler beim Lesen"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s muss der uid %d gehören"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, 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:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "Laden von %s fehlgeschlagen: %s"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, 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:107
+#: plugins/sudoers/group_plugin.c:202
#, 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"
@@ -2645,10 +2731,10 @@ msgstr "Lokale IP-Adresse und Netzmaske:\n"
msgid "unable to update sequence file"
msgstr "Kann die Sequenz-Datei nicht aktualisieren"
-#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
-#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
-#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
-#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "In die I/O Logdatei kann nicht geschrieben werden: %s"
@@ -2658,25 +2744,25 @@ msgstr "In die I/O Logdatei kann nicht geschrieben werden: %s"
msgid "unable to create %s/%s"
msgstr "Die Datei %s%s kann nicht erstellt werden"
-#: plugins/sudoers/iolog.c:955
+#: plugins/sudoers/iolog.c:957
#, 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:1054 plugins/sudoers/iolog.c:1182
-#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
-#: plugins/sudoers/visudo.c:552
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "Die Uhrzeit kann nicht ausgelesen werden"
-#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
-#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: Interner Fehler, ungültiges Signal %d"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "starttls wird für ldaps nicht unterstützt"
@@ -2699,7 +2785,7 @@ msgstr "LDAP kann nicht initialisiert werden: %s"
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:1886 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "Ungültiges »sudoOrder« Attribut: %s"
@@ -2709,12 +2795,12 @@ msgstr "Ungültiges »sudoOrder« Attribut: %s"
msgid "%s: port too large"
msgstr "%s: Portnummer ist zu groß"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "LDAP-Adresstyp wird nicht unterstützt: %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "ldap- und ldaps-Adressen können nicht zusammen verwendet werden"
@@ -2739,113 +2825,113 @@ msgstr "Das Audit-System kann nicht geöffnet werden"
msgid "unable to send audit message"
msgstr "Die Audit-Nachricht kann nicht gesendet werden"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
-#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "Fehler in der Event-Schleife"
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "Erzeugen eines neuen SSL_CTX Objektes fehlgeschlagen: %s"
-#: plugins/sudoers/log_client.c:225
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "Kann das CA-Bundle »%s« nicht laden"
-#: plugins/sudoers/log_client.c:247
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "Laden von Zertifikat »%s« fehlgeschlagen"
-#: plugins/sudoers/log_client.c:261
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "Laden des privaten Schlüssels »%s« fehlgeschlagen"
-#: plugins/sudoers/log_client.c:270
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "Kann kein SSL-Objekt anlegen: %s"
-#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "TLS Verbindung zu %s:%s fehlgeschlagen: %s"
-#: plugins/sudoers/log_client.c:538
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "TLS Initialisierung war nicht erfolgreich"
-#: plugins/sudoers/log_client.c:548
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "TLS Handshake war nicht erfolgreich"
-#: plugins/sudoers/log_client.c:1246
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: Interner Fehler, ungültiger Exit-Status %d"
-#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "Verbindung zum Logserver verloren"
-#: plugins/sudoers/log_client.c:1876
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "Schreib-Puffer fehlt"
-#: plugins/sudoers/log_client.c:2024
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "Verbindung zum Logserver kann nicht aufgebaut werden"
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "Der Benutzer ist NICHT in der sudoers-Datei enthalten"
-#: plugins/sudoers/logging.c:300
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "Der Benutzer ist NICHT auf dem Rechner autorisiert"
-#: plugins/sudoers/logging.c:302
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "Der Befehl ist nicht erlaubt"
-#: plugins/sudoers/logging.c:323
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr ""
"»%s« ist nicht in der sudoers-Datei.\n"
"\n"
-#: plugins/sudoers/logging.c:326
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "»%s« darf sudo auf dem Rechner »%s« nicht ausführen.\n"
-#: plugins/sudoers/logging.c:329
+#: plugins/sudoers/logging.c:321
#, 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:332
+#: plugins/sudoers/logging.c:324
#, 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/logging.c:334
msgid "This incident has been reported to the administrator.\n"
msgstr "Dieser Vorfall wurde an den Administrator gemeldet.\n"
-#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
-#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
-#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
-#: plugins/sudoers/sudoers.c:801
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s: Befehl nicht gefunden"
-#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2854,31 +2940,31 @@ 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:395
+#: plugins/sudoers/logging.c:387
#, 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:485
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "Fehler bei der Authentifizierung"
-#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "Ein Passwort ist notwendig"
-#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
msgid "problem parsing sudoers"
msgstr "Problem beim Auswerten der sudoers-Datei"
-#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
msgid "%s:%d:%d: %s"
msgstr "%s:%d:%d: %s"
-#: plugins/sudoers/logging.c:1068
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "In die Logdatei kann nicht geschrieben werden: %s"
@@ -2893,7 +2979,7 @@ msgstr "Prüfsumme für %s (%s) ungültige Länge %zu, %zu erwartet"
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/parse.c:585
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2902,7 +2988,7 @@ msgstr ""
"\n"
"LDAP-Rolle: %s\n"
-#: plugins/sudoers/parse.c:588
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2910,110 +2996,110 @@ msgstr ""
"\n"
"Sudoers-Eintrag:\n"
-#: plugins/sudoers/parse.c:590
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " RunAsUsers: "
-#: plugins/sudoers/parse.c:605
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " RunAsGroups: "
-#: plugins/sudoers/parse.c:615
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " Optionen: "
-#: plugins/sudoers/parse.c:679
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " Befehle:\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:876
#, 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:888
+#: plugins/sudoers/parse.c:894
#, c-format
msgid "Runas and Command-specific defaults for %s:\n"
msgstr "Runas und befehlsspezifische Standardwerte für %s:\n"
-#: plugins/sudoers/parse.c:906
+#: plugins/sudoers/parse.c:912
#, 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:921
+#: plugins/sudoers/parse.c:927
#, 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:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "ignoriere die unvollständige sudoRole: cn: %s"
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "Ungültiges LDIF-Attribut: %s"
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr "ungültige Option »%.*s« durch das sudo-Frontend angegeben"
-#: plugins/sudoers/policy.c:351 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "Die Netzwerkadressliste kann nicht eingelesen werden"
-#: plugins/sudoers/policy.c:508
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr "Benutzername nicht durch das sudo-Frontend angegeben"
-#: plugins/sudoers/policy.c:512
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr "User-ID nicht durch das sudo-Frontend angegeben"
-#: plugins/sudoers/policy.c:516
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr "Gruppen-ID nicht durch das sudo-Frontend angegeben"
-#: plugins/sudoers/policy.c:520
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr "Hostname nicht durch das sudo-Frontend angegeben"
-#: plugins/sudoers/policy.c:706
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "Ungültiges Arbeitsverzeichnis: %s"
-#: plugins/sudoers/policy.c:886
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "Ungültiges »chroot« Verzeichnis: %s"
-#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "%s kann nicht ausgeführt werden"
-#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
-#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: ungültige Mode-Flags vom sudo-Frontend: 0x%x"
-#: plugins/sudoers/policy.c:1262
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "Sudoers-Policy-Plugin Version %s\n"
-#: plugins/sudoers/policy.c:1264
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "Sudoers-Datei-Grammatik-Version %d\n"
-#: plugins/sudoers/policy.c:1268
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -3022,27 +3108,27 @@ msgstr ""
"\n"
"Sudoers-Pfad: %s\n"
-#: plugins/sudoers/policy.c:1271
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "nsswitch-Pfad: %s\n"
-#: plugins/sudoers/policy.c:1273
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "ldap.conf-Pfad: %s\n"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "ldap.secret-Pfad: %s\n"
-#: plugins/sudoers/policy.c:1307
+#: plugins/sudoers/policy.c:1337
#, 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/policy.c:1325
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "Der Hook vom Typ %d kann nicht deregistriert werden (Version %d.%d)"
@@ -3181,148 +3267,142 @@ msgstr "Die SSS-Quelle kann nicht initialisiert werden. Ist SSSD auf dem Rechner
msgid "unable to find symbol \"%s\" in %s"
msgstr "Das Symbol »%s« kann in %s nicht gefunden werden"
-#: plugins/sudoers/sudoers.c:258
+#: plugins/sudoers/sudoers.c:263
#, c-format
msgid "unable to get defaults from %s"
msgstr "Kann die Defaults von »%s« nicht bekommen"
-#: plugins/sudoers/sudoers.c:265
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr "Keine gültige sudoers-Quelle gefunden, Programmende"
-#: plugins/sudoers/sudoers.c:341
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "Der Benutzer darf das root-Verzeichnis nicht auf »%s« ändern"
-#: plugins/sudoers/sudoers.c:343
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "Sie dürfen die Option -R nicht mit dem Kommando »%s« verwenden"
-#: plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "Der Benutzer darf das Verzeichnis nicht auf %s ändern"
-#: plugins/sudoers/sudoers.c:369
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "Sie dürfen die Option -C nicht mit dem Kommando »%s« verwenden"
-#: plugins/sudoers/sudoers.c:396
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "Kein Kommando angegeben"
-#: plugins/sudoers/sudoers.c:421
+#: plugins/sudoers/sudoers.c:426
msgid "sudoers specifies that root is not allowed to sudo"
msgstr "sudoers gibt an, dass root sudo nicht verwenden darf"
-#: plugins/sudoers/sudoers.c:471
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "Der Benutzer darf das »closefrom«-Limit nicht überschreiben"
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "Sie dürfen die Option -C nicht verwenden"
-#: plugins/sudoers/sudoers.c:532
+#: plugins/sudoers/sudoers.c:537
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr "Zeitstempelbesitzer (%s): Benutzer existiert nicht"
-#: plugins/sudoers/sudoers.c:547
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "Kein tty"
-#: plugins/sudoers/sudoers.c:548
+#: plugins/sudoers/sudoers.c:553
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:555
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "Ungültiger Shell für den Benutzer %s: %s"
-#: plugins/sudoers/sudoers.c:638
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "Befehl ist im aktuellen Verzeichnis"
-#: plugins/sudoers/sudoers.c:653
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "»cd\"« ist ein Shell-internes Kommando, das nicht direkt gestartet werden kann."
-#: plugins/sudoers/sudoers.c:655
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr "Die Option »-s« kann zum Start einer privilegierten Shell verwendet werden."
-#: plugins/sudoers/sudoers.c:657
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr "Die Option »-D« kann zum Start des Programms im angegebenen Verzeichnis verwendet werden."
-#: plugins/sudoers/sudoers.c:666
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "Der Benutzer darf keinen Kommand-Timeout angeben"
-#: plugins/sudoers/sudoers.c:668
+#: plugins/sudoers/sudoers.c:673
msgid "sorry, you are not allowed set a command timeout"
msgstr "Sie dürfen keinen Timeout angeben"
-#: plugins/sudoers/sudoers.c:676
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "Der Benutzer darf das Environment nicht erhalten"
-#: plugins/sudoers/sudoers.c:678
+#: plugins/sudoers/sudoers.c:683
msgid "sorry, you are not allowed to preserve the environment"
msgstr "Sie dürfen das Environment nicht erhalten"
-#: plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "»sudoedit« muss nicht mittels »sudo« aufgerufen werden"
-#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "Die Datei »%s« kann nicht gelesen werden"
-#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
-#: plugins/sudoers/visudo.c:764
-#, c-format
-msgid "unable to stat %s"
-msgstr "stat konnte nicht auf %s angewendet werden"
-
-#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%s ist keine reguläre Datei"
-#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, 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:1147 toke.l:1252
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "%s ist für alle beschreibbar (world writable)"
-#: plugins/sudoers/sudoers.c:1151 toke.l:1255
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, 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:1184
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "Nur root kann »-c %s« verwenden"
-#: plugins/sudoers/sudoers.c:1203
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr "Unbekannte Anmeldeklasse »%s«"
-#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "Hostname %s kann nicht aufgelöst werden"
@@ -3422,17 +3502,17 @@ msgstr "Ungültiges nachgestelltes »!«"
msgid "unknown search type %d"
msgstr "Unbekannter Suchtyp %d"
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, 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:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, 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:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -3441,7 +3521,7 @@ msgstr ""
"%s – sudo-Sitzungsprotokolle abspielen\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3502,127 +3582,122 @@ msgstr ""
"\n"
"Befehl nicht erkannt"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%s ist für die Gruppe beschreibbar"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, 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:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "Zeitstempel aus der Zukunft wird ignoriert"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, 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:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "Die Zeitstempeldatei »%s« kann nicht gesperrt werden"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, c-format
-msgid "lecture status path too long: %s/%s"
-msgstr "Pfad zur Belehrung ist zu lang: %s/%s"
-
#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "»sudoedit« sollte nicht mit einem Pfad angegeben werden"
-#: plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:254
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:251
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "Bitte verwenden Sie stattdessen das Programm »cvtsudoers«"
-#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "Drücken Sie die Eingabetaste, um %s zu bearbeiten: "
-#: plugins/sudoers/visudo.c:321
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr "Inhalt der Editor-Sitzung bleibt in »%s« erhalten"
-#: plugins/sudoers/visudo.c:397
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "Der angegebene Editor (%s) ist nicht vorhanden"
-#: plugins/sudoers/visudo.c:399
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "Kein Editor gefunden (Pfad zum Editor = %s)"
-#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "stat konnte nicht auf %s angewendet werden"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "Schreibfehler"
-#: plugins/sudoers/visudo.c:559
+#: plugins/sudoers/visudo.c:565
#, 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:566
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr "Leere temporäre Datei (%s), %s ist unverändert"
-#: plugins/sudoers/visudo.c:572
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "Editor-Aufruf (%s) ist gescheitert, %s ist unverändert"
-#: plugins/sudoers/visudo.c:594
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s unverändert"
-#: plugins/sudoers/visudo.c:639
+#: plugins/sudoers/visudo.c:645
#, 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:652
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "Analyse der temporären Datei (%s) gescheitert, unbekannter Fehler"
-#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, 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:803
+#: plugins/sudoers/visudo.c:809
#, 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:814
+#: plugins/sudoers/visudo.c:820
#, c-format
msgid "command failed: '%s %s %s', %s unchanged"
msgstr "Befehl gescheitert: »%s %s %s«, %s unverändert"
-#: plugins/sudoers/visudo.c:821
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "Fehler beim Umbenennen von %s, %s unverändert"
-#: plugins/sudoers/visudo.c:841
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "Was jetzt? "
-#: plugins/sudoers/visudo.c:855
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3634,42 +3709,42 @@ msgstr ""
" 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:901
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "%s konnte nicht ausgeführt werden"
-#: plugins/sudoers/visudo.c:932
+#: plugins/sudoers/visudo.c:938
#, 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:943
+#: plugins/sudoers/visudo.c:949
#, 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:991 plugins/sudoers/visudo.c:998
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: Analyse OK\n"
-#: plugins/sudoers/visudo.c:1017
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%s ist in Verwendung, versuchen Sie es später erneut"
# XXX
-#: plugins/sudoers/visudo.c:1021
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "Trotzdem ändern? [y/N]"
-#: plugins/sudoers/visudo.c:1117
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "Warnung: %s:%d:%d: nicht verwendet: %s »%s«"
-#: plugins/sudoers/visudo.c:1229
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3678,25 +3753,27 @@ msgstr ""
"%s – Die sudoers-Datei sicher bearbeiten\n"
"\n"
-#: plugins/sudoers/visudo.c:1231
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\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"
+" -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"
+" -I, --no-includes Include-Dateien nicht editieren\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:189
msgid "empty string"
diff --git a/plugins/sudoers/po/fr.mo b/plugins/sudoers/po/fr.mo
index b135c7e1d..1c345360a 100644
--- a/plugins/sudoers/po/fr.mo
+++ b/plugins/sudoers/po/fr.mo
Binary files differ
diff --git a/plugins/sudoers/po/fr.po b/plugins/sudoers/po/fr.po
index 798bf040d..d6e29d090 100644
--- a/plugins/sudoers/po/fr.po
+++ b/plugins/sudoers/po/fr.po
@@ -5,10 +5,10 @@
# Frédéric Marchal <fmarchal@perso.be>, 2022
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.11b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 12:13+0200\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-12 14:05+0200\n"
"Last-Translator: Frédéric Marchal <fmarchal@perso.be>\n"
"Language-Team: French <traduc@traduc.org>\n"
"Language: fr\n"
@@ -18,7 +18,7 @@ msgstr ""
"X-Bugs: Report translation errors to the Language-Team address.\n"
"Plural-Forms: nplurals=2; plural=(n >= 2);\n"
-#: confstr.sh:1 gram.y:1218
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "erreur de syntaxe"
@@ -42,13 +42,13 @@ msgstr "*** Informations de sécurité pour %h ***"
msgid "Sorry, try again."
msgstr "Désolé, essayez de nouveau."
-#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341
-#: gram.y:365 gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427
-#: gram.y:501 gram.y:511 gram.y:523 gram.y:571 gram.y:580 gram.y:589
-#: gram.y:598 gram.y:730 gram.y:738 gram.y:749 gram.y:761 gram.y:780
-#: gram.y:943 gram.y:948 gram.y:956 gram.y:970 gram.y:976 gram.y:1098
-#: gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133 gram.y:1162 gram.y:1171
-#: gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769 gram.y:1816
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
@@ -58,50 +58,64 @@ msgstr "Désolé, essayez de nouveau."
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
-#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:168 plugins/sudoers/cvtsudoers.c:131
-#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
-#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
-#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
-#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:862
-#: plugins/sudoers/cvtsudoers.c:870 plugins/sudoers/cvtsudoers.c:1365
-#: plugins/sudoers/cvtsudoers.c:1369 plugins/sudoers/cvtsudoers.c:1471
-#: plugins/sudoers/cvtsudoers_csv.c:183 plugins/sudoers/cvtsudoers_csv.c:246
-#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
-#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
-#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:376
-#: plugins/sudoers/cvtsudoers_ldif.c:430 plugins/sudoers/cvtsudoers_ldif.c:438
-#: plugins/sudoers/cvtsudoers_ldif.c:449 plugins/sudoers/cvtsudoers_ldif.c:456
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:481
-#: plugins/sudoers/cvtsudoers_ldif.c:489 plugins/sudoers/cvtsudoers_ldif.c:636
-#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
+#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
+#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
+#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
+#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
+#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
#: plugins/sudoers/cvtsudoers_merge.c:446
@@ -111,11 +125,11 @@ msgstr "Désolé, essayez de nouveau."
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1158
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -124,124 +138,125 @@ msgstr "Désolé, essayez de nouveau."
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
-#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
-#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
-#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
-#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
-#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
-#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
-#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
-#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
-#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
-#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
-#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
-#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
-#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
-#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
-#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
-#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
-#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
-#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
-#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
+#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "impossible d'allouer la mémoire"
-#: gram.y:622
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "un résumé (digest) nécessite un chemin d'accès"
-#: gram.y:644
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "les valeurs de « CWD » doivent commencer par « / », « ~ » ou « * »"
-#: gram.y:650
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr "chemin trop long pour « CWD »"
-#: gram.y:660
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "les valeurs de « CHROOT » doivent commencer par « / », « ~ » ou « * »"
-#: gram.y:666
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr "chemin trop long pour « CHROOT »"
-#: gram.y:801
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "erreur de syntaxe, le mot réservé %s est utilisé comme un nom de synonyme"
-#: gram.y:824
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "valeur « notbefore » (pas avant) invalide"
-#: gram.y:833
+#: gram.y:834
msgid "invalid notafter value"
msgstr "valeur « notafter » (pas après) invalide"
-#: gram.y:843 plugins/sudoers/policy.c:376
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "valeur trop grande pour le délai d'expiration"
-#: gram.y:845 plugins/sudoers/policy.c:378
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "valeur invalide pour le délai d'expiration"
-#: gram.y:966 plugins/sudoers/sudoers.c:1014
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr "commande trop longue"
-#: gram.y:1220 plugins/sudoers/check_aliases.c:96
-#: plugins/sudoers/defaults.c:1275
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1270
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "L'alias « %s » est déjà défini"
-#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
@@ -251,33 +266,48 @@ msgstr "L'alias « %s » est déjà défini"
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
-#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
@@ -307,11 +337,11 @@ msgstr "L'alias « %s » est déjà défini"
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1157
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -320,46 +350,47 @@ msgstr "L'alias « %s » est déjà défini"
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
-#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
-#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
-#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
-#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
-#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
-#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
-#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
-#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
-#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
-#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
-#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
-#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
-#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
-#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
-#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
-#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
-#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
-#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
-#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
-#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -372,25 +403,25 @@ msgstr "L'alias « %s » est déjà défini"
#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
-#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
-#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
-#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
-#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
-#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
-#: toke.l:1226
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s : %s"
@@ -399,14 +430,14 @@ msgstr "%s : %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
-#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
-#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
@@ -449,7 +480,7 @@ msgstr "%8s : %s"
msgid "%8s : (command continued) %s"
msgstr "%8s : (suite de la commande) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -564,14 +595,14 @@ msgstr "%s: il manque le champ précisant le groupe effectif (runas)"
msgid "%s exists but is not a directory (0%o)"
msgstr "%s existe mais n'est pas un répertoire (0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "création du répertoire (mkdir) %s impossible"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
-#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, 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"
@@ -586,150 +617,156 @@ msgstr "erreur de lecture dans le fichier de timing : %s"
msgid "invalid timing file line: %s"
msgstr "ligne invalide dans le fichier de timing : %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
-#: plugins/sudoers/policy.c:573
-msgid "unable to generate UUID"
-msgstr "impossible de générer le UUID"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s : erreur de protocole : clé NULL"
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr "%s : erreur de protocole : mauvais type pour %s"
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s : erreur de protocole : valeur NULL trouvée dans %s"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "impossible de générer le UUID"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr "%s : erreur de protocole : %s est manquant dans AcceptMessage"
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr "%s : impossible de formater l'id de session"
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr "%s : %s n'est pas défini"
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr "impossible de développer le chemin iolog %s"
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr "impossible de créer le chemin iolog %s"
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr "iofd %d invalide"
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr "erreur à la fermeture du iofd %d : %s"
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr "erreur lors de la vidange du iofd %d : %s"
-#: logsrvd/iolog_writer.c:780
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "journal E/S %s invalide : il est fait référence à %s alors qu'il n'est pas présent"
-#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s : impossible de trouver le point de redémarrage [%lld, %ld]"
-#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
-#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
-#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
-#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr "ouverture de %s impossible"
-#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "ouverture de %si/%s impossible"
-#: logsrvd/iolog_writer.c:839
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "impossible de copier %s/%s vers %s/%s : %s"
-#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr "impossible de renommer %s en %s"
-#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s : impossible de trouver le point de redémarrage [%lld, %ld]"
-#: logsrvd/logsrv_util.c:154
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "fichier du journal E/S %s/%s manquant"
-#: logsrvd/logsrv_util.c:161
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s : impossible d'examiner vers l'avant de %zu"
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr "impossible de se connecter au relai"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr "message serveur trop grand : %zu"
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
-#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
-#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
-#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
-#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
-#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
-#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
-#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
-#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
-#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
-#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
-#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -738,633 +775,658 @@ msgstr "message serveur trop grand : %zu"
msgid "unable to add event to queue"
msgstr "impossible d'ajouter l'événement à la queue"
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr "état %d inattendu pour %s"
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "erreur de la machine à états"
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "AcceptMessage invalide"
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "RejectMessage invalide"
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "ExitMessage invalide"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "RestartMessage invalide"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "AlertMessage invalide"
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr "%s : IoBuffer inattendu"
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "erreur protocole"
-#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
-#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
-#: plugins/sudoers/log_client.c:1618
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "IoBuffer invalide"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "ChangeWindowSize invalide"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "CommandSuspend invalide"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "impossible de décompresser %s avec une taille de %zu"
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "valeur type_case %d inattendue dans %s de %s"
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "type de ClientMessage non reconnu"
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr "délai d'attente expiré durant l'écriture vers le client %s"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr "tampon d'écriture manquant pour le client %s"
-#: logsrvd/logsrvd.c:982
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr "délai d'attente expiré durant la lecture depuis le client %s"
-#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "Fin de fichier reçu de %s sans suivre la procédure d'arrêt TLS"
-#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:716
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr "message client trop grand : %zu"
-#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "message client trop grand"
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "ClientMessage invalide"
-#: logsrvd/logsrvd.c:1389
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "impossible d'obtenir l'adresse IP distante"
-#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
-#: plugins/sudoers/log_client.c:276
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "Impossible d'attacher les données utilisateur à l'objet ssl : %s"
-#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "configuration du socket d'écoute impossible"
-#: logsrvd/logsrvd.c:1718
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr "signal %d inattendu"
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "serveur de journalisation de sudo"
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "Options :"
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "chemin du fichier de configuration"
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "afficher le message d'aide et quitter"
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "ne pas cloner, exécuter à l'avant plan"
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "pourcentage de chance que les connections soient abandonnées"
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "afficher l'information de version et quitter"
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Version 1.3 ou supérieure de Protobuf-C requise"
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "valeur d'abandon aléatoire invalide : %s"
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:180
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s version %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
-#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
-#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "utilisateur %s inconnu"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
-#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr "groupe %s inconnu"
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr "impossible d'analyser le mode iolog %s"
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr "valeur invalide pour %s : %s"
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "TLS non supporté"
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s  n'est pas un chemin totalement défini"
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr "catégorie syslog %s inconnue"
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr "priorité syslog %s inconnue"
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s:%d « [ » sans correspondant : %s"
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr "%s:%d charabia après « ] » : %s"
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s:%d section de configuration invalide : %s"
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s:%d ligne de configuration invalide : %s"
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d nom de section attendu : %s"
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] clé illégale : %s"
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:1035
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr "ouverture du fichier de journalisation %s impossible"
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "impossible d'initialiser le contexte TLS du serveur : %s"
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "impossible d'initialiser le contexte TLS du relai : %s"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
-#: logsrvd/logsrvd_journal.c:416
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "impossible de créer le fichier de journalisation"
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1020
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr "impossible de verrouiller %s"
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "verrouillage du fichier de journalisation impossible : %s"
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr "impossible d'ouvrir le fichier de journalisation"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
-#: logsrvd/logsrvd_journal.c:452
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "impossible d'écrire le fichier de journalisation"
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "impossible de renommer le fichier de journalisation"
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "fin de fichier inattendue en lisant le fichier de journalisation"
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "erreur de lecture dans le fichier de journalisation"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "fichier de journalisation invalide, impossible de redémarrer"
-#: logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "impossible de déplacer le pointeur vers [%lld, %ld] dans le fichier de journalisation %s"
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "valeur value_case %d inattendue dans %s de %s"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "erreur de l'analyse de AcceptMessage"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "erreur lors de la création du journal des E/S"
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "erreur en écrivant l'événement d'acceptation dans le journal"
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "erreur de l'analyse de RejectMessage"
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "erreur en écrivant l'événement de rejet dans le journal"
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr "erreur lors de l'écriture de l'événement de sortie dans le journal"
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "l'enregistrement du journal est déjà terminé, impossible de redémarrer"
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "impossible de redémarrer l'enregistrement du journal"
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "erreur de l'analyse de AlertMessage"
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "erreur lors de l'écriture de l'événement d'alerte dans le journal"
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr "impossible de formater le tampon de minutage, longueur %d"
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr "%s/%s : %s"
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr "connexion abandonnée aléatoirement"
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "erreur d'écriture dans IoBuffer"
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "erreur de l'écriture de ChangeWindowSize"
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "erreur de l'écriture de CommandSuspend"
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "la négociation TLS avec l'hôte relai a échouée"
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "impossible de se connecter à l'hôte relai"
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s : ServerHello invalide, le server_id manque"
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1504
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "ServerHello invalide"
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "type de ServerMessage non reconnu"
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr "délai d'attente expiré durant la lecture depuis le relai %s (%s)"
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "délai d'attente expiré durant la lecture depuis le relai"
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "le nom de l'hôte relai ne correspond pas au certificat"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
-#: logsrvd/logsrvd_relay.c:784
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "erreur de lecture depuis le relai"
-#: logsrvd/logsrvd_relay.c:805
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "impossible de lire depuis le relai"
-#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "le serveur relai a fermé la connexion"
-#: logsrvd/logsrvd_relay.c:838
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "message serveur trop grand"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "délai d'attente expiré durant l'écriture vers le relai %s (%s)"
-#: logsrvd/logsrvd_relay.c:904
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "délai d'attente expiré durant l'écriture vers le relai"
-#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
-#: logsrvd/logsrvd_relay.c:974
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "erreur d'écriture dans le relai"
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "envoyer le journal des E/S de sudo au serveur distant"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "uniquement envoyer un événement d'acceptation (pas d'E/S)"
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "fichier de trousseau de certificats pour vérifier le certificat du serveur"
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "fichier de certificat pour la négociation TLS"
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "hôte auquel envoyer les journaux"
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "ID distant du journal des E/S à compléter"
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "fichier de clé privée"
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "ne pas vérifier le certificat du serveur"
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "port à utiliser lors de la connexion à l'hôte"
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "redémarrer le transfert de journaux E/S précédent"
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "rejeter la commande avec la raison fournie"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr "arrêter le transfert après avoir atteint ce temps"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "tester le serveur d'audit en envoyant le journal des E/S sélectionné n fois en parallèle"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "impossible de rechercher %s:%s : %s"
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "impossible d'obtenir l'adresse IP du serveur"
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "impossible de lire %s/%s : %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
-#: plugins/sudoers/iolog.c:1024
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "événement d'E/S %d inattendu"
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
-#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: état %d inattendu"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "message d'erreur reçu du serveur : %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "message d'interruption reçu du serveur : %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: valeur type_case %d inattendue"
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "délai d'attente expiré durant la lecture depuis le serveur"
-#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
msgid "host name does not match certificate"
msgstr "le nom de l'hôte ne correspond pas au certificat"
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "fin de fichier prématurée"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "message serveur trop grand : %u"
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "délai d'attente expiré durant l'écriture vers le serveur"
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "le point de redémarrage et le ID iolog doivent être spécifiés tous les deux"
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "un point de redémarrage ne peut pas être placé quand aucune E/S est envoyée"
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "terminé prématurément avec l'état %d"
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "temps écoulé envoyé au serveur [%lld, %ld]"
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "point d'enregistrement reçu du serveur [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "le délai de la négociation TLS a expiré"
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "impossible de définir l'événement"
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "la communication TLS a échoué : %s"
-#: logsrvd/tls_client.c:191
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "impossible d'allouer l'objet ssl : %s"
-#: logsrvd/tls_client.c:205
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "Impossible d'attacher le socket à l'objet ssl : %s"
-#: logsrvd/tls_client.c:233
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr "impossible d'initialiser le contexte TLS"
-#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "impossible de sélectionner la suite de chiffrement %s pour TLS 1.2 : %s"
-#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "impossible de sélectionner la suite de chiffrement %s pour TLS 1.3 : %s"
-#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "impossible de définir les paramètres diffie-hellman : %s"
-#: logsrvd/tls_init.c:277
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr "impossible de créer le contexte TLS : %s"
-#: logsrvd/tls_init.c:284
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "impossible de définir TLS 1.2 comme étant la version minimale du protocole : %s"
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
-#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
-#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
-#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
-#: plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "récupération de l'heure du jour impossible"
@@ -1501,7 +1563,7 @@ msgstr "Le compte a expiré, ou la section « account » du module PAM n'est p
msgid "PAM account management error: %s"
msgstr "Erreur de gestion du compte PAM : %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "votre compte n'existe pas dans la base de données %s"
@@ -1574,17 +1636,17 @@ msgstr "Identification de la condition d'audit impossible"
msgid "unable to commit audit record"
msgstr "impossible d'enregistrer l'enregistrement d'audit"
-#: plugins/sudoers/check.c:275
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "erreur de lecture dans le fichier des recommandations d'usage : %s"
-#: plugins/sudoers/check.c:278
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "le fichier des recommandations d'usage %s est ignoré : il n'est pas un fichier ordinaire"
-#: plugins/sudoers/check.c:291
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1604,14 +1666,14 @@ msgstr ""
" #3) De grands pouvoirs confèrent de grandes responsabilités.\n"
"\n"
-#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
-#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "identifiant utilisateur %u inconnu"
-#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
msgid "%s: %s\n"
msgstr "%s : %s\n"
@@ -1641,7 +1703,7 @@ msgstr "ordre de départ : %s : %s"
msgid "order padding: %s: %s"
msgstr "remplissage de l'ordre : %s : %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "Version de la grammaire de %s : %d\n"
@@ -1661,14 +1723,14 @@ msgstr "format de sortie %s non supporté"
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:399 plugins/sudoers/sudoers.c:165
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
-#: plugins/sudoers/visudo.c:969
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "initialisation des valeurs par défaut de sudoers impossible"
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s : %s : %s : %s"
@@ -1693,18 +1755,18 @@ msgstr "type de suppression invalide : %s"
msgid "invalid filter: %s"
msgstr "filtre invalide : %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, 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:1478 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "écriture impossible dans %s"
-#: plugins/sudoers/cvtsudoers.c:1501
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1713,7 +1775,7 @@ msgstr ""
"%s - convertir entre des formats de fichiers sudoers\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1503
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -2165,362 +2227,386 @@ msgstr "L'umask indiqué dans sudoers se substituera à celui de l'utilisateur,
#: plugins/sudoers/def_data.c:352
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"
+msgstr "Consignation des saisies de l'utilisateur dans le journal pour la commande en cours d'exécution"
#: plugins/sudoers/def_data.c:356
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "Consigne l'entrée standard de la commande dans le journal si elle n'est pas connectée à un terminal"
+
+#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "Consignation des saisies du terminal de l'utilisateur dans le journal pour la commande en cours d'exécution"
+
+#: plugins/sudoers/def_data.c:364
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:360
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "Consigne la sortie standard de la commande dans le journal si elle n'est pas connectée à un terminal"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "Consigne l'erreur standard de la commande dans le journal si elle n'est pas connectée à un terminal"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "Consigne dans le journal la sortie envoyée sur le terminal par la commande en cours d'exécution"
+
+#: plugins/sudoers/def_data.c:380
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:364
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "Exécute toujours les commandes dans un pseudo-terminal (tty)"
-#: plugins/sudoers/def_data.c:368
+#: plugins/sudoers/def_data.c:388
#, 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:372
+#: plugins/sudoers/def_data.c:392
#, 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:376
+#: plugins/sudoers/def_data.c:396
#, 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:380
+#: plugins/sudoers/def_data.c:400
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:384
+#: plugins/sudoers/def_data.c:404
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:388
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "Ensemble des privilèges permis : %s"
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "Ensemble des privilèges limités : %s"
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:416
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:400
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "Nom de service PAM à utiliser : %s"
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:424
#, 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:408
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "Nom de service PAM à utiliser quand sudo est exécuté avec l'option -A : %s"
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:432
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:416
+#: plugins/sudoers/def_data.c:436
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:420
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "Réaliser la gestion de la validation du compte PAM"
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "Numéro de séquence maximum dans le journal E/S : %s"
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "Activation de la prise en charge de netgroup par sudoers"
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:452
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:436
+#: plugins/sudoers/def_data.c:456
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:440
+#: plugins/sudoers/def_data.c:460
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:444
+#: plugins/sudoers/def_data.c:464
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:448
+#: plugins/sudoers/def_data.c:468
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:452
+#: plugins/sudoers/def_data.c:472
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:456
+#: plugins/sudoers/def_data.c:476
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:460
+#: plugins/sudoers/def_data.c:480
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:464
+#: plugins/sudoers/def_data.c:484
#, 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:468
+#: plugins/sudoers/def_data.c:488
#, 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:472
+#: plugins/sudoers/def_data.c:492
#, 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:476
+#: plugins/sudoers/def_data.c:496
#, 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:480
+#: plugins/sudoers/def_data.c:500
#, 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:484
+#: plugins/sudoers/def_data.c:504
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:488
+#: plugins/sudoers/def_data.c:508
#, 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:492
+#: plugins/sudoers/def_data.c:512
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:496
+#: plugins/sudoers/def_data.c:516
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:500
+#: plugins/sudoers/def_data.c:520
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:504
+#: plugins/sudoers/def_data.c:524
#, 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:508
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "Message de l'échec de l'authentification : %s"
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "Ignorer la casse lors de la correspondance des noms d'utilisateurs"
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "Ignorer la casse lors de la correspondance des noms de groupes"
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:540
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:524
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "Écrire dans le journal lorsqu'une commande est interdite par sudoers"
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "Serveur(s) des journaux sudo auquel se connecter avec un port facultatif"
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Délai d'expiration du serveur des journaux sudo en seconde : %u"
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "Activer l'option SO_KEEPALIVE du socket sur le socket connecté au serveur de journal"
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "Emplacement du fichier du paquet du CA d'audit du serveur : %s"
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "Emplacement du fichier de certificat de sudoers : %s"
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "Emplacement du fichier de clé privée de sudoers : %s"
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "Vérifier que le certificat du serveur contenant le journal est valide"
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "Autoriser l'utilisation d'ID d'utilisateurs ou de groupe inconnus dans runas"
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "Uniquement autoriser l'exécutions de commandes en tant qu'un utilisateur avec un interpréteur de commande valide"
-#: plugins/sudoers/def_data.c:564
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "Définir l'utilisateur distant de pam à l'utilisateur qui exécute sudo"
-#: plugins/sudoers/def_data.c:568
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "Définir l'hôte distant de pam au nom de l'hôte local"
-#: plugins/sudoers/def_data.c:572
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "Le répertoire de travail à utiliser avant d'exécuter la commande : %s"
-#: plugins/sudoers/def_data.c:576
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "Le répertoire racine à utiliser avant d'exécuter la commande : %s"
-#: plugins/sudoers/def_data.c:580
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "Format des journaux à produire : %s"
-#: plugins/sudoers/def_data.c:584
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "Activer le support pour SELinux RBAC"
-#: plugins/sudoers/def_data.c:588
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "Chemin vers le fichier qui est créé la première fois que sudo est exécuté : %s"
-#: plugins/sudoers/def_data.c:592
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "Intercepter les commandes suivantes et leur appliquer les restrictions sudoers"
-#: plugins/sudoers/def_data.c:596
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr "Consigner les sous-commandes exécutées par la commande originale"
-#: plugins/sudoers/def_data.c:600
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr "Consigner le code de retour des commandes"
-#: plugins/sudoers/def_data.c:604
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "Les commandes ultérieures dans une session interceptée doivent être authentifiées"
-#: plugins/sudoers/def_data.c:608
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "Autoriser une commande interceptée à exécuter des programmes avec le fanion setuid ou setgid activé"
-#: plugins/sudoers/def_data.c:612
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "La taille maximale à laquelle l'espace d'adresses du processus peut grandir (en octets) : %s"
-#: plugins/sudoers/def_data.c:616
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "La taille de la plus grande vidange système qui peut être créée (en octets) : %s"
-#: plugins/sudoers/def_data.c:620
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "Le temps CPU maximum que le processus peut utiliser (en secondes) : %s"
-#: plugins/sudoers/def_data.c:624
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "La taille maximale du segment de données pour le processus (en octets) : %s"
-#: plugins/sudoers/def_data.c:628
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "La taille la plus grande d'un fichier que le processus peut créer (en octets) : %s"
-#: plugins/sudoers/def_data.c:632
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "Le nombre maximum de verrous que le processus peut établir : %s"
-#: plugins/sudoers/def_data.c:636
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "La taille maximale que le processus peut verrouiller en mémoire (en octets) : %s"
-#: plugins/sudoers/def_data.c:640
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "Le nombre maximum de fichiers que le processus peut garder ouverts : %s"
-#: plugins/sudoers/def_data.c:644
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "Le nombre maximum de processus que l'utilisateur peut exécuter simultanément : %s"
-#: plugins/sudoers/def_data.c:648
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "La taille maximale à laquelle l'ensemble résident du processus peut grandir (en octets) : %s"
-#: plugins/sudoers/def_data.c:652
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "La taille maximale à laquelle la pile du processus peut grandir (en octets) : %s"
-#: plugins/sudoers/def_data.c:656
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr "Tenter une authentification même dans le mode non interactif"
-#: plugins/sudoers/def_data.c:660
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr "Stocker le mot de passe en clair dans l'entrée du journal des E/S"
-#: plugins/sudoers/def_data.c:664
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr "Liste des expressions régulières à utiliser lors de la recherche de correspondance de l'invite du mot de passe"
-#: plugins/sudoers/def_data.c:668
+#: plugins/sudoers/def_data.c:688
#, c-format
msgid "The mechanism used by the intercept and log_subcmds options: %s"
msgstr "Le mécanisme utilisé par les options intercept et log_subcmds : %s"
-#: plugins/sudoers/def_data.c:672
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "Tentative de vérifier la commande et les arguments après l'exécution"
+
+#: plugins/sudoers/def_data.c:696
#, c-format
msgid "AppArmor profile to use in the new security context: %s"
msgstr "Profil AppArmor à utiliser dans le nouveau contexte de sécurité : %s"
@@ -2555,31 +2641,31 @@ msgstr "type Defaults 0x%x invalide pour l'option «â£%sâ£Â»"
msgid "value \"%s\" is invalid for option \"%s\""
msgstr "la valeur « %s » ne convient pas pour l'option « %s »"
-#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
-#: plugins/sudoers/policy.c:216
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
msgid "path name for \"%s\" too long"
msgstr "chemin trop long pour « %s »"
-#: plugins/sudoers/defaults.c:1133
+#: plugins/sudoers/defaults.c:1134
#, c-format
msgid "values for \"%s\" must start with a '/', '~', or '*'"
msgstr "les valeurs de « %s » doivent commencer par « / », « ~ » ou « * »"
-#: plugins/sudoers/defaults.c:1140
+#: plugins/sudoers/defaults.c:1141
#, c-format
msgid "values for \"%s\" must start with a '/'"
msgstr "les valeurs de « %s » doivent commencer par « / »"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv : envp est corrompu, longueur incorrecte"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "impossible de créer à nouveau l'environnement"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, 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"
@@ -2594,27 +2680,27 @@ msgstr "le type résumé (digest type) %d pour n'est pas autorisé pour %s"
msgid "%s: read error"
msgstr "%s : erreur en lecture"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s doit appartenir à l'utilisateur (uid) %d"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, 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:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "chargement de %s impossible : %s"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, 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:107
+#: plugins/sudoers/group_plugin.c:202
#, 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"
@@ -2637,10 +2723,10 @@ msgstr "Couples adresse IP locale/masque de sous-réseau :\n"
msgid "unable to update sequence file"
msgstr "mise à jour du fichier de séquence impossible"
-#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
-#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
-#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
-#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "impossible d'écrire dans le journal des E/S : %s"
@@ -2650,25 +2736,25 @@ msgstr "impossible d'écrire dans le journal des E/S : %s"
msgid "unable to create %s/%s"
msgstr "impossible de créer %s/%s"
-#: plugins/sudoers/iolog.c:955
+#: plugins/sudoers/iolog.c:957
#, 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:1054 plugins/sudoers/iolog.c:1182
-#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
-#: plugins/sudoers/visudo.c:552
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "lecture de l'horloge impossible"
-#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
-#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: erreur interne, signal %d invalide"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "starttls n'est pas pris en charge lors de l'utilisation de ldap"
@@ -2691,7 +2777,7 @@ msgstr "initialisation de LDAP impossible : %s"
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:1886 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "attribut sudoOrder invalide : %s"
@@ -2701,12 +2787,12 @@ msgstr "attribut sudoOrder invalide : %s"
msgid "%s: port too large"
msgstr "%s: port trop grand"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "type d'uri LDAP non pris en charge : %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "fusion des URIs ldap et ldaps impossible"
@@ -2731,111 +2817,111 @@ msgstr "ouverture du fichier d'audit du système impossible"
msgid "unable to send audit message"
msgstr "envoi du message d'audit impossible"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
-#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "erreur dans la boucle des événements"
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "La création du nouvel objet SSL_CTX a échoué : %s"
-#: plugins/sudoers/log_client.c:225
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "impossible de charger le paquet de l'autorité du certificat %s"
-#: plugins/sudoers/log_client.c:247
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "impossible de charger le certificat %s"
-#: plugins/sudoers/log_client.c:261
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "impossible de charger la clé privée %s"
-#: plugins/sudoers/log_client.c:270
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "Impossible d'allouer l'objet ssl : %s"
-#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "la connexion TLS à %s:%s a échoué : %s"
-#: plugins/sudoers/log_client.c:538
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "l'initialisation TLS n'a pas réussi"
-#: plugins/sudoers/log_client.c:548
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "la négociation TLS n'a pas réussi"
-#: plugins/sudoers/log_client.c:1246
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: erreur interne, statut de sortie %d invalide"
-#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "perte de la connexion au serveur de journalisation"
-#: plugins/sudoers/log_client.c:1876
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "tampon d'écriture manquant"
-#: plugins/sudoers/log_client.c:2024
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "impossible de se connecter au serveur de journal"
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "l'utilisateur n'apparaît PAS dans sudoers"
-#: plugins/sudoers/logging.c:300
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "l'utilisateur n'est PAS autorisé sur cet hôte"
-#: plugins/sudoers/logging.c:302
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "commande non autorisée"
-#: plugins/sudoers/logging.c:323
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr "%s n'est pas dans le fichier sudoers.\n"
-#: plugins/sudoers/logging.c:326
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "%s n'est pas autorisé à exécuter sudo sur %s.\n"
-#: plugins/sudoers/logging.c:329
+#: plugins/sudoers/logging.c:321
#, 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:332
+#: plugins/sudoers/logging.c:324
#, 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:342
+#: plugins/sudoers/logging.c:334
msgid "This incident has been reported to the administrator.\n"
msgstr "Cet incident a été signalé à l'administrateur.\n"
-#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
-#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
-#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
-#: plugins/sudoers/sudoers.c:801
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s : commande introuvable"
-#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2844,31 +2930,31 @@ 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:395
+#: plugins/sudoers/logging.c:387
#, 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:485
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "échec de l'authentification"
-#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "il est nécessaire de saisir un mot de passe"
-#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
msgid "problem parsing sudoers"
msgstr "problème lors de l'analyse syntaxique de sudoers"
-#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
msgid "%s:%d:%d: %s"
msgstr "%s:%d:%d: %s"
-#: plugins/sudoers/logging.c:1068
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "impossible d'écrire le fichier journal : %s"
@@ -2883,7 +2969,7 @@ msgstr "le résumé (digest) de %s (%s) a la mauvaise longueur %zu, %zu attendue
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/parse.c:585
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2892,7 +2978,7 @@ msgstr ""
"\n"
"Rôle LDAP : %s\n"
-#: plugins/sudoers/parse.c:588
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2900,110 +2986,110 @@ msgstr ""
"\n"
"Entrée sudoers :\n"
-#: plugins/sudoers/parse.c:590
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " RunAsUsers : "
-#: plugins/sudoers/parse.c:605
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " RunAsGroups : "
-#: plugins/sudoers/parse.c:615
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " Options : "
-#: plugins/sudoers/parse.c:679
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " Commandes :\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:876
#, 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:888
+#: plugins/sudoers/parse.c:894
#, 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:906
+#: plugins/sudoers/parse.c:912
#, 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:921
+#: plugins/sudoers/parse.c:927
#, 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:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "le sudoRole incomplet est ignoré : cn : %s"
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "attribut LDIF invalide : %s"
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, 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:351 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "impossible d'analyser la liste des adresses réseau"
-#: plugins/sudoers/policy.c:508
+#: plugins/sudoers/policy.c:526
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:512
+#: plugins/sudoers/policy.c:530
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:516
+#: plugins/sudoers/policy.c:534
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:520
+#: plugins/sudoers/policy.c:538
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:706
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "répertoire de travail invalide : %s"
-#: plugins/sudoers/policy.c:886
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "répertoire chroot invalide : %s"
-#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "exécution de %s impossible"
-#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
-#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: fanions de mode invalides dans l'interface utilisateur de sudo : 0x%x"
-#: plugins/sudoers/policy.c:1262
+#: plugins/sudoers/policy.c:1292
#, 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:1264
+#: plugins/sudoers/policy.c:1294
#, 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:1268
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -3012,27 +3098,27 @@ msgstr ""
"\n"
"Chemin d'accès à sudoers : %s\n"
-#: plugins/sudoers/policy.c:1271
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "chemin d'accès à nsswitch : %s\n"
-#: plugins/sudoers/policy.c:1273
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "chemin d'accès à ldap.conf : %s\n"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "chemin d'accès à ldap.secret : %s\n"
-#: plugins/sudoers/policy.c:1307
+#: plugins/sudoers/policy.c:1337
#, 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/policy.c:1325
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "désactivation d'un point d'ancrage de type %d (version %d.%d) impossible"
@@ -3171,148 +3257,142 @@ msgstr "initialisation de la source SSS impossible. SSSD est-il installé sur ce
msgid "unable to find symbol \"%s\" in %s"
msgstr "Le symbole « %s » est introuvable dans %s"
-#: plugins/sudoers/sudoers.c:258
+#: plugins/sudoers/sudoers.c:263
#, c-format
msgid "unable to get defaults from %s"
msgstr "impossible d'obtenir les valeurs par défaut pour %s"
-#: plugins/sudoers/sudoers.c:265
+#: plugins/sudoers/sudoers.c:270
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:341
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "l'utilisateur n'est pas autorisé à changer le répertoire racine en %s"
-#: plugins/sudoers/sudoers.c:343
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "vous n'êtes pas autorisé à utiliser l'option -R avec %s"
-#: plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "l'utilisateur n'est pas autorisé à changer de répertoire vers %s"
-#: plugins/sudoers/sudoers.c:369
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "vous n'êtes pas autorisé à utiliser l'option -D avec %s"
-#: plugins/sudoers/sudoers.c:396
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "aucune commande spécifiée"
-#: plugins/sudoers/sudoers.c:421
+#: plugins/sudoers/sudoers.c:426
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:471
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "l'utilisateur n'est pas autorisé à outrepasser la limite closeform"
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "vous n'êtes pas autorisé à utiliser l'option -C"
-#: plugins/sudoers/sudoers.c:532
+#: plugins/sudoers/sudoers.c:537
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr "propriétaire du fichier d'horodatage (%s) : utilisateur inconnu"
-#: plugins/sudoers/sudoers.c:547
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "pas de terminal tty"
-#: plugins/sudoers/sudoers.c:548
+#: plugins/sudoers/sudoers.c:553
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:555
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "interpréteur de commande invalide pour l'utilisateur %s : %s"
-#: plugins/sudoers/sudoers.c:638
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "commande dans le répertoire courant"
-#: plugins/sudoers/sudoers.c:653
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "« cd » est une commande interne du shell, elle ne peut pas être exécutée directement."
-#: plugins/sudoers/sudoers.c:655
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr "l'option -s peut être utilisée pour exécuter un shell privilégié."
-#: plugins/sudoers/sudoers.c:657
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr "l'option -D peut être utilisée pour exécuter une commande dans un répertoire spécifique."
-#: plugins/sudoers/sudoers.c:666
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "l'utilisateur n'est pas autorisé à définir un délai d'expiration de la commande"
-#: plugins/sudoers/sudoers.c:668
+#: plugins/sudoers/sudoers.c:673
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:676
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "l'utilisateur n'est pas autorisé à conserver l'environnement"
-#: plugins/sudoers/sudoers.c:678
+#: plugins/sudoers/sudoers.c:683
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:1053
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "sudoedit n'a pas besoin d'être exécuté via sudo"
-#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "lecture de %s impossible"
-#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
-#: plugins/sudoers/visudo.c:764
-#, c-format
-msgid "unable to stat %s"
-msgstr "impossible d'appliquer la fonction stat à %s"
-
-#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%s n'est pas un fichier ordinaire"
-#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, 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:1147 toke.l:1252
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "Le fichier %s est ouvert en écriture pour tous"
-#: plugins/sudoers/sudoers.c:1151 toke.l:1255
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, 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:1184
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "« -c %s » est réservé à l'utilisateur root"
-#: plugins/sudoers/sudoers.c:1203
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr "classe de connexion %s inconnue"
-#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "impossible de résoudre l'hôte %s"
@@ -3410,17 +3490,17 @@ msgstr "« ! » n'est pas autorisé en fin d'expression"
msgid "unknown search type %d"
msgstr "type de recherche %d inconnu"
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, 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:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, 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:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -3429,7 +3509,7 @@ msgstr ""
"%s - rejeu du journal de la session sudo\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3486,127 +3566,122 @@ msgstr ""
"\n"
"Commande sans correspondance"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%s est accessible en écriture pour les membres du groupe"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, 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:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "un horodatage dans le futur a été ignoré"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, 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:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "verrouillage du fichier d'horodatage %s impossible"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, 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/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "sudoedit ne devrait pas être spécifié avec un chemin"
-#: plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:254
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:251
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "envisagez plutôt l'utilisation de l'utilitaire cvtsudoers"
-#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "appuyer sur entrée pour éditer %s : "
-#: plugins/sudoers/visudo.c:321
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr "le contenu de la session d'édition a été laissé dans %s"
-#: plugins/sudoers/visudo.c:397
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "l'éditeur indiqué (%s) n'existe pas"
-#: plugins/sudoers/visudo.c:399
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "aucun éditeur trouvé (chemin d'accès à l'éditeur : %s)"
-#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "impossible d'appliquer la fonction stat à %s"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "erreur en écriture"
-#: plugins/sudoers/visudo.c:559
+#: plugins/sudoers/visudo.c:565
#, 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:566
+#: plugins/sudoers/visudo.c:572
#, 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:572
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "l'éditeur (%s) a échoué, %s n'a pas été modifié"
-#: plugins/sudoers/visudo.c:594
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s n'a pas été modifié"
-#: plugins/sudoers/visudo.c:639
+#: plugins/sudoers/visudo.c:645
#, 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:652
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "impossible d'analyser le fichier temporaire (%s), erreur inconnue"
-#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, 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:803
+#: plugins/sudoers/visudo.c:809
#, 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:814
+#: plugins/sudoers/visudo.c:820
#, 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:821
+#: plugins/sudoers/visudo.c:827
#, 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:841
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "Et maintenant ?"
-#: plugins/sudoers/visudo.c:855
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3618,41 +3693,41 @@ msgstr ""
" 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:901
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "exécution de %s impossible"
-#: plugins/sudoers/visudo.c:932
+#: plugins/sudoers/visudo.c:938
#, 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:943
+#: plugins/sudoers/visudo.c:949
#, 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:991 plugins/sudoers/visudo.c:998
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s : analyse réussie\n"
-#: plugins/sudoers/visudo.c:1017
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%s n'est pas disponible, réessayez plus tard"
-#: plugins/sudoers/visudo.c:1021
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "Éditer quand même ? [y/N]"
-#: plugins/sudoers/visudo.c:1117
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "Attention : %s:%d:%d: %s « %s » n'est pas utilisé"
-#: plugins/sudoers/visudo.c:1229
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3661,13 +3736,14 @@ msgstr ""
"%s - édite le fichier sudoers en toute sécurité\n"
"\n"
-#: plugins/sudoers/visudo.c:1231
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"
@@ -3677,6 +3753,7 @@ msgstr ""
" -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"
+" -I, --no-includes ne pas éditer les fichiers inclus\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"
@@ -3713,6 +3790,12 @@ msgstr "saut de ligne inattendu dans la chaîne"
msgid "too many levels of includes"
msgstr "nombre de niveaux d'inclusions trop élevé"
+#~ msgid "%s is group writable"
+#~ msgstr "%s est accessible en écriture pour les membres du groupe"
+
+#~ 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"
+
#~ msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
#~ msgstr "Attention : %s:%d:%d: boucle dans %s « %s »"
diff --git a/plugins/sudoers/po/ja.mo b/plugins/sudoers/po/ja.mo
index 9ec66413d..8d864ec04 100644
--- a/plugins/sudoers/po/ja.mo
+++ b/plugins/sudoers/po/ja.mo
Binary files differ
diff --git a/plugins/sudoers/po/ja.po b/plugins/sudoers/po/ja.po
index dd2059e73..a90a09d43 100644
--- a/plugins/sudoers/po/ja.po
+++ b/plugins/sudoers/po/ja.po
@@ -4,10 +4,10 @@
# Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>, 2012, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022.
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.10b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-02-11 18:33-0700\n"
-"PO-Revision-Date: 2022-02-14 23:39+0900\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-15 08:41+0900\n"
"Last-Translator: Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>\n"
"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
"Language: ja\n"
@@ -16,11 +16,11 @@ msgstr ""
"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.9.9b1\n"
+"X-Poedit-Basepath: sudo-1.9.12b2\n"
"X-Generator: Poedit 2.4.2\n"
"X-Poedit-SearchPath-0: .\n"
-#: confstr.sh:1 gram.y:1198
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "構文エラー"
@@ -44,66 +44,80 @@ msgstr "*** %h ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£æƒ…å ± ***"
msgid "Sorry, try again."
msgstr "残念ã€ã¾ãŸè©¦ã—ã¦ãã ã•ã„。"
-#: gram.y:233 gram.y:300 gram.y:309 gram.y:318 gram.y:328 gram.y:338
-#: gram.y:362 gram.y:389 gram.y:398 gram.y:406 gram.y:415 gram.y:424
-#: gram.y:498 gram.y:508 gram.y:520 gram.y:564 gram.y:573 gram.y:582
-#: gram.y:591 gram.y:718 gram.y:726 gram.y:737 gram.y:749 gram.y:768
-#: gram.y:923 gram.y:928 gram.y:936 gram.y:950 gram.y:956 gram.y:1078
-#: gram.y:1087 gram.y:1095 gram.y:1104 gram.y:1113 gram.y:1142 gram.y:1151
-#: gram.y:1159 gram.y:1252 gram.y:1382 gram.y:1748 gram.y:1798
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
-#: lib/eventlog/eventlog.c:804 lib/eventlog/eventlog.c:881
-#: lib/eventlog/eventlog.c:1176 lib/iolog/iolog_filter.c:142
-#: lib/iolog/iolog_filter.c:204 lib/iolog/iolog_filter.c:233
+#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
+#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
+#: lib/iolog/iolog_filter.c:202 lib/iolog/iolog_filter.c:233
#: lib/iolog/iolog_json.c:150 lib/iolog/iolog_json.c:382
#: lib/iolog/iolog_json.c:412 lib/iolog/iolog_json.c:555
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1011 logsrvd/logsrvd.c:1073
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:425
-#: logsrvd/logsrvd_journal.c:427 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:843
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:118
-#: plugins/sudoers/auth/kerb5.c:146 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:134 plugins/sudoers/cvtsudoers.c:131
-#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
-#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
-#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
-#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:758
-#: plugins/sudoers/cvtsudoers.c:873 plugins/sudoers/cvtsudoers.c:881
-#: plugins/sudoers/cvtsudoers.c:1376 plugins/sudoers/cvtsudoers.c:1380
-#: plugins/sudoers/cvtsudoers.c:1482 plugins/sudoers/cvtsudoers_csv.c:183
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
-#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:469
-#: plugins/sudoers/cvtsudoers_ldif.c:477 plugins/sudoers/cvtsudoers_ldif.c:624
-#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
#: plugins/sudoers/cvtsudoers_merge.c:446
@@ -111,53 +125,52 @@ msgstr "残念ã€ã¾ãŸè©¦ã—ã¦ãã ã•ã„。"
#: plugins/sudoers/cvtsudoers_merge.c:553
#: plugins/sudoers/cvtsudoers_merge.c:564
#: plugins/sudoers/cvtsudoers_merge.c:633
-#: plugins/sudoers/cvtsudoers_merge.c:1150
-#: plugins/sudoers/cvtsudoers_merge.c:1223 plugins/sudoers/defaults.c:468
-#: plugins/sudoers/defaults.c:690 plugins/sudoers/defaults.c:1051
-#: plugins/sudoers/defaults.c:1243 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/cvtsudoers_merge.c:1158
+#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
-#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:264
-#: plugins/sudoers/iolog.c:664 plugins/sudoers/iolog.c:690
-#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:433
-#: plugins/sudoers/ldap.c:443 plugins/sudoers/ldap.c:448
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:464
-#: plugins/sudoers/ldap.c:760 plugins/sudoers/ldap.c:924
-#: plugins/sudoers/ldap.c:1340 plugins/sudoers/ldap.c:1766
-#: plugins/sudoers/ldap.c:1803 plugins/sudoers/ldap.c:1884
-#: plugins/sudoers/ldap.c:2019 plugins/sudoers/ldap.c:2120
-#: plugins/sudoers/ldap.c:2136 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
+#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
+#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
+#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
+#: plugins/sudoers/ldap.c:755 plugins/sudoers/ldap.c:919
+#: plugins/sudoers/ldap.c:1335 plugins/sudoers/ldap.c:1761
+#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
+#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
+#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:390 plugins/sudoers/log_client.c:703
-#: plugins/sudoers/log_client.c:724 plugins/sudoers/log_client.c:1444
-#: plugins/sudoers/log_client.c:1662 plugins/sudoers/log_client.c:1989
-#: plugins/sudoers/log_client.c:2045 plugins/sudoers/logging.c:104
-#: plugins/sudoers/logging.c:185 plugins/sudoers/logging.c:469
-#: plugins/sudoers/logging.c:489 plugins/sudoers/logging.c:628
-#: plugins/sudoers/match_command.c:324 plugins/sudoers/match_command.c:567
-#: plugins/sudoers/match_command.c:616 plugins/sudoers/match_command.c:688
-#: plugins/sudoers/match_command.c:736 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:201 plugins/sudoers/parse.c:218
-#: plugins/sudoers/parse.c:250 plugins/sudoers/parse.c:267
-#: plugins/sudoers/parse.c:290 plugins/sudoers/parse.c:301
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
-#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:597
-#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
-#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
-#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
-#: plugins/sudoers/policy.c:570 plugins/sudoers/policy.c:952
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -167,138 +180,153 @@ msgstr "残念ã€ã¾ãŸè©¦ã—ã¦ãã ã•ã„。"
#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
-#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:111
-#: plugins/sudoers/stubs.c:119 plugins/sudoers/sudoers.c:335
-#: plugins/sudoers/sudoers.c:361 plugins/sudoers/sudoers.c:429
-#: plugins/sudoers/sudoers.c:438 plugins/sudoers/sudoers.c:479
-#: plugins/sudoers/sudoers.c:842 plugins/sudoers/sudoers.c:980
-#: plugins/sudoers/sudoers.c:1039 plugins/sudoers/sudoers.c:1305
-#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
-#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
-#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
-#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
-#: plugins/sudoers/testsudoers.c:580 plugins/sudoers/timestamp.c:424
-#: plugins/sudoers/timestamp.c:468 plugins/sudoers/timestamp.c:980
-#: plugins/sudoers/timestamp.c:1118 plugins/sudoers/toke_util.c:78
-#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
-#: plugins/sudoers/toke_util.c:161 plugins/sudoers/toke_util.c:200
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
-#: plugins/sudoers/visudo.c:344 plugins/sudoers/visudo.c:350
-#: plugins/sudoers/visudo.c:456 plugins/sudoers/visudo.c:632
-#: plugins/sudoers/visudo.c:962 plugins/sudoers/visudo.c:1035 toke.l:1015
-#: toke.l:1147 toke.l:1218
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
+#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
+#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
+#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
+#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
+#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "メモリ割り当ã¦ã‚’è¡Œãˆã¾ã›ã‚“ã§ã—ãŸ"
-#: gram.y:615
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "èªè¨¼æ–¹å¼ã«ã¯ãƒ‘スãŒå¿…è¦ã§ã™"
-#: gram.y:637
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "\"CWD\" ã®å€¤ã¯ '/', '~', ã¾ãŸã¯ '*' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: gram.y:643
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr "\"CWD\" パスãŒé•·ã™ãŽã¾ã™"
-#: gram.y:653
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "\"CHROOT\" ã®å€¤ã¯ '/', '~', ã¾ãŸã¯ '*' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: gram.y:659
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr "\"CHROOT\" パスãŒé•·ã™ãŽã¾ã™"
-#: gram.y:788
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "構文エラーã€äºˆç´„語 %s ãŒã‚¨ã‚¤ãƒªã‚¢ã‚¹åã«ä½¿ã‚ã‚Œã¦ã„ã¾ã™"
-#: gram.y:811
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "notbefore ã®å€¤ãŒç„¡åŠ¹ã§ã™"
-#: gram.y:820
+#: gram.y:834
msgid "invalid notafter value"
msgstr "notafter ã®å€¤ãŒç„¡åŠ¹ã§ã™"
-#: gram.y:830 plugins/sudoers/policy.c:353
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "制é™æ™‚é–“ã®å€¤ãŒå¤§ãéŽãŽã¾ã™"
-#: gram.y:832 plugins/sudoers/policy.c:355
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "時間制é™å€¤ãŒç„¡åŠ¹ã§ã™"
-#: gram.y:946 plugins/sudoers/sudoers.c:998
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr "コマンドåãŒé•·ã™ãŽã¾ã™"
-#: gram.y:1200
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1250
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "別å \"%s\" ã¯ã™ã§ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™"
-#: gram.y:1748 gram.y:1798 lib/eventlog/eventlog.c:309
-#: lib/eventlog/eventlog.c:804 lib/eventlog/eventlog.c:877
-#: lib/eventlog/eventlog.c:880 lib/eventlog/eventlog.c:1176
-#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:204
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
+#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
+#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
+#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
#: lib/iolog/iolog_filter.c:232 lib/iolog/iolog_json.c:150
#: lib/iolog/iolog_json.c:381 lib/iolog/iolog_json.c:412
#: lib/iolog/iolog_json.c:555 lib/iolog/iolog_legacy.c:100
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1084 logsrvd/logsrvd.c:1400 logsrvd/logsrvd.c:1406
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:425
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:293 logsrvd/tls_init.c:314
-#: logsrvd/tls_init.c:324 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:134
+#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
#: plugins/sudoers/cvtsudoers.c:191 plugins/sudoers/cvtsudoers.c:202
#: plugins/sudoers/cvtsudoers.c:332 plugins/sudoers/cvtsudoers.c:536
#: plugins/sudoers/cvtsudoers.c:669 plugins/sudoers/cvtsudoers.c:687
-#: plugins/sudoers/cvtsudoers.c:758 plugins/sudoers/cvtsudoers.c:873
-#: plugins/sudoers/cvtsudoers.c:880 plugins/sudoers/cvtsudoers.c:1376
-#: plugins/sudoers/cvtsudoers.c:1380 plugins/sudoers/cvtsudoers.c:1482
-#: plugins/sudoers/cvtsudoers_csv.c:182 plugins/sudoers/cvtsudoers_csv.c:245
-#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150
-#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234
-#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:375
-#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:437
-#: plugins/sudoers/cvtsudoers_ldif.c:448 plugins/sudoers/cvtsudoers_ldif.c:455
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:476
-#: plugins/sudoers/cvtsudoers_ldif.c:623 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:869
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:182
+#: plugins/sudoers/cvtsudoers_csv.c:245 plugins/sudoers/cvtsudoers_json.c:75
+#: plugins/sudoers/cvtsudoers_ldif.c:150 plugins/sudoers/cvtsudoers_ldif.c:193
+#: plugins/sudoers/cvtsudoers_ldif.c:234 plugins/sudoers/cvtsudoers_ldif.c:299
+#: plugins/sudoers/cvtsudoers_ldif.c:375 plugins/sudoers/cvtsudoers_ldif.c:429
+#: plugins/sudoers/cvtsudoers_ldif.c:437 plugins/sudoers/cvtsudoers_ldif.c:448
+#: plugins/sudoers/cvtsudoers_ldif.c:455 plugins/sudoers/cvtsudoers_ldif.c:467
+#: plugins/sudoers/cvtsudoers_ldif.c:480 plugins/sudoers/cvtsudoers_ldif.c:488
+#: plugins/sudoers/cvtsudoers_ldif.c:635 plugins/sudoers/cvtsudoers_merge.c:47
#: plugins/sudoers/cvtsudoers_merge.c:51
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
@@ -309,93 +337,93 @@ msgstr "別å \"%s\" ã¯ã™ã§ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™"
#: plugins/sudoers/cvtsudoers_merge.c:564
#: plugins/sudoers/cvtsudoers_merge.c:630
#: plugins/sudoers/cvtsudoers_merge.c:633
-#: plugins/sudoers/cvtsudoers_merge.c:1149
-#: plugins/sudoers/cvtsudoers_merge.c:1223 plugins/sudoers/defaults.c:468
-#: plugins/sudoers/defaults.c:690 plugins/sudoers/defaults.c:1051
-#: plugins/sudoers/defaults.c:1243 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/cvtsudoers_merge.c:1157
+#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
-#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:264
-#: plugins/sudoers/iolog.c:664 plugins/sudoers/iolog.c:690
-#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:433
-#: plugins/sudoers/ldap.c:443 plugins/sudoers/ldap.c:448
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:464
-#: plugins/sudoers/ldap.c:760 plugins/sudoers/ldap.c:924
-#: plugins/sudoers/ldap.c:1340 plugins/sudoers/ldap.c:1766
-#: plugins/sudoers/ldap.c:1803 plugins/sudoers/ldap.c:1884
-#: plugins/sudoers/ldap.c:2019 plugins/sudoers/ldap.c:2120
-#: plugins/sudoers/ldap.c:2136 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
+#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
+#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
+#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
+#: plugins/sudoers/ldap.c:755 plugins/sudoers/ldap.c:919
+#: plugins/sudoers/ldap.c:1335 plugins/sudoers/ldap.c:1761
+#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
+#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
+#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:221 plugins/sudoers/log_client.c:242
-#: plugins/sudoers/log_client.c:255 plugins/sudoers/log_client.c:390
-#: plugins/sudoers/log_client.c:703 plugins/sudoers/log_client.c:724
-#: plugins/sudoers/log_client.c:1444 plugins/sudoers/log_client.c:1662
-#: plugins/sudoers/log_client.c:1989 plugins/sudoers/log_client.c:2045
-#: plugins/sudoers/logging.c:104 plugins/sudoers/logging.c:184
-#: plugins/sudoers/logging.c:185 plugins/sudoers/logging.c:468
-#: plugins/sudoers/logging.c:488 plugins/sudoers/logging.c:628
-#: plugins/sudoers/match_command.c:323 plugins/sudoers/match_command.c:566
-#: plugins/sudoers/match_command.c:615 plugins/sudoers/match_command.c:688
-#: plugins/sudoers/match_command.c:735 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:200 plugins/sudoers/parse.c:217
-#: plugins/sudoers/parse.c:249 plugins/sudoers/parse.c:266
-#: plugins/sudoers/parse.c:289 plugins/sudoers/parse.c:300
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
-#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:597
-#: plugins/sudoers/parse_ldif.c:626 plugins/sudoers/parse_ldif.c:651
-#: plugins/sudoers/parse_ldif.c:709 plugins/sudoers/parse_ldif.c:726
-#: plugins/sudoers/parse_ldif.c:754 plugins/sudoers/parse_ldif.c:761
-#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:161
-#: plugins/sudoers/policy.c:170 plugins/sudoers/policy.c:197
-#: plugins/sudoers/policy.c:338 plugins/sudoers/policy.c:353
-#: plugins/sudoers/policy.c:355 plugins/sudoers/policy.c:391
-#: plugins/sudoers/policy.c:400 plugins/sudoers/policy.c:448
-#: plugins/sudoers/policy.c:458 plugins/sudoers/policy.c:467
-#: plugins/sudoers/policy.c:476 plugins/sudoers/policy.c:570
-#: plugins/sudoers/policy.c:952 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/set_perms.c:363 plugins/sudoers/set_perms.c:706
-#: plugins/sudoers/set_perms.c:1073 plugins/sudoers/set_perms.c:1380
-#: plugins/sudoers/set_perms.c:1549 plugins/sudoers/sssd.c:144
-#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
-#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
-#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
-#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:111
-#: plugins/sudoers/stubs.c:119 plugins/sudoers/sudoers.c:335
-#: plugins/sudoers/sudoers.c:361 plugins/sudoers/sudoers.c:429
-#: plugins/sudoers/sudoers.c:438 plugins/sudoers/sudoers.c:479
-#: plugins/sudoers/sudoers.c:842 plugins/sudoers/sudoers.c:980
-#: plugins/sudoers/sudoers.c:1039 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
+#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/set_perms.c:363
+#: plugins/sudoers/set_perms.c:706 plugins/sudoers/set_perms.c:1073
+#: plugins/sudoers/set_perms.c:1380 plugins/sudoers/set_perms.c:1549
+#: plugins/sudoers/sssd.c:144 plugins/sudoers/sssd.c:185
+#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
+#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
+#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
-#: plugins/sudoers/testsudoers.c:580 plugins/sudoers/timestamp.c:424
-#: plugins/sudoers/timestamp.c:468 plugins/sudoers/timestamp.c:980
-#: plugins/sudoers/timestamp.c:1118 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
-#: plugins/sudoers/visudo.c:344 plugins/sudoers/visudo.c:350
-#: plugins/sudoers/visudo.c:456 plugins/sudoers/visudo.c:632
-#: plugins/sudoers/visudo.c:962 plugins/sudoers/visudo.c:1035 toke.l:1015
-#: toke.l:1147 toke.l:1210 toke.l:1218
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
@@ -404,16 +432,18 @@ msgstr "%s: %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:580 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
-#: plugins/sudoers/ldap.c:531 plugins/sudoers/ldap.c:764
-#: plugins/sudoers/ldap.c:1137 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/policy.c:740
-#: plugins/sudoers/policy.c:751 plugins/sudoers/prompt.c:168
-#: plugins/sudoers/serialize_list.c:62 plugins/sudoers/serialize_list.c:71
-#: plugins/sudoers/strvec_join.c:62 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/toke_util.c:213 toke.l:979 toke.l:1181
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
+#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
+#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
+#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
+#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
+#: toke.l:987 toke.l:1189
#, c-format
msgid "internal error, %s overflow"
msgstr "内部エラーã€%s ãŒã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒ­ãƒ¼ã—ã¾ã—ãŸ"
@@ -428,31 +458,31 @@ msgstr "標準入力を複製ã§ãã¾ã›ã‚“: %m"
msgid "unable to execute %s: %m"
msgstr "%s を実行ã§ãã¾ã›ã‚“: %m"
-#: lib/eventlog/eventlog.c:456 plugins/sudoers/auth/aix_auth.c:198
+#: lib/eventlog/eventlog.c:463 plugins/sudoers/auth/aix_auth.c:198
msgid "unable to fork"
msgstr "fork ã§ãã¾ã›ã‚“"
-#: lib/eventlog/eventlog.c:464 lib/eventlog/eventlog.c:518
+#: lib/eventlog/eventlog.c:473 lib/eventlog/eventlog.c:538
#, c-format
msgid "unable to fork: %m"
msgstr "fork ã§ãã¾ã›ã‚“: %m"
-#: lib/eventlog/eventlog.c:508
+#: lib/eventlog/eventlog.c:528
#, c-format
msgid "unable to open pipe: %m"
msgstr "パイプを開ã‘ã¾ã›ã‚“: %m"
-#: lib/eventlog/eventlog.c:1007
+#: lib/eventlog/eventlog.c:1030
#, c-format
msgid "%8s : %s"
msgstr "%8s : %s"
-#: lib/eventlog/eventlog.c:1036
+#: lib/eventlog/eventlog.c:1059
#, c-format
msgid "%8s : (command continued) %s"
msgstr "%8s : (コマンド継続中) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1296
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -567,14 +597,14 @@ msgstr "%s: runasグループåフィールドãŒã‚ã‚Šã¾ã›ã‚“"
msgid "%s exists but is not a directory (0%o)"
msgstr "%s ãŒå­˜åœ¨ã—ã¾ã™ãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“ (0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:807 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "ディレクトリ %s を作æˆã§ãã¾ã›ã‚“"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:731
-#: plugins/sudoers/visudo.c:765 plugins/sudoers/visudo.c:771
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "%s ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã®ãƒ¢ãƒ¼ãƒ‰ã‚’ 0%o ã«å¤‰æ›´ã§ãã¾ã›ã‚“"
@@ -589,150 +619,156 @@ msgstr "タイミングファイルã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s"
msgid "invalid timing file line: %s"
msgstr "無効ãªã‚¿ã‚¤ãƒŸãƒ³ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®è¡Œã§ã™: %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:804
-#: plugins/sudoers/policy.c:550
-msgid "unable to generate UUID"
-msgstr "uuid を生æˆã§ãã¾ã›ã‚“"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s: プロトコルエラー: key ㌠NULL ã§ã™"
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr "%s: プロトコルエラー: %s ã®åž‹ã¨ã—ã¦ã¯é–“é•ã£ã¦ã„ã¾ã™"
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s: プロトコルエラー: %s ã« NULL値ãŒå…¥ã£ã¦ã„ã¾ã™"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "uuid を生æˆã§ãã¾ã›ã‚“"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr "%s: プロトコルエラー: %s ㌠AcceptMessage ã«ã‚ã‚Šã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr "%s: セッションIDã‚’æ•´å½¢ã§ãã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr "%s: %s ã¯è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr "iolog ã®ãƒ‘ス %s を伸長ã§ãã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr "iolog ã®ãƒ‘ス %s を作æˆã§ãã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr "無効㪠iofd %d ã§ã™"
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr "iofd %d ã‚’é–‰ã˜ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s"
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr "iofd %d をフラッシュã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s"
-#: logsrvd/iolog_writer.c:777
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "無効㪠I/O ログ %s: %s ãŒå‚ç…§ã•ã‚Œã¦ã„ã¾ã™ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:789 logsrvd/logsrvd_journal.c:377
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s: 復元ãƒã‚¤ãƒ³ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ [%lld, %ld]"
-#: logsrvd/iolog_writer.c:811 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:245
-#: plugins/sudoers/check.c:273 plugins/sudoers/cvtsudoers.c:730
-#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1442
-#: plugins/sudoers/cvtsudoers_csv.c:681 plugins/sudoers/cvtsudoers_json.c:885
-#: plugins/sudoers/cvtsudoers_ldif.c:697 plugins/sudoers/sudoers.c:1092
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:949
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
+#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr "%s ã‚’é–‹ã‘ã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:823 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "%s/%s ã‚’é–‹ã‘ã¾ã›ã‚“"
-#: logsrvd/iolog_writer.c:836
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "%s/%s ã‹ã‚‰ %s/%s ã«ã‚³ãƒ”ーã§ãã¾ã›ã‚“: %s"
-#: logsrvd/iolog_writer.c:865 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr "%s ã‹ã‚‰ %s ã«åå‰ã‚’変更ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrv_util.c:139 logsrvd/logsrv_util.c:168
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s: 復元ãƒã‚¤ãƒ³ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ [%lld, %ld]"
-#: logsrvd/logsrv_util.c:151
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "I/O ログファイル %s/%s ãŒã‚ã‚Šã¾ã›ã‚“。"
-#: logsrvd/logsrv_util.c:158
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: å‰æ–¹æ¤œç´¢ã§ãã¾ã›ã‚“ %zu"
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr "リレーã«æŽ¥ç¶šã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:835
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr "サーãƒãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¤§ãéŽãŽã¾ã™: %zu"
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1010
-#: logsrvd/logsrvd.c:1134 logsrvd/logsrvd.c:1307 logsrvd/logsrvd.c:1325
-#: logsrvd/logsrvd.c:1423 logsrvd/logsrvd.c:1546 logsrvd/logsrvd.c:1730
-#: logsrvd/logsrvd_journal.c:489 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1121
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:209 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1027 plugins/sudoers/iolog.c:1160
-#: plugins/sudoers/iolog.c:1258 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
-#: plugins/sudoers/log_client.c:395 plugins/sudoers/log_client.c:599
-#: plugins/sudoers/log_client.c:606 plugins/sudoers/log_client.c:1131
-#: plugins/sudoers/log_client.c:1413 plugins/sudoers/log_client.c:1454
-#: plugins/sudoers/log_client.c:1462 plugins/sudoers/log_client.c:1618
-#: plugins/sudoers/log_client.c:1734 plugins/sudoers/log_client.c:2053
-#: plugins/sudoers/log_client.c:2061 plugins/sudoers/logging.c:142
-#: plugins/sudoers/logging.c:199 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -741,621 +777,658 @@ msgstr "サーãƒãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¤§ãéŽãŽã¾ã™: %zu"
msgid "unable to add event to queue"
msgstr "イベントをキューã«è¿½åŠ ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr "予期ã—ãªã„状態 %d (%sã®)"
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "状態マシンエラー"
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "無効㪠AcceptMessage"
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "無効㪠RejectMessage"
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "無効㪠ExitMessage"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "無効㪠RestartMessage"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "無効㪠AlertMessage"
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr "%s: 予期ã—ãªã„ IoBuffer"
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "プロトコルエラーã§ã™"
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "無効㪠IoBuffer ã§ã™"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "無効㪠ChangeWindowSize"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "無効㪠CommandSuspend"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
+#, c-format
+msgid "unable to unpack %s size %zu"
+msgstr "%s を伸長ã§ãã¾ã›ã‚“ (é•·ã• %zu )"
+
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "予期ã—ãªã„ type_case ã®å€¤ %d ㌠%s ã®ä¸­ã«ã‚ã‚Šã¾ã™ã€ %s ã‹ã‚‰å‡ºã¦ããŸã‚‚ã®ã§ã™ã€‚"
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "èªè­˜ã§ããªã„クライアントメッセージã®ã‚¿ã‚¤ãƒ—ã§ã™"
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr "クライアント %s ã¸ã®æ›¸ãè¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:907 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr "クライアント %s ã¸ã®æ›¸ãè¾¼ã¿ãƒãƒƒãƒ•ã‚¡ãŒã‚ã‚Šã¾ã›ã‚“"
-#: logsrvd/logsrvd.c:981
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr "クライアント %s ã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/logsrvd.c:1022 logsrvd/logsrvd_relay.c:771
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "%s ã‹ã‚‰ã® EOF ãŒé©åˆ‡ãª TLS 通信ã®çµ‚了ãªã—ã«ç¾ã‚Œã¾ã—ãŸ"
-#: logsrvd/logsrvd.c:1065 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:709
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr "クライアントメッセージãŒå¤§ãéŽãŽã¾ã™: %zu"
-#: logsrvd/logsrvd.c:1066 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "クライアントメッセージãŒå¤§ãéŽãŽã¾ã™"
-#: logsrvd/logsrvd.c:1084 logsrvd/logsrvd.c:1085
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "無効㪠ClientMessage"
-#: logsrvd/logsrvd.c:1386
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "リモートIPアドレスをå–å¾—ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd.c:1415 logsrvd/tls_client.c:196
-#: plugins/sudoers/log_client.c:270
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "ユーザーデータをSSLオブジェクトã«æ·»ä»˜ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
-#: logsrvd/logsrvd.c:1596 logsrvd/logsrvd.c:1948
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "接続待ã¡ã‚½ã‚±ãƒƒãƒˆã‚’準備ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd.c:1713
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr "予期ã—ãªã„シグナル %d"
-#: logsrvd/logsrvd.c:1850
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "Sudo ログサーãƒãƒ¼"
-#: logsrvd/logsrvd.c:1852 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "オプション:"
-#: logsrvd/logsrvd.c:1854
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "設定ファイルã®ãƒ‘ス"
-#: logsrvd/logsrvd.c:1856 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "ヘルプメッセージを表示ã—ã¦çµ‚了ã™ã‚‹"
-#: logsrvd/logsrvd.c:1858
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "フォークã›ãšã«ã€ãƒ•ã‚©ã‚¢ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã™ã‚‹"
-#: logsrvd/logsrvd.c:1860
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "接続ãŒåˆ‡ã‚Œã‚‹å‰²åˆï¼ˆï¼…)"
-#: logsrvd/logsrvd.c:1862 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了ã™ã‚‹"
-#: logsrvd/logsrvd.c:1912 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Protobuf-C ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.3 以上ãŒå¿…è¦ã§ã™"
-#: logsrvd/logsrvd.c:1928
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "無効ãªä¹±æ•°ãƒ‰ãƒ­ãƒƒãƒ—値ã§ã™: %s"
-#: logsrvd/logsrvd.c:1931 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:177
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:335
-#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:120
-#: plugins/sudoers/policy.c:1188 plugins/sudoers/sudoers.c:486
-#: plugins/sudoers/sudoers.c:1347 plugins/sudoers/testsudoers.c:215
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
+#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "ä¸æ˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼ %s"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:145
-#: plugins/sudoers/sudoers.c:491 plugins/sudoers/sudoers.c:1381
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr "ä¸æ˜Žãªã‚°ãƒ«ãƒ¼ãƒ— %s"
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr "iolog モード %s を解æžã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr "%s ã«ã¯ç„¡åŠ¹ãªå€¤: %s"
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "TLS ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s: 完全修飾パスã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr "未知㮠syslog ファシリティ %s"
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr "未知㮠syslog プライオリティ %s"
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s:%d 対応ã—ãªã„ '[': %s"
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr "%s:%d ']' ã®å¾Œã«ä½™è¨ˆãªã‚‚ã®ãŒã‚ã‚Šã¾ã™: %s"
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s:%d 無効㪠config セクション: %s"
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s:%d 無効ãªè¨­å®šã®è¡Œ: %s"
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d セクションåãŒå¿…è¦ã§ã™: %s"
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] é©åˆã—ãªã„キー: %s"
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:857
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr "ログファイル %s ã‚’é–‹ã‘ã¾ã›ã‚“"
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "サーãƒãƒ¼TLSコンテキストをåˆæœŸåŒ–ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "リレーTLSコンテキストをåˆæœŸåŒ–ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:416
-#: logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "ジャーナルファイルを作æˆã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1007
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr "%s をロックã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "ジャーナルファイルをロックã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr "ジャーナルファイルを開ã‘ã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:452
-#: logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "ジャーナルファイルã¸æ›¸ã込むã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "ジャーナルファイルã®åå‰ã‚’変更ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "ジャーナルファイルã®äºˆæœŸã›ã¬ã¨ã“ã‚ã«EOF"
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "ジャーナルファイルã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:376
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "無効ãªã‚¸ãƒ£ãƒ¼ãƒŠãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã€å†ã‚¹ã‚¿ãƒ¼ãƒˆã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_journal.c:435
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "[%lld, %ld] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“〠ジャーナルファイル %s ã§æŽ¢ç´¢ä¸­"
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "予期ã—ãªã„ value_case ã®å€¤ %d ㌠%s ã®ä¸­ã«ã‚ã‚Šã¾ã™ã€ %s ã‹ã‚‰å‡ºã¦ããŸã‚‚ã®ã§ã™ã€‚"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "AcceptMessage ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "I/O ログã®ä½œæˆã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "accept イベントã®ãƒ­ã‚°è¨˜éŒ²ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "RejectMessage ã®è§£æžã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "reject イベントã®ãƒ­ã‚°è¨˜éŒ²ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr "exit イベントã®ãƒ­ã‚°è¨˜éŒ²ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "ログã¯å®Œäº†ã—ã¦ã„ã‚‹ã®ã§ã€å†é–‹ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "ログをå†é–‹ã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "AlertMessage ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "alert イベントã®ãƒ­ã‚°è¨˜éŒ²ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr "タイミングãƒãƒƒãƒ•ã‚¡ãƒ¼ã‚’書å¼æ•´å½¢ã§ãã¾ã›ã‚“ã€é•·ã• %d"
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr "%s/%s: %s"
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr "ä¸è¦å‰‡ã«æŽ¥ç¶šãŒè½ã¡ã¦ã„ã¾ã™"
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "IoBuffer ã®æ›¸ãè¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "ChangeWindowSize ã®æ›¸ãè¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "CommandSuspend ã®æ›¸ãè¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "リレーホストã¸ã®TLS ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå¤±æ•—"
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "リレーホストã«æŽ¥ç¶šã§ãã¾ã›ã‚“"
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s: 無効㪠ServerHello ã§ã™ã€server_id ãŒã‚ã‚Šã¾ã›ã‚“"
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1497
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "無効㪠ServerHello ã§ã™"
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "èªè­˜ã§ããªã„ ServerMessage ã®ã‚¿ã‚¤ãƒ—ã§ã™"
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr "リレー %s (%s) ã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "リレーã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "リレーホストåãŒè¨¼æ˜Žæ›¸ã¨ä¸€è‡´ã—ã¾ã›ã‚“"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:776
-#: logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "リレーã‹ã‚‰ã®èª­ã¿è¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/logsrvd_relay.c:803
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "リレーã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“"
-#: logsrvd/logsrvd_relay.c:818 logsrvd/logsrvd_relay.c:936
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "リレーサーãƒãƒ¼ãŒæŽ¥ç¶šã‚’é–‰ã˜ã¾ã—ãŸ"
-#: logsrvd/logsrvd_relay.c:836
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "サーãƒãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¤§ãéŽãŽã¾ã™"
-#: logsrvd/logsrvd_relay.c:900
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "リレー %s (%s) ã¸ã®æ›¸ãè¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "リレーã¸ã®æ›¸ãè¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/logsrvd_relay.c:955 logsrvd/logsrvd_relay.c:961
-#: logsrvd/logsrvd_relay.c:971
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "リレーã¸ã®æ›¸ãè¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼"
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "sudo I/O ログをリモートサーãƒãƒ¼ã«é€ã‚‹"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "å—ã‘å–りイベントã®ã¿ã‚’é€ã‚‹ (I/O ãªã—)"
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "サーãƒãƒ¼ã®è¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãŸã‚ã«çªãåˆã‚ã›ã‚‹è¨¼æ˜Žæ›¸ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«"
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®ãŸã‚ã®è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«"
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "ログã®é€ã‚Šå…ˆã¨ã™ã‚‹ãƒ›ã‚¹ãƒˆ"
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "復元ã™ã‚‹I/O ログã®ãƒªãƒ¢ãƒ¼ãƒˆ ID"
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "プライベートéµãƒ•ã‚¡ã‚¤ãƒ«"
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "サーãƒãƒ¼ã®è¨¼æ˜Žæ›¸ã‚’検証ã—ãªã„"
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "ホストã«æŽ¥ç¶šã™ã‚‹ã®ã«ä½¿ç”¨ã™ã‚‹ãƒãƒ¼ãƒˆ"
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "以å‰ã® I/O ログ転é€ã‚’å†é–‹ã™ã‚‹"
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "与ãˆã‚‰ã‚ŒãŸç†ç”±ã«ã‚ˆã‚Šã‚³ãƒžãƒ³ãƒ‰ã‚’æ‹’å¦ã™ã‚‹"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr "ã“ã®æ™‚é–“ã«ãªã£ãŸã‚‰è»¢é€ã‚’æ­¢ã‚ã‚‹"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "é¸ã‚“ã  I/O ログを n é‡ã«ä¸¦åˆ—é€ä¿¡ã™ã‚‹ã“ã¨ã§ç›£æŸ»ã‚µãƒ¼ãƒãƒ¼ã‚’試験ã™ã‚‹"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:441
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "警告: %s:%s ã‚’å‚ç…§ã§ãã¾ã›ã‚“: %s"
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "サーãƒãƒ¼ã®IPアドレスをå–å¾—ã§ãã¾ã›ã‚“"
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "%s/%s ã‹ã‚‰èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:945
-#: plugins/sudoers/iolog.c:1020
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "予期ã—ãªã„ I/O イベント %d"
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1146 plugins/sudoers/log_client.c:1423
-#: plugins/sudoers/log_client.c:1491 plugins/sudoers/log_client.c:1530
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: 予期ã—ãªã„状態 %d"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1576
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "サーãƒã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–ã‚Šã¾ã—ãŸ: %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1589
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "サーãƒã‹ã‚‰ä¸­æ–­ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–ã‚Šã¾ã—ãŸ: %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1639
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: 予期ã—ãªã„ type_case ã®å€¤ %d"
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "サーãƒãƒ¼ã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
+msgid "host name does not match certificate"
+msgstr "ホストåãŒè¨¼æ˜Žæ›¸ã¨ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "æ—©ã™ãŽã‚‹ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端 (EOF)"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1800
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "サーãƒãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¤§ãéŽãŽã¾ã™: %u"
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "サーãƒãƒ¼ã¸ã®æ›¸ãè¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "å†é–‹ã™ã‚‹ãƒã‚¤ãƒ³ãƒˆã¨IOログIDを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "I/OãŒé€ã‚‰ã‚Œãªã„å ´åˆã¯å†é–‹ã™ã‚‹ãƒã‚¤ãƒ³ãƒˆã‚’設定ã§ãã¾ã›ã‚“"
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "ステータス %d ã§äºˆæœŸã›ã¬çµ‚了をã—ã¾ã—ãŸ"
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "サーãƒãƒ¼ã«é€ã‚‰ã‚ŒãŸçµŒéŽæ™‚é–“ [%lld, %ld]"
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "サーãƒãƒ¼ã‹ã‚‰å—ã‘å–ã£ãŸã‚³ãƒŸãƒƒãƒˆãƒã‚¤ãƒ³ãƒˆ [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:304
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "TLS ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒç™ºç”Ÿ"
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:326 plugins/sudoers/log_client.c:342
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "イベントを設定ã§ãã¾ã›ã‚“"
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "TLS接続ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
-#: logsrvd/tls_client.c:190
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "SSLオブジェクトを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
-#: logsrvd/tls_client.c:203
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "ソケットをSSLオブジェクトã«å–り付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
-#: logsrvd/tls_client.c:231
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr "TLS コンテキストをåˆæœŸåŒ–ã§ãã¾ã›ã‚“"
-#: logsrvd/tls_init.c:127 logsrvd/tls_init.c:135
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "TLS 1.2 æš—å·åŒ–スイートを %s ã«è¨­å®šã§ãã¾ã›ã‚“: %s"
-#: logsrvd/tls_init.c:155 logsrvd/tls_init.c:163
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "TLS 1.3 æš—å·åŒ–スイートを %s ã«è¨­å®šã§ãã¾ã›ã‚“: %s"
-#: logsrvd/tls_init.c:195 logsrvd/tls_init.c:216
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "ディフィー・ヘルマン パラメーターを設定ã§ãã¾ã›ã‚“: %s"
-#: logsrvd/tls_init.c:272
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr "TLS コンテキストを作æˆã§ãã¾ã›ã‚“: %s"
-#: logsrvd/tls_init.c:278
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "プロトコルã®æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ TLS 1.2 ã«è¨­å®šã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:979 plugins/sudoers/log_client.c:1028
-#: plugins/sudoers/log_client.c:1077 plugins/sudoers/log_client.c:1203
-#: plugins/sudoers/logging.c:552 plugins/sudoers/logging.c:649
-#: plugins/sudoers/logging.c:811 plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "時刻をå–å¾—ã§ãã¾ã›ã‚“"
@@ -1411,47 +1484,47 @@ msgstr ""
"èªè¨¼ã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ©ãƒ¼ã§ã™:\n"
"%s"
-#: plugins/sudoers/auth/kerb5.c:110
+#: 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:162
+#: plugins/sudoers/auth/kerb5.c:164
#, c-format
msgid "%s: unable to parse '%s': %s"
msgstr "%s: '%s' を構文解æžã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/auth/kerb5.c:171
+#: plugins/sudoers/auth/kerb5.c:173
#, c-format
msgid "%s: unable to resolve credential cache: %s"
msgstr "%s: 資格情報キャッシュ を解決ã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/auth/kerb5.c:220
+#: plugins/sudoers/auth/kerb5.c:222
#, c-format
msgid "%s: unable to allocate options: %s"
msgstr "%s: オプションを設定ã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/auth/kerb5.c:235
+#: plugins/sudoers/auth/kerb5.c:237
#, c-format
msgid "%s: unable to get credentials: %s"
msgstr "%s: 資格情報をå–å¾—ã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/auth/kerb5.c:248
+#: plugins/sudoers/auth/kerb5.c:250
#, c-format
msgid "%s: unable to initialize credential cache: %s"
msgstr "%s: 資格情報キャッシュ ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/auth/kerb5.c:251
+#: plugins/sudoers/auth/kerb5.c:253
#, c-format
msgid "%s: unable to store credential in cache: %s"
msgstr "%s: 資格情報をキャッシュã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/auth/kerb5.c:315
+#: plugins/sudoers/auth/kerb5.c:317
#, c-format
msgid "%s: unable to get host principal: %s"
msgstr "%s: ホストプリンシパルをå–å¾—ã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/auth/kerb5.c:329
+#: plugins/sudoers/auth/kerb5.c:331
#, c-format
msgid "%s: Cannot verify TGT! Possible attack!: %s"
msgstr "%s: TGT を検証ã§ãã¾ã›ã‚“! ãŠãらã攻撃ã§ã™!: %s"
@@ -1492,7 +1565,7 @@ msgstr "アカウントã®æœŸé™åˆ‡ã‚Œã€ã¾ãŸã¯ sudo 用㮠PAM 設定㫠\"a
msgid "PAM account management error: %s"
msgstr "PAM アカウント管ç†ã‚¨ãƒ©ãƒ¼ã§ã™: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:255
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "ã‚ãªãŸã¯ %s データベース内ã«å­˜åœ¨ã—ã¾ã›ã‚“"
@@ -1533,27 +1606,27 @@ msgstr "SecurID 用ã®ãƒ‘スコード長ãŒç„¡åŠ¹ã§ã™"
msgid "unable to initialize SIA session"
msgstr "SIA セッションをåˆæœŸåŒ–ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/auth/sudo_auth.c:134
+#: plugins/sudoers/auth/sudo_auth.c:135
msgid "invalid authentication methods"
msgstr "無効ãªèªè¨¼æ–¹æ³•"
-#: plugins/sudoers/auth/sudo_auth.c:136
+#: plugins/sudoers/auth/sudo_auth.c:137
msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication."
msgstr "無効ãªèªè¨¼æ–¹æ³•ãŒ sudo ã®ã‚³ãƒ³ãƒ‘イル時ã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„ã¾ã™! スタンドアローンã¨éžã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ¼ãƒ³èªè¨¼ã‚’混在ã•ã›ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
-#: plugins/sudoers/auth/sudo_auth.c:257 plugins/sudoers/auth/sudo_auth.c:309
+#: plugins/sudoers/auth/sudo_auth.c:258 plugins/sudoers/auth/sudo_auth.c:310
msgid "no authentication methods"
msgstr "èªè¨¼æ–¹æ³•ãŒã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/auth/sudo_auth.c:259
+#: plugins/sudoers/auth/sudo_auth.c:260
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:311
+#: plugins/sudoers/auth/sudo_auth.c:312
msgid "Unable to initialize authentication methods."
msgstr "èªè¨¼æ–¹æ³•ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“。"
-#: plugins/sudoers/auth/sudo_auth.c:482
+#: plugins/sudoers/auth/sudo_auth.c:486
msgid "Authentication methods:"
msgstr "èªè¨¼æ–¹æ³•:"
@@ -1565,17 +1638,17 @@ msgstr "監査æ¡ä»¶ã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "unable to commit audit record"
msgstr "監査レコードをコミットã§ãã¾ã›ã‚“"
-#: plugins/sudoers/check.c:263
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "講義ファイル %s ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼"
-#: plugins/sudoers/check.c:269
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "講義ファイル %s を無視ã—ã¾ã™: 通常ファイルã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/check.c:282
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1595,32 +1668,27 @@ msgstr ""
" #3) 大ã„ãªã‚‹åŠ›ã«ã¯å¤§ã„ãªã‚‹è²¬ä»»ãŒä¼´ã†ã“ã¨ã€‚\n"
"\n"
-#: plugins/sudoers/check.c:330 plugins/sudoers/check.c:340
-#: plugins/sudoers/sudoers.c:885 plugins/sudoers/sudoers.c:906
-#: plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "ä¸æ˜Žãª uid %u"
-#: plugins/sudoers/check_aliases.c:92
-#, c-format
-msgid "Error: %s:%d:%d: cycle in %s \"%s\""
-msgstr "エラー: %s:%d:%d: %s \"%s\" ã§ã‚¨ã‚¤ãƒªã‚¢ã‚¹å®šç¾©ãŒå¾ªç’°ã—ã¦ã„ã¾ã™"
-
-#: plugins/sudoers/check_aliases.c:93
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
-msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
-msgstr "警告: %s:%d:%d: %s \"%s\" ã§ã‚¨ã‚¤ãƒªã‚¢ã‚¹å®šç¾©ãŒå¾ªç’°ã—ã¦ã„ã¾ã™"
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
-#: plugins/sudoers/check_aliases.c:97
+#: plugins/sudoers/check_aliases.c:133
#, c-format
-msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
-msgstr "エラー: %s:%d:%d: %s \"%s\" ã¯å‚ç…§ã•ã‚Œã¦ã„ã‚‹ã®ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgid "cycle in %s \"%s\""
+msgstr "循環を発見 %s \"%s\""
-#: plugins/sudoers/check_aliases.c:98
+#: plugins/sudoers/check_aliases.c:136
#, c-format
-msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
-msgstr "警告: %s:%d:%d: %s \"%s\" ã¯å‚ç…§ã•ã‚Œã¦ã„ã‚‹ã®ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgid "%s \"%s\" referenced but not defined"
+msgstr "%s \"%s\" ã¯å‚ç…§ã•ã‚Œã¦ã„ã‚‹ã®ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
#: plugins/sudoers/cvtsudoers.c:209
#, c-format
@@ -1637,7 +1705,7 @@ msgstr "開始㮠order: %s: %s"
msgid "order padding: %s: %s"
msgstr "order ã®å¢—分: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:179
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "%s 文法ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d\n"
@@ -1657,14 +1725,14 @@ msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ãªã„出力形å¼ã§ã™ %s"
msgid "%s: input and output files must be different"
msgstr "%s: 入力ファイルã¨å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã¯åˆ¥ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:159
-#: plugins/sudoers/sudoers.c:205 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:261 plugins/sudoers/visudo.c:620
-#: plugins/sudoers/visudo.c:953
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "sudoers ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s: %s: %s: %s"
@@ -1689,28 +1757,18 @@ msgstr "無効ãªæŠ‘制ã®æŒ‡å®šã§ã™: %s"
msgid "invalid filter: %s"
msgstr "無効ãªãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã§ã™: %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:958
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, c-format
msgid "failed to parse %s file, unknown error"
msgstr "%s ファイルã®æ§‹æ–‡è§£æžã«å¤±æ•—ã—ã¾ã—ãŸã€‚ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã§ã™"
-#: plugins/sudoers/cvtsudoers.c:762
-#, c-format
-msgid "parse error in %s near line %d\n"
-msgstr "%s 内 %d 行付近ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ\n"
-
-#: plugins/sudoers/cvtsudoers.c:765
-#, c-format
-msgid "parse error in %s\n"
-msgstr "%s 内ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ\n"
-
-#: plugins/sudoers/cvtsudoers.c:1489 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "%s ã¸æ›¸ã込むã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: plugins/sudoers/cvtsudoers.c:1512
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1719,7 +1777,7 @@ msgstr ""
"%s - sudoers ファイル形å¼é–“ã§ã®å¤‰æ›ã‚’è¡Œã†\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1514
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -1760,31 +1818,31 @@ msgstr ""
" -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了ã™ã‚‹"
#: plugins/sudoers/cvtsudoers_csv.c:452 plugins/sudoers/cvtsudoers_csv.c:466
-#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:669
+#: plugins/sudoers/cvtsudoers_json.c:657 plugins/sudoers/cvtsudoers_json.c:672
#: plugins/sudoers/cvtsudoers_ldif.c:347 plugins/sudoers/cvtsudoers_ldif.c:360
-#: plugins/sudoers/ldap.c:515
+#: plugins/sudoers/ldap.c:510
msgid "unable to get GMT time"
msgstr "GMT 時刻をå–å¾—ã§ãã¾ã›ã‚“"
#: plugins/sudoers/cvtsudoers_csv.c:457 plugins/sudoers/cvtsudoers_csv.c:471
-#: plugins/sudoers/cvtsudoers_json.c:659 plugins/sudoers/cvtsudoers_json.c:674
+#: plugins/sudoers/cvtsudoers_json.c:662 plugins/sudoers/cvtsudoers_json.c:677
#: plugins/sudoers/cvtsudoers_ldif.c:352 plugins/sudoers/cvtsudoers_ldif.c:365
-#: plugins/sudoers/ldap.c:523
+#: plugins/sudoers/ldap.c:518
msgid "unable to format timestamp"
msgstr "タイムスタンプを書å¼æ•´å½¢ã§ãã¾ã›ã‚“"
#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:515
-#: plugins/sudoers/cvtsudoers_json.c:725 plugins/sudoers/defaults.c:190
+#: plugins/sudoers/cvtsudoers_json.c:728
#, c-format
msgid "%s:%d:%d: unknown defaults entry \"%s\""
msgstr "%s:%d:%d: 未知ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆé …ç›® \"%s\" ã§ã™"
-#: plugins/sudoers/cvtsudoers_ldif.c:649
+#: plugins/sudoers/cvtsudoers_ldif.c:661
#, c-format
msgid "too many sudoers entries, maximum %u"
msgstr "sudoers ã®é …ç›®ãŒå¤šã™ãŽã¾ã™ã€æœ€å¤§ã¯ %u ã§ã™ã€‚"
-#: plugins/sudoers/cvtsudoers_ldif.c:692
+#: plugins/sudoers/cvtsudoers_ldif.c:704
msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified."
msgstr "SUDOERS_BASE 環境変数ãŒè¨­å®šã•ã‚Œã¦ãŠã‚‰ãš -b オプションも指定ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -1829,805 +1887,790 @@ msgstr "%s:%d:%d: Defaults \"%s\" をホストã«ç‰¹æœ‰ã®ã‚‚ã®ã«ã§ãã¾ã›ã
msgid "%s:%d:%d: removing Defaults \"%s\" overridden by subsequent entries"
msgstr "%s:%d:%d: 後続ã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã§ä¸Šæ›¸ãã•ã‚ŒãŸ Defaults ã® \"%s\" を削除ã—ã¦ã„ã¾ã™"
-#: plugins/sudoers/cvtsudoers_merge.c:1080
+#: plugins/sudoers/cvtsudoers_merge.c:1088
#, c-format
msgid "%s:%d:%d: merging userspec into %s:%d:%d"
msgstr "%s:%d:%d: userspec ã‚’ %s:%d:%d ã«ä½µåˆã—ã¦ã„ã¾ã™"
-#: plugins/sudoers/cvtsudoers_merge.c:1174
+#: plugins/sudoers/cvtsudoers_merge.c:1182
#, c-format
msgid "%s:%d:%d: removing userspec overridden by subsequent entries"
msgstr "%s:%d:%d: 後続ã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã§ä¸Šæ›¸ãã•ã‚ŒãŸ userspec を削除ã—ã¦ã„ã¾ã™"
-#: plugins/sudoers/def_data.c:50
+#: plugins/sudoers/def_data.c:56
#, c-format
msgid "Syslog facility if syslog is being used for logging: %s"
msgstr "ログ記録時㫠syslog を使用ã™ã‚‹å ´åˆã® syslog ファシリティ: %s"
-#: plugins/sudoers/def_data.c:54
+#: plugins/sudoers/def_data.c:60
#, c-format
msgid "Syslog priority to use when user authenticates successfully: %s"
msgstr "ログ記録時㫠syslog を使用ã™ã‚‹å ´åˆã® syslog プライオリティ: %s"
-#: plugins/sudoers/def_data.c:58
+#: plugins/sudoers/def_data.c:64
#, c-format
msgid "Syslog priority to use when user authenticates unsuccessfully: %s"
msgstr "ユーザーèªè¨¼ã«å¤±æ•—ã—ãŸã¨æ™‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ syslog プライオリティ: %s"
-#: plugins/sudoers/def_data.c:62
+#: plugins/sudoers/def_data.c:68
msgid "Put OTP prompt on its own line"
msgstr "ワンタイムパスワード入力è¦æ±‚ã‚’ãã‚Œã®ã¿ã®è¡Œã«è¡¨ç¤ºã—ã¾ã™"
-#: plugins/sudoers/def_data.c:66
+#: plugins/sudoers/def_data.c:72
msgid "Ignore '.' in $PATH"
msgstr "$PATH 内ã«ã‚ã‚‹ '.' を無視ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:70
+#: plugins/sudoers/def_data.c:76
msgid "Always send mail when sudo is run"
msgstr "sudo を実行ã—ãŸæ™‚ã«ã€å¸¸ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:74
+#: plugins/sudoers/def_data.c:80
msgid "Send mail if user authentication fails"
msgstr "ユーザーèªè¨¼ã«å¤±æ•—ã—ãŸå ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:78
+#: plugins/sudoers/def_data.c:84
msgid "Send mail if the user is not in sudoers"
msgstr "ユーザー他 sudoers 内ã«å­˜åœ¨ã—ãªã„å ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:82
+#: plugins/sudoers/def_data.c:88
msgid "Send mail if the user is not in sudoers for this host"
msgstr "ユーザーãŒã“ã®ãƒ›ã‚¹ãƒˆç”¨ã® sudoers 内ã«å­˜åœ¨ã—ãªã„å ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:86
+#: plugins/sudoers/def_data.c:92
msgid "Send mail if the user is not allowed to run a command"
msgstr "ユーザーãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„コマンドを実行ã—よã†ã¨ã—ãŸå ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:90
+#: plugins/sudoers/def_data.c:96
msgid "Send mail if the user tries to run a command"
msgstr "ユーザーãŒãƒžãƒ³ãƒ‰ã‚’実行ã—よã†ã¨ã—ãŸå ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:94
+#: plugins/sudoers/def_data.c:100
msgid "Use a separate timestamp for each user/tty combo"
msgstr "ユーザー/tty ã®çµ„ã¿åˆã‚ã›ã”ã¨ã«åˆ†é›¢ã—ãŸã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を使用ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:98
+#: plugins/sudoers/def_data.c:104
msgid "Lecture user the first time they run sudo"
msgstr "ユーザーãŒæœ€åˆã« sudo を実行ã—ãŸæ™‚ã«è¬›ç¾©ã‚’è¡Œã†"
-#: plugins/sudoers/def_data.c:102
+#: plugins/sudoers/def_data.c:108
#, c-format
msgid "File containing the sudo lecture: %s"
msgstr "sudo ã®è¬›ç¾©ãŒå«ã¾ã‚Œã¦ã„るファイル: %s"
-#: plugins/sudoers/def_data.c:106
+#: plugins/sudoers/def_data.c:112
msgid "Require users to authenticate by default"
msgstr "デフォルトã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒèªè¨¼ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’å¿…è¦ã¨ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:110
+#: plugins/sudoers/def_data.c:116
msgid "Root may run sudo"
msgstr "root ㌠sudo を実行ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/def_data.c:114
+#: plugins/sudoers/def_data.c:120
msgid "Log the hostname in the (non-syslog) log file"
msgstr " ログファイル (syslog 以外) ã«è¨˜éŒ²ã™ã‚‹æ™‚ã«ãƒ›ã‚¹ãƒˆåã‚’å«ã‚ã¾ã™"
-#: plugins/sudoers/def_data.c:118
+#: plugins/sudoers/def_data.c:124
msgid "Log the year in the (non-syslog) log file"
msgstr "ログファイル (syslog 以外) ã«è¨˜éŒ²ã™ã‚‹æ™‚ã«å¹´æƒ…報をå«ã‚ã¾ã™"
-#: plugins/sudoers/def_data.c:122
+#: plugins/sudoers/def_data.c:128
msgid "If sudo is invoked with no arguments, start a shell"
msgstr "sudo を引数無ã—ã§èµ·å‹•ã—ãŸå ´åˆã€ã‚·ã‚§ãƒ«ã‚’開始ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:126
+#: plugins/sudoers/def_data.c:132
msgid "Set $HOME to the target user when starting a shell with -s"
msgstr "シェルを -s ã§é–‹å§‹ã—ãŸæ™‚ã« $HOME を変更後ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¨­å®šã—ã¾ã™"
-#: plugins/sudoers/def_data.c:130
+#: plugins/sudoers/def_data.c:136
msgid "Always set $HOME to the target user's home directory"
msgstr "$HOME を常ã«å¤‰æ›´å¾Œã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¨­å®šã—ã¾ã™"
-#: plugins/sudoers/def_data.c:134
+#: plugins/sudoers/def_data.c:140
msgid "Allow some information gathering to give useful error messages"
msgstr "å½¹ã«ç«‹ã¤ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ãŸã‚ã«ã„ãã¤ã‹ã®æƒ…報をåŽé›†ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:138
+#: plugins/sudoers/def_data.c:144
msgid "Require fully-qualified hostnames in the sudoers file"
msgstr "sudoers ファイルã«å®Œå…¨ä¿®é£¾ãƒ›ã‚¹ãƒˆå (FQDN) ã‚’è¦æ±‚ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:142
+#: plugins/sudoers/def_data.c:148
msgid "Insult the user when they enter an incorrect password"
msgstr "é–“é•ã£ãŸãƒ‘スワードを入力ã—ãŸæ™‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’侮辱ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:146
+#: plugins/sudoers/def_data.c:152
msgid "Only allow the user to run sudo if they have a tty"
msgstr "tty ãŒã‚ã‚‹å ´åˆã®ã¿ sudo ã®å®Ÿè¡Œã‚’許å¯ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:150
+#: plugins/sudoers/def_data.c:156
msgid "Visudo will honor the EDITOR environment variable"
msgstr "visudo ㌠EDITOR 環境変数を尊é‡ã—ã¦ä½¿ç”¨ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:154
+#: plugins/sudoers/def_data.c:160
msgid "Prompt for root's password, not the users's"
msgstr "ユーザーã®ãƒ‘スワードã§ã¯ãªãã€root ã®ãƒ‘スワードã®å…¥åŠ›ã‚’è¦æ±‚ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:158
+#: plugins/sudoers/def_data.c:164
msgid "Prompt for the runas_default user's password, not the users's"
msgstr "ユーザーã®ãƒ‘スワードã§ã¯ãªã〠runas_default ユーザーã®ãƒ‘スワードã®å…¥åŠ›ã‚’è¦æ±‚ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:162
+#: plugins/sudoers/def_data.c:168
msgid "Prompt for the target user's password, not the users's"
msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ‘スワードã§ã¯ãªãã€å¤‰æ›´å…ˆãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ‘スワードã®å…¥åŠ›ã‚’è¦æ±‚ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:166
+#: plugins/sudoers/def_data.c:172
msgid "Apply defaults in the target user's login class if there is one"
msgstr "変更先ユーザーã®ãƒ­ã‚°ã‚¤ãƒ³ã‚¯ãƒ©ã‚¹ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãŒå­˜åœ¨ã™ã‚‹å ´åˆã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚’é©ç”¨ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:170
+#: plugins/sudoers/def_data.c:176
msgid "Set the LOGNAME and USER environment variables"
msgstr "LOGNAME ãŠã‚ˆã³ USER 環境変数を設定ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:174
+#: plugins/sudoers/def_data.c:180
msgid "Only set the effective uid to the target user, not the real uid"
msgstr "実効ユーザーIDã®ã¿å¤‰æ›´å…ˆãƒ¦ãƒ¼ã‚¶ãƒ¼ã® UID ã«è¨­å®šã—ã€å®Ÿãƒ¦ãƒ¼ã‚¶ãƒ¼IDã¯å¤‰æ›´ã—ãªã„"
-#: plugins/sudoers/def_data.c:178
+#: plugins/sudoers/def_data.c:184
msgid "Don't initialize the group vector to that of the target user"
msgstr "グループベクトルを変更先ユーザーã®å€¤ã§åˆæœŸåŒ–ã—ãªã„"
-#: plugins/sudoers/def_data.c:182
+#: plugins/sudoers/def_data.c:188
#, c-format
msgid "Length at which to wrap log file lines (0 for no wrap): %u"
msgstr "ログファイルã®è¡Œé ­ã‹ã‚‰æ”¹è¡Œã¾ã§ã®é•·ã• (0 ã®å ´åˆã¯æ”¹è¡Œã—ãªã„): %u"
-#: plugins/sudoers/def_data.c:186
+#: plugins/sudoers/def_data.c:192
#, c-format
msgid "Authentication timestamp timeout: %.1f minutes"
msgstr "èªè¨¼ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤: %.1f 分"
-#: plugins/sudoers/def_data.c:190
+#: plugins/sudoers/def_data.c:196
#, c-format
msgid "Password prompt timeout: %.1f minutes"
msgstr "パスワード入力è¦æ±‚ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤: %.1f 分"
-#: plugins/sudoers/def_data.c:194
+#: plugins/sudoers/def_data.c:200
#, c-format
msgid "Number of tries to enter a password: %u"
msgstr "パスワード入力ã®è©¦è¡Œå›žæ•°: %u"
-#: plugins/sudoers/def_data.c:198
+#: plugins/sudoers/def_data.c:204
#, c-format
msgid "Umask to use or 0777 to use user's: 0%o"
msgstr "使用ã™ã‚‹ umask 値 (0777 ã®å ´åˆã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¨­å®šå€¤ã‚’使用ã—ã¾ã™): 0%o"
-#: plugins/sudoers/def_data.c:202
+#: plugins/sudoers/def_data.c:208
#, c-format
msgid "Path to log file: %s"
msgstr "ログファイルã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:206
+#: plugins/sudoers/def_data.c:212
#, c-format
msgid "Path to mail program: %s"
msgstr "メールプログラムã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:210
+#: plugins/sudoers/def_data.c:216
#, c-format
msgid "Flags for mail program: %s"
msgstr "メールプログラムã®å¼•æ•°ãƒ•ãƒ©ã‚°: %s"
-#: plugins/sudoers/def_data.c:214
+#: plugins/sudoers/def_data.c:220
#, c-format
msgid "Address to send mail to: %s"
msgstr "メールã®é€ä¿¡å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹: %s"
-#: plugins/sudoers/def_data.c:218
+#: plugins/sudoers/def_data.c:224
#, c-format
msgid "Address to send mail from: %s"
msgstr "メールã®é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹: %s"
-#: plugins/sudoers/def_data.c:222
+#: plugins/sudoers/def_data.c:228
#, c-format
msgid "Subject line for mail messages: %s"
msgstr "メールã®ä»¶å (Subject) è¡Œ: %s"
-#: plugins/sudoers/def_data.c:226
+#: plugins/sudoers/def_data.c:232
#, c-format
msgid "Incorrect password message: %s"
msgstr "パスワードを間é•ã£ãŸæ™‚ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: %s"
-#: plugins/sudoers/def_data.c:230
+#: plugins/sudoers/def_data.c:236
#, c-format
msgid "Path to lecture status dir: %s"
msgstr "å—講状æ³ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:234
+#: plugins/sudoers/def_data.c:240
#, c-format
msgid "Path to authentication timestamp dir: %s"
msgstr "èªè¨¼ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ディレクトリã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:238
+#: plugins/sudoers/def_data.c:244
#, c-format
msgid "Owner of the authentication timestamp dir: %s"
msgstr "èªè¨¼ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ディレクトリã®æ‰€æœ‰è€…: %s"
-#: plugins/sudoers/def_data.c:242
+#: plugins/sudoers/def_data.c:248
#, c-format
msgid "Users in this group are exempt from password and PATH requirements: %s"
msgstr "パスワード入力㨠PATH ã®è¦æ±‚ãŒå…除ã•ã‚Œã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼: %s"
-#: plugins/sudoers/def_data.c:246
+#: plugins/sudoers/def_data.c:252
#, c-format
msgid "Default password prompt: %s"
msgstr "パスワード入力è¦æ±‚時ã«è¡¨ç¤ºã•ã‚Œã‚‹æ–‡å­—列: %s"
-#: plugins/sudoers/def_data.c:250
+#: plugins/sudoers/def_data.c:256
msgid "If set, passprompt will override system prompt in all cases."
msgstr "設定ã—ãŸå ´åˆã€ã™ã¹ã¦ã®å ´åˆã«ãŠã„㦠passprompt ãŒã‚·ã‚¹ãƒ†ãƒ ã®å…¥åŠ›è¦æ±‚表示を上書ãã—ã¾ã™"
-#: plugins/sudoers/def_data.c:254
+#: plugins/sudoers/def_data.c:260
#, c-format
msgid "Default user to run commands as: %s"
msgstr "コマンドを実行ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®å¤‰æ›´å…ˆãƒ¦ãƒ¼ã‚¶ãƒ¼: %s"
-#: plugins/sudoers/def_data.c:258
+#: plugins/sudoers/def_data.c:264
#, c-format
msgid "Value to override user's $PATH with: %s"
msgstr "ユーザー㮠$PATH を上書ãã™ã‚‹æ™‚ã®å€¤: %s"
-#: plugins/sudoers/def_data.c:262
+#: plugins/sudoers/def_data.c:268
#, c-format
msgid "Path to the editor for use by visudo: %s"
msgstr "visudo ã§ä½¿ç”¨ã•ã‚Œã‚‹ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:266
+#: plugins/sudoers/def_data.c:272
#, c-format
msgid "When to require a password for 'list' pseudocommand: %s"
msgstr "'list' 疑似コマンド使用ã™ã‚‹ãŸã‚ã«ãƒ‘スワードをè¦æ±‚ã•ã‚Œã‚‹æ™‚: %s"
-#: plugins/sudoers/def_data.c:270
+#: plugins/sudoers/def_data.c:276
#, c-format
msgid "When to require a password for 'verify' pseudocommand: %s"
msgstr "'verify' 疑似コマンドを使用ã™ã‚‹ãŸã‚ã«ãƒ‘スワードをè¦æ±‚ã•ã‚Œã‚‹æ™‚: %s"
-#: plugins/sudoers/def_data.c:274
+#: plugins/sudoers/def_data.c:280
msgid "Preload the sudo_noexec library which replaces the exec functions"
msgstr "exec 関数群を置ãæ›ãˆã‚‹ sudo_noexec ライブラリ事å‰ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™"
# do ã¯ãŸã¶ã‚“強調㮠do
-#: plugins/sudoers/def_data.c:278
+#: plugins/sudoers/def_data.c:284
msgid "If LDAP directory is up, do we ignore local sudoers file"
msgstr "LDAP ディレクトリãŒå®Ÿè¡Œä¸­ã®å ´åˆã€ãƒ­ãƒ¼ã‚«ãƒ«ã® sudoers ファイルを無視ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:282
+#: plugins/sudoers/def_data.c:288
#, c-format
msgid "File descriptors >= %d will be closed before executing a command"
msgstr "%d 以上ã®å€¤ã‚’ã‚‚ã¤ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã‚’コマンド実行å‰ã«é–‰ã˜ã¾ã™"
-#: plugins/sudoers/def_data.c:286
+#: plugins/sudoers/def_data.c:292
msgid "If set, users may override the value of \"closefrom\" with the -C option"
msgstr "設定ã—ã¦ã‚‚ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒ \"closefrom\" ã®å€¤ã‚’ -C オプションã§ä¸Šæ›¸ãã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/def_data.c:290
+#: plugins/sudoers/def_data.c:296
msgid "Allow users to set arbitrary environment variables"
msgstr "ユーザーãŒä»»æ„ã®ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:294
+#: plugins/sudoers/def_data.c:300
msgid "Reset the environment to a default set of variables"
msgstr "環境変数ã®é›†åˆã‚’デフォルトã«è¨­å®šã—ã¾ã™"
-#: plugins/sudoers/def_data.c:298
+#: plugins/sudoers/def_data.c:304
msgid "Environment variables to check for safety:"
msgstr "安全性ã®ç¢ºèªã‚’è¡Œã†ç’°å¢ƒå¤‰æ•°:"
-#: plugins/sudoers/def_data.c:302
+#: plugins/sudoers/def_data.c:308
msgid "Environment variables to remove:"
msgstr "削除ã™ã‚‹ç’°å¢ƒå¤‰æ•°:"
-#: plugins/sudoers/def_data.c:306
+#: plugins/sudoers/def_data.c:312
msgid "Environment variables to preserve:"
msgstr "ä¿è­·ã™ã‚‹ç’°å¢ƒå¤‰æ•°:"
-#: plugins/sudoers/def_data.c:310
+#: plugins/sudoers/def_data.c:316
#, c-format
msgid "SELinux role to use in the new security context: %s"
msgstr "æ–°ã—ã„セキュリティコンテキスト内ã§ä½¿ç”¨ã™ã‚‹ SELinux ã®å½¹å‰²: %s"
-#: plugins/sudoers/def_data.c:314
+#: plugins/sudoers/def_data.c:320
#, c-format
msgid "SELinux type to use in the new security context: %s"
msgstr "æ–°ã—ã„セキュリティコンテキスト内ã§ä½¿ç”¨ã™ã‚‹ SELinux ã®ã‚¿ã‚¤ãƒ—: %s"
-#: plugins/sudoers/def_data.c:318
+#: plugins/sudoers/def_data.c:324
#, c-format
msgid "Path to the sudo-specific environment file: %s"
msgstr "sudo 固有ã®ç’°å¢ƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:322
+#: plugins/sudoers/def_data.c:328
#, c-format
msgid "Path to the restricted sudo-specific environment file: %s"
msgstr "制é™ä»˜ãsudo 固有ã®ç’°å¢ƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:326
+#: plugins/sudoers/def_data.c:332
#, c-format
msgid "Locale to use while parsing sudoers: %s"
msgstr "sudoers を構文解æžã™ã‚‹æ™‚ã«ä½¿ç”¨ã™ã‚‹ãƒ­ã‚±ãƒ¼ãƒ«: %s"
-#: plugins/sudoers/def_data.c:330
+#: plugins/sudoers/def_data.c:336
msgid "Allow sudo to prompt for a password even if it would be visible"
msgstr "パスワードãŒè¡¨ç¤ºã•ã‚Œã¦ã—ã¾ã†çŠ¶æ…‹ã§ã‚ã£ã¦ã‚‚ sudo ãŒãƒ‘スワード入力をè¦æ±‚ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:334
+#: plugins/sudoers/def_data.c:340
msgid "Provide visual feedback at the password prompt when there is user input"
msgstr "パスワード入力è¦æ±‚ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å…¥åŠ›ãŒã‚ã£ãŸæ™‚ã«ã€è¦–覚的ãªãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’æä¾›ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:338
+#: plugins/sudoers/def_data.c:344
msgid "Use faster globbing that is less accurate but does not access the filesystem"
msgstr "ファイルシステムã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãªã„ãŒã‚ˆã‚Šæ­£ç¢ºã§ã¯ç„¡ã„ã€ç´ æ—©ã„一致確èªå‡¦ç†ã‚’è¡Œã„ã¾ã™"
-#: plugins/sudoers/def_data.c:342
+#: plugins/sudoers/def_data.c:348
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:346
+#: plugins/sudoers/def_data.c:352
msgid "Log user's input for the command being run"
msgstr "コマンドを実行ã—ãŸæ™‚ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å…¥åŠ›ã‚’ログã«è¨˜éŒ²ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:350
+#: plugins/sudoers/def_data.c:356
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "端末ã«æŽ¥ç¶šã—ã¦ã„ãªã„å ´åˆã«ã‚³ãƒžãƒ³ãƒ‰ã®æ¨™æº–入力をログã«è¨˜éŒ²ã—ã¾ã™"
+
+#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "コマンドを実行ã—ãŸæ™‚ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ç«¯æœ«å…¥åŠ›ã‚’ログã«è¨˜éŒ²ã—ã¾ã™"
+
+#: plugins/sudoers/def_data.c:364
msgid "Log the output of the command being run"
msgstr "コマンドを実行ã—ãŸæ™‚ã®å‡ºåŠ›ã‚’ログã«è¨˜éŒ²ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:354
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "端末ã«æŽ¥ç¶šã—ã¦ã„ãªã„å ´åˆã«ã‚³ãƒžãƒ³ãƒ‰ã®æ¨™æº–出力をログã«è¨˜éŒ²ã—ã¾ã™"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "端末ã«æŽ¥ç¶šã—ã¦ã„ãªã„å ´åˆã«ã‚³ãƒžãƒ³ãƒ‰ã®æ¨™æº–エラー出力をログã«è¨˜éŒ²ã—ã¾ã™"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "コマンドを実行ã—ãŸæ™‚ã®ç«¯æœ«å‡ºåŠ›ã‚’ログã«è¨˜éŒ²ã—ã¾ã™"
+
+#: plugins/sudoers/def_data.c:380
msgid "Compress I/O logs using zlib"
msgstr "I/O ログを zlib を使用ã—ã¦åœ§ç¸®ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:358
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "常ã«ç–‘ä¼¼ tty 内ã§ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:362
+#: plugins/sudoers/def_data.c:388
#, c-format
msgid "Plugin for non-Unix group support: %s"
msgstr "UNIX 以外ã®ã‚°ãƒ«ãƒ¼ãƒ—をサãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ãƒ—ラグインã§ã™:%s"
-#: plugins/sudoers/def_data.c:366
+#: plugins/sudoers/def_data.c:392
#, c-format
msgid "Directory in which to store input/output logs: %s"
msgstr "入出力 (I/O) ログをä¿å­˜ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã™:%s"
-#: plugins/sudoers/def_data.c:370
+#: plugins/sudoers/def_data.c:396
#, c-format
msgid "File in which to store the input/output log: %s"
msgstr "入出力 (I/O) ログをä¿å­˜ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™:%s"
-#: plugins/sudoers/def_data.c:374
+#: plugins/sudoers/def_data.c:400
msgid "Add an entry to the utmp/utmpx file when allocating a pty"
msgstr "pty を割り当ã¦ãŸæ™‚ã« utmp/utmpx ファイルã«è¨˜éŒ²ã‚’加ãˆã¾ã™"
-#: plugins/sudoers/def_data.c:378
+#: plugins/sudoers/def_data.c:404
msgid "Set the user in utmp to the runas user, not the invoking user"
msgstr "utmp ã«è¨˜éŒ²ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ã€å®Ÿè¡Œã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ãªãã€å¤‰æ›´å¾Œã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:382
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "許容ã•ã‚Œã‚‹æ¨©é™ã®é›†åˆ: %s"
-#: plugins/sudoers/def_data.c:386
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "制é™ã•ã‚Œã‚‹æ¨©é™ã®é›†åˆ: %s"
-#: plugins/sudoers/def_data.c:390
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr "コマンドを pty ã§ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã™ã‚‹"
-#: plugins/sudoers/def_data.c:394
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "利用ã™ã‚‹ PAM サービスå: %s"
-#: plugins/sudoers/def_data.c:398
+#: plugins/sudoers/def_data.c:424
#, c-format
msgid "PAM service name to use for login shells: %s"
msgstr "ログインシェルã§åˆ©ç”¨ã™ã‚‹ PAM サービスå: %s"
-#: plugins/sudoers/def_data.c:402
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "sudo ㌠-A オプション付ãã§å®Ÿè¡Œã•ã‚ŒãŸã¨ãã«ä½¿ã† PAM サービスå: %s"
-#: plugins/sudoers/def_data.c:406
+#: plugins/sudoers/def_data.c:432
msgid "Attempt to establish PAM credentials for the target user"
msgstr "ターゲットユーザー㮠PAM 資格情報ã«ã‚ˆã‚‹èªè¨¼ã‚’試ã¿ã‚‹"
-#: plugins/sudoers/def_data.c:410
+#: plugins/sudoers/def_data.c:436
msgid "Create a new PAM session for the command to run in"
msgstr "実行ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã®ãŸã‚ã«æ–°ã—ã„ PAM セッションを生æˆã™ã‚‹"
-#: plugins/sudoers/def_data.c:414
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "PAM アカウント検証管ç†ã‚’実行ã—ã¦ã„ã¾ã™"
-#: plugins/sudoers/def_data.c:418
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "I/O ログシーケンス番å·ã®æœ€å¤§å€¤: %s"
-#: plugins/sudoers/def_data.c:422
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "sudoers ã®ãƒãƒƒãƒˆã‚°ãƒ«ãƒ¼ãƒ—サãƒãƒ¼ãƒˆã‚’有効ã«ã™ã‚‹"
-#: plugins/sudoers/def_data.c:426
+#: plugins/sudoers/def_data.c:452
msgid "Check parent directories for writability when editing files with sudoedit"
msgstr "ファイルを sudoedit ã§ç·¨é›†ã™ã‚‹ã¨ãã«è¦ªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæ›¸ãè¾¼ã¿å¯èƒ½ã‹ç¢ºã‹ã‚ã‚‹"
-#: plugins/sudoers/def_data.c:430
+#: plugins/sudoers/def_data.c:456
msgid "Follow symbolic links when editing files with sudoedit"
msgstr "ファイルを sudoedit ã§ç·¨é›†ã™ã‚‹ã¨ãã«ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’追ã†"
-#: plugins/sudoers/def_data.c:434
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr "ä¸æ˜Žãªã‚·ã‚¹ãƒ†ãƒ ã‚°ãƒ«ãƒ¼ãƒ—ã«ã¤ã„ã¦ã€ã‚°ãƒ«ãƒ¼ãƒ—プラグインã«å•ã„åˆã‚ã›ã‚‹"
-#: plugins/sudoers/def_data.c:438
+#: plugins/sudoers/def_data.c:464
msgid "Match netgroups based on the entire tuple: user, host and domain"
msgstr "ãƒãƒƒãƒˆã‚°ãƒ«ãƒ¼ãƒ—ã«ã¤ã„ã¦ã€ã™ã¹ã¦ã®ã‚¿ãƒ—ル(ユーザーã€ãƒ›ã‚¹ãƒˆã€ãƒ‰ãƒ¡ã‚¤ãƒ³ï¼‰ã‚’基ã«åˆ¤å®šã™ã‚‹"
-#: plugins/sudoers/def_data.c:442
+#: plugins/sudoers/def_data.c:468
msgid "Allow commands to be run even if sudo cannot write to the audit log"
msgstr "監査ログファイルã¸ã®æ›¸ãè¾¼ã¿ãŒã§ããªãã¦ã‚‚ã€ã‚³ãƒžãƒ³ãƒ‰ã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹"
-#: plugins/sudoers/def_data.c:446
+#: plugins/sudoers/def_data.c:472
msgid "Allow commands to be run even if sudo cannot write to the I/O log"
msgstr "I/O ログファイルã¸ã®æ›¸ãè¾¼ã¿ãŒã§ããªãã¦ã‚‚ã€ã‚³ãƒžãƒ³ãƒ‰ã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹"
-#: plugins/sudoers/def_data.c:450
+#: plugins/sudoers/def_data.c:476
msgid "Allow commands to be run even if sudo cannot write to the log file"
msgstr "ログファイルã¸ã®æ›¸ãè¾¼ã¿ãŒã§ããªãã¦ã‚‚ã€ã‚³ãƒžãƒ³ãƒ‰ã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹"
-#: plugins/sudoers/def_data.c:454
+#: plugins/sudoers/def_data.c:480
msgid "Resolve groups in sudoers and match on the group ID, not the name"
msgstr "グループã®ç…§åˆã‚’ sudoers ã®ä¸­ã§è¡Œã„ã€ã‚°ãƒ«ãƒ¼ãƒ—åã§ãªãグループIDを用ã„ã‚‹"
-#: plugins/sudoers/def_data.c:458
+#: plugins/sudoers/def_data.c:484
#, 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:462
+#: plugins/sudoers/def_data.c:488
#, c-format
msgid "User that will own the I/O log files: %s"
msgstr "I/O ログã®æ‰€æœ‰è€…ã¨ãªã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼: %s"
-#: plugins/sudoers/def_data.c:466
+#: plugins/sudoers/def_data.c:492
#, c-format
msgid "Group that will own the I/O log files: %s"
msgstr "I/O ログã®æ‰€æœ‰è€…ã¨ãªã‚‹ã‚°ãƒ«ãƒ¼ãƒ—: %s"
-#: plugins/sudoers/def_data.c:470
+#: plugins/sudoers/def_data.c:496
#, 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:474
+#: plugins/sudoers/def_data.c:500
#, c-format
msgid "Execute commands by file descriptor instead of by path: %s"
msgstr "コマンドã®å®Ÿè¡Œæ™‚ã«ãƒ‘スã§ãªãファイル記述å­ã‚’使ã†: %s"
-#: plugins/sudoers/def_data.c:478
+#: plugins/sudoers/def_data.c:504
msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
msgstr "sudoers ã®ä¸­ã®æœªçŸ¥ã® Defaults エントリーを無視ã—ã€è­¦å‘Šã‚’出ã•ãªã„"
-#: plugins/sudoers/def_data.c:482
+#: plugins/sudoers/def_data.c:508
#, c-format
msgid "Time in seconds after which the command will be terminated: %u"
msgstr "コマンドãŒä¸­æ–­ã•ã‚Œã‚‹ã¾ã§ã®çµŒéŽæ™‚間を秒ã§æŒ‡å®šã™ã‚‹: %u"
-#: plugins/sudoers/def_data.c:486
+#: plugins/sudoers/def_data.c:512
msgid "Allow the user to specify a timeout on the command line"
msgstr "ユーザーãŒã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡Œã®åˆ¶é™æ™‚間をコマンドラインã§æŒ‡å®šã§ãるよã†ã«ã™ã‚‹"
-#: plugins/sudoers/def_data.c:490
+#: plugins/sudoers/def_data.c:516
msgid "Flush I/O log data to disk immediately instead of buffering it"
msgstr "I/O ログã®ãƒ‡ãƒ¼ã‚¿ã‚’ãƒãƒƒãƒ•ã‚¡ã›ãšã«ã€å³ãƒ‡ã‚£ã‚¹ã‚¯ã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹"
-#: plugins/sudoers/def_data.c:494
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr "syslog ã¸ã®ãƒ­ã‚°è¨˜éŒ²æ™‚ã«ãƒ—ロセスIDã‚’å«ã‚ã‚‹"
-#: plugins/sudoers/def_data.c:498
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "èªè¨¼ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã®ã‚¿ã‚¤ãƒ—: %s"
-#: plugins/sudoers/def_data.c:502
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "èªè¨¼å¤±æ•—メッセージ: %s"
-#: plugins/sudoers/def_data.c:506
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "ユーザーåã®æ¤œç´¢ã§å¤§æ–‡å­—å°æ–‡å­—ã‚’åŒä¸€è¦–ã™ã‚‹"
-#: plugins/sudoers/def_data.c:510
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "グループåã®æ¤œç´¢ã§å¤§æ–‡å­—å°æ–‡å­—ã‚’åŒä¸€è¦–ã™ã‚‹"
-#: plugins/sudoers/def_data.c:514
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr "コマンド㌠sudoers ã§è¨±å¯ã•ã‚ŒãŸå ´åˆã«ãƒ­ã‚°ã«è¨˜éŒ²ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:518
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "コマンド㌠sudoers ã§æ‹’å¦ã•ã‚ŒãŸå ´åˆã«ãƒ­ã‚°ã«è¨˜éŒ²ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:522
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "オプショナルãªãƒãƒ¼ãƒˆã§æŽ¥ç¶šã™ã‚‹ Sudo ログサーãƒãƒ¼"
-#: plugins/sudoers/def_data.c:526
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Sudo ログサーãƒãƒ¼ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã€å˜ä½ã¯ç§’: %u"
-#: plugins/sudoers/def_data.c:530
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "ログサーãƒãƒ¼ã«æŽ¥ç¶šã—ãŸã‚½ã‚±ãƒƒãƒˆã§ SO_KEEPALIVE ソケットオプションを有効ã«ã™ã‚‹"
-#: plugins/sudoers/def_data.c:534
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "èªè¨¼ã‚µãƒ¼ãƒãƒ¼ã® CA ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:538
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "sudoers ã®è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:542
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "sudoers ã®ãƒ—ライベートéµãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:546
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "ログサーãƒãƒ¼ã®è¨¼æ˜Žæ›¸ãŒæœ‰åŠ¹ã‹æ¤œè¨¼ã™ã‚‹"
-#: plugins/sudoers/def_data.c:550
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "未知㮠runas ユーザーãŠã‚ˆã³/ã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ— ID を使ã†ã“ã¨ã‚’許å¯ã™ã‚‹"
-#: plugins/sudoers/def_data.c:554
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "有効ãªã‚·ã‚§ãƒ«ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ã«ã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡Œã‚’許å¯ã™ã‚‹"
-#: plugins/sudoers/def_data.c:558
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "PAMã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ sudo を実行ã—ã¦ã„るユーザーã«è¨­å®š"
-#: plugins/sudoers/def_data.c:562
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "PAMã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ›ã‚¹ãƒˆã‚’ローカルホストåã«è¨­å®š"
-#: plugins/sudoers/def_data.c:566
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "コマンド実行å‰ã«å¤‰æ›´ã™ã‚‹ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª: %s"
-#: plugins/sudoers/def_data.c:570
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "コマンド実行å‰ã«å¤‰æ›´ã™ã‚‹ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª: %s"
-#: plugins/sudoers/def_data.c:574
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "生æˆã™ã‚‹ãƒ­ã‚°ã®æ›¸å¼: %s"
-#: plugins/sudoers/def_data.c:578
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "SELinux RBAC ã®ã‚µãƒãƒ¼ãƒˆã‚’有効ã«ã™ã‚‹"
-#: plugins/sudoers/def_data.c:582
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "sudo ãŒæœ€åˆã«å®Ÿè¡Œã•ã‚ŒãŸæ™‚ã«ä½œæˆã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス: %s"
-#: plugins/sudoers/def_data.c:586
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "ã“れ以é™ã®ã‚³ãƒžãƒ³ãƒ‰ã«å‰²ã‚Šè¾¼ã¿ã€sudoers ã«ã‚ˆã‚‹åˆ¶é™ã‚’é©ç”¨ã™ã‚‹"
-#: plugins/sudoers/def_data.c:590
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr "コマンドãŒå®Ÿè¡Œã—ãŸã‚µãƒ–コマンドをログã«è¨˜éŒ²ã™ã‚‹"
-#: plugins/sudoers/def_data.c:594
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr "コマンドを実行ã—ãŸå¾Œã®çµ‚了ステータスをログã«è¨˜éŒ²ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:598
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "割り込ã¿ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸­ã§ç¶šãコマンドã«ã¯èªè¨¼ãŒå¿…è¦ã§ã™"
-#: plugins/sudoers/def_data.c:602
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "割り込ã¾ã‚ŒãŸã‚³ãƒžãƒ³ãƒ‰ãŒ setuid ã¾ãŸã¯ setgid プログラムを実行ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™"
-#: plugins/sudoers/def_data.c:606
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "プロセスã®ã‚¢ãƒ‰ãƒ¬ã‚¹ç©ºé–“ã®æœ€å¤§å€¤(ãƒã‚¤ãƒˆå˜ä½): %s"
-#: plugins/sudoers/def_data.c:610
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "コアダンプファイルã®æœ€å¤§ã‚µã‚¤ã‚º(ãƒã‚¤ãƒˆå˜ä½): %s"
-#: plugins/sudoers/def_data.c:614
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "プロセスãŒä½¿ç”¨ã™ã‚‹CPU時間ã®æœ€å¤§å€¤(秒å˜ä½): %s"
-#: plugins/sudoers/def_data.c:618
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "プロセスã®ãƒ‡ãƒ¼ã‚¿ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºã®æœ€å¤§å€¤(ãƒã‚¤ãƒˆå˜ä½): %s"
-#: plugins/sudoers/def_data.c:622
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "プロセスãŒä½œæˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã®æœ€å¤§å€¤(ãƒã‚¤ãƒˆå˜ä½): %s"
-#: plugins/sudoers/def_data.c:626
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "プロセスãŒä½œã‚‹ãƒ­ãƒƒã‚¯ã®æœ€å¤§æ•°: %s"
-#: plugins/sudoers/def_data.c:630
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "プロセスãŒãƒ­ãƒƒã‚¯ã™ã‚‹ãƒ¡ãƒ¢ãƒªãƒ¼ã‚µã‚¤ã‚ºã®æœ€å¤§å€¤(ãƒã‚¤ãƒˆå˜ä½): %s"
-#: plugins/sudoers/def_data.c:634
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "プロセスãŒé–‹ãファイル数ã®æœ€å¤§å€¤: %s"
-#: plugins/sudoers/def_data.c:638
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "ユーザーãŒåŒæ™‚ã«èµ°ã‚‰ã›ã‚‹ãƒ—ロセスã®æœ€å¤§æ•°: %s"
-#: plugins/sudoers/def_data.c:642
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "プロセスãŒä½¿ç”¨ã™ã‚‹ãƒ¡ãƒ¢ãƒªãƒ¼(RSS)ã®æœ€å¤§å€¤(ãƒã‚¤ãƒˆå˜ä½): %s"
-#: plugins/sudoers/def_data.c:646
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "プロセスã®ã‚¹ã‚¿ãƒƒã‚¯ã‚µã‚¤ã‚ºã®æœ€å¤§å€¤(ãƒã‚¤ãƒˆå˜ä½): %s"
-#: plugins/sudoers/def_data.c:650
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr "éžå¯¾è©±ãƒ¢ãƒ¼ãƒ‰ã§ã‚‚èªè¨¼ã‚’試ã¿ã‚‹"
-#: plugins/sudoers/def_data.c:654
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr "I/Oログ入力ã«å¹³åˆ†ã®ãƒ‘スワードを格ç´ã™ã‚‹"
-#: plugins/sudoers/def_data.c:658
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr "パスワードã®ãƒ—ロンプトã«ä¸€è‡´ã™ã‚‹ã‹èª¿ã¹ã‚‹æ­£è¦è¡¨ç¾ã®ä¸€è¦§"
-#: plugins/sudoers/defaults.c:193
-#, c-format
-msgid "%s: unknown defaults entry \"%s\""
-msgstr "%s: 未知ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆé …ç›® \"%s\" ã§ã™"
-
-#: plugins/sudoers/defaults.c:242
-#, c-format
-msgid "%s:%d:%d: no value specified for \"%s\""
-msgstr "%s:%d:%d: \"%s\" ã«å€¤ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-
-#: plugins/sudoers/defaults.c:245
-#, c-format
-msgid "%s: no value specified for \"%s\""
-msgstr "%s: \"%s\" ã«å€¤ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-
-#: plugins/sudoers/defaults.c:258
-#, c-format
-msgid "%s:%d:%d: invalid operator \"%c=\" for \"%s\""
-msgstr "%s:%d:%d: \"%c=\" 㯠\"%s\" ã«ã¯ç„¡åŠ¹ãªæ¼”ç®—å­ã§ã™"
-
-#: plugins/sudoers/defaults.c:261
+#: plugins/sudoers/def_data.c:688
#, c-format
-msgid "%s: invalid operator \"%c=\" for \"%s\""
-msgstr "%s: \"%c=\" 㯠\"%s\" ã«ã¯ç„¡åŠ¹ãªæ¼”ç®—å­ã§ã™"
+msgid "The mechanism used by the intercept and log_subcmds options: %s"
+msgstr "インターセプト㨠log_subcmds オプションã§ä½¿ã‚れるメカニズム: %s"
-#: plugins/sudoers/defaults.c:297
-#, c-format
-msgid "%s:%d:%d: option \"%s\" does not take a value"
-msgstr "%s:%d:%d: オプション \"%s\" ã¯å€¤ã‚’ã¨ã‚Šã¾ã›ã‚“"
-
-#: plugins/sudoers/defaults.c:300
-#, c-format
-msgid "%s: option \"%s\" does not take a value"
-msgstr "%s: オプション \"%s\" ã¯å€¤ã‚’ã¨ã‚Šã¾ã›ã‚“"
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "コマンドã¨å¼•æ•°ã‚’実行後ã«æ¤œè¨¼ã™ã‚‹ã“ã¨ã‚’試ã¿ã¾ã™"
-#: plugins/sudoers/defaults.c:328
+#: plugins/sudoers/def_data.c:696
#, c-format
-msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s:%d:%d: 0x%x ã¯ã‚ªãƒ—ション \"%s\" ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¿ã‚¤ãƒ—ã¨ã—ã¦ç„¡åŠ¹ã§ã™"
+msgid "AppArmor profile to use in the new security context: %s"
+msgstr "æ–°ã—ã„セキュリティコンテキスト内ã§ä½¿ç”¨ã™ã‚‹ AppArmor プロファイル: %s"
-#: plugins/sudoers/defaults.c:331
+#: plugins/sudoers/defaults.c:191
#, c-format
-msgid "%s: invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s: 0x%x ã¯ã‚ªãƒ—ション \"%s\" ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¿ã‚¤ãƒ—ã¨ã—ã¦ç„¡åŠ¹ã§ã™"
+msgid "unknown defaults entry \"%s\""
+msgstr "ä¸æ˜Žãªãƒ‡ãƒ•ã‚©ãƒ«ãƒˆé …ç›® \"%s\" ã§ã™"
-#: plugins/sudoers/defaults.c:341
+#: plugins/sudoers/defaults.c:234
#, c-format
-msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
-msgstr "%s:%d:%d: \"%s\" ã¯ã‚ªãƒ—ション \"%s\" ã®å€¤ã¨ã—ã¦ã¯ç„¡åŠ¹ã§ã™"
+msgid "no value specified for \"%s\""
+msgstr "\"%s\" ã«å€¤ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/defaults.c:344
+#: plugins/sudoers/defaults.c:243
#, c-format
-msgid "%s: value \"%s\" is invalid for option \"%s\""
-msgstr "%s: \"%s\" ã¯ã‚ªãƒ—ション \"%s\" ã®å€¤ã¨ã—ã¦ã¯ç„¡åŠ¹ã§ã™"
+msgid "invalid operator \"%c=\" for \"%s\""
+msgstr "\"%c=\" 㯠\"%s\" ã«ã¯ç„¡åŠ¹ãªæ¼”ç®—å­ã§ã™"
-#: plugins/sudoers/defaults.c:1161
+#: plugins/sudoers/defaults.c:275
#, c-format
-msgid "%s:%d:%d: path name for \"%s\" too long"
-msgstr "%s:%d:%d: \"%s\" ã®ãƒ‘スåãŒé•·ã™ãŽã¾ã™"
+msgid "option \"%s\" does not take a value"
+msgstr "オプション \"%s\" ã¯å€¤ã‚’ã¨ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/defaults.c:1164
+#: plugins/sudoers/defaults.c:299
#, c-format
-msgid "%s: path name for \"%s\" too long"
-msgstr "%s: \"%s\" ã®ãƒ‘スåãŒé•·ã™ãŽã¾ã™"
+msgid "invalid Defaults type 0x%x for option \"%s\""
+msgstr "0x%x ã¯ã‚ªãƒ—ション \"%s\" ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¿ã‚¤ãƒ—ã¨ã—ã¦ç„¡åŠ¹ã§ã™"
-#: plugins/sudoers/defaults.c:1175
+#: plugins/sudoers/defaults.c:306
#, c-format
-msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
-msgstr "%s:%d:%d: \"%s\" ã®å€¤ã¯ '/', '~', ã¾ãŸã¯ '*' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+msgid "value \"%s\" is invalid for option \"%s\""
+msgstr "\"%s\" ã¯ã‚ªãƒ—ション \"%s\" ã®å€¤ã¨ã—ã¦ã¯ç„¡åŠ¹ã§ã™"
-#: plugins/sudoers/defaults.c:1179
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
-msgid "%s: values for \"%s\" must start with a '/', '~', or '*'"
-msgstr "%s: \"%s\" ã®å€¤ã¯ '/', '~', ã¾ãŸã¯ '*' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+msgid "path name for \"%s\" too long"
+msgstr "\"%s\" ã®ãƒ‘スåãŒé•·ã™ãŽã¾ã™"
-#: plugins/sudoers/defaults.c:1190
+#: plugins/sudoers/defaults.c:1134
#, c-format
-msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
-msgstr "%s:%d:%d: \"%s\" ã®å€¤ã¯ '/' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+msgid "values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "\"%s\" ã®å€¤ã¯ '/', '~', ã¾ãŸã¯ '*' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: plugins/sudoers/defaults.c:1194
+#: plugins/sudoers/defaults.c:1141
#, c-format
-msgid "%s: values for \"%s\" must start with a '/'"
-msgstr "%s: \"%s\" ã®å€¤ã¯ '/' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+msgid "values for \"%s\" must start with a '/'"
+msgstr "\"%s\" ã®å€¤ã¯ '/' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv: envp ãŒç ´æã—ã¦ã„ã¾ã™ã€‚é•·ã•ãŒåˆã„ã¾ã›ã‚“"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "環境をå†æ§‹ç¯‰ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, c-format
msgid "sorry, you are not allowed to set the following environment variables: %s"
msgstr "残念ã§ã™ãŒã€ã‚ãªãŸã¯æ¬¡ã®ç’°å¢ƒå¤‰æ•°ã‚’設定ã™ã‚‹ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“: %s"
-#: plugins/sudoers/file.c:108
-#, c-format
-msgid "parse error in %s near line %d"
-msgstr "%s 内 %d 行付近ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-#: plugins/sudoers/file.c:111
-#, c-format
-msgid "parse error in %s"
-msgstr "%s 内ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
#: plugins/sudoers/filedigest.c:49
#, c-format
msgid "unsupported digest type %d for %s"
@@ -2638,27 +2681,27 @@ msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ãªã„ èªè¨¼æ–¹å¼ %d ã§ã™: %s"
msgid "%s: read error"
msgstr "%s: 読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s ã®æ‰€æœ‰è€…㯠uid %d ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, c-format
msgid "%s must only be writable by owner"
msgstr "%s ã¯æ‰€æœ‰è€…ã®ã¿æ›¸ãè¾¼ã¿å¯èƒ½ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "%s をロードã§ãã¾ã›ã‚“: %su"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, c-format
msgid "unable to find symbol \"group_plugin\" in %s"
msgstr "%s 内ã«ã‚·ãƒ³ãƒœãƒ« \"group_plugin\" ãŒã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/group_plugin.c:107
+#: plugins/sudoers/group_plugin.c:202
#, c-format
msgid "%s: incompatible group plugin major version %d, expected %d"
msgstr "%s: 互æ›æ€§ã®ãªã„グループプラグインメジャーãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d ã§ã™ã€‚予期ã•ã‚Œã‚‹ã®ã¯ %d ã§ã™"
@@ -2677,42 +2720,42 @@ msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ \"%s\" を解æžã§ãã¾ã›ã‚“"
msgid "Local IP address and netmask pairs:\n"
msgstr "ローカル IP アドレスã¨ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã®çµ„:\n"
-#: plugins/sudoers/iolog.c:681
+#: plugins/sudoers/iolog.c:685
msgid "unable to update sequence file"
msgstr "シーケンスファイルを更新ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/iolog.c:715 plugins/sudoers/iolog.c:903
-#: plugins/sudoers/iolog.c:1065 plugins/sudoers/iolog.c:1072
-#: plugins/sudoers/iolog.c:1193 plugins/sudoers/iolog.c:1200
-#: plugins/sudoers/iolog.c:1299 plugins/sudoers/iolog.c:1306
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "%s 㸠I/O ログを書ã込むã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: plugins/sudoers/iolog.c:723
+#: plugins/sudoers/iolog.c:727
#, c-format
msgid "unable to create %s/%s"
msgstr "%s/%s を作æˆã§ãã¾ã›ã‚“"
-#: plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:957
#, c-format
msgid "%s: internal error, I/O log file for event %d not open"
msgstr "%s: 内部エラーã€I/O イベント %d ã®ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ã¾ã›ã‚“"
-#: plugins/sudoers/iolog.c:1050 plugins/sudoers/iolog.c:1178
-#: plugins/sudoers/iolog.c:1283 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:510
-#: plugins/sudoers/visudo.c:516
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "時刻を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: plugins/sudoers/iolog.c:1275 plugins/sudoers/log_client.c:1221
-#: plugins/sudoers/log_client.c:1231 plugins/sudoers/log_client.c:1235
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: 内部エラーã€ç„¡åŠ¹ãªã‚·ã‚°ãƒŠãƒ« %d"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "starttls 㯠ldaps を使用時ã«ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
@@ -2726,16 +2769,16 @@ msgstr "SSL 証明書ã¨éµãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“: %s"
msgid "you must set TLS_CERT in %s to use SSL"
msgstr "SSL を使用ã™ã‚‹ãŸã‚ã«ã¯ %s ã®ä¸­ã® TLS_CERT を設定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-#: plugins/sudoers/ldap.c:1717
+#: plugins/sudoers/ldap.c:1712
#, c-format
msgid "unable to initialize LDAP: %s"
msgstr "LDAP ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/ldap.c:1754
+#: plugins/sudoers/ldap.c:1749
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:1891 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "無効㪠sudoOrder 属性ã§ã™: %s"
@@ -2745,12 +2788,12 @@ msgstr "無効㪠sudoOrder 属性ã§ã™: %s"
msgid "%s: port too large"
msgstr "%s: ãƒãƒ¼ãƒˆãŒå¤§ãéŽãŽã¾ã™"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ãªã„ LDAP URI タイプã§ã™: %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "ldap 㨠ldaps ã® URI ã‚’æ··ãœã¦ä½¿ç”¨ã§ãã¾ã›ã‚“"
@@ -2775,111 +2818,111 @@ msgstr "監査システムを開ãã“ã¨ãŒã§ãã¾ã›ã‚“"
msgid "unable to send audit message"
msgstr "監査メッセージをé€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:400
-#: plugins/sudoers/log_client.c:1468 plugins/sudoers/log_client.c:2069
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "イベントループã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "æ–°ã—ã„ SSL_CTX オブジェクトã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
-#: plugins/sudoers/log_client.c:223
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "èªè¨¼å±€ã®è¨¼æ˜Žæ›¸ãƒãƒ³ãƒ‰ãƒ« %s をロードã§ãã¾ã›ã‚“"
-#: plugins/sudoers/log_client.c:243
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "証明書 %s をロードã§ãã¾ã›ã‚“"
-#: plugins/sudoers/log_client.c:256
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "プライベートéµã‚’読ã¿è¾¼ã‚ã¾ã›ã‚“: %s"
-#: plugins/sudoers/log_client.c:265
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "SSLオブジェクトを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
-#: plugins/sudoers/log_client.c:353 plugins/sudoers/log_client.c:358
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "%s:%s ã¸ã®TLS接続ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
-#: plugins/sudoers/log_client.c:531
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "TLS åˆæœŸåŒ–ãŒæˆåŠŸã—ã¾ã›ã‚“ã§ã—ãŸ"
-#: plugins/sudoers/log_client.c:541
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "TLS ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒæˆåŠŸã—ã¾ã›ã‚“ã§ã—ãŸ"
-#: plugins/sudoers/log_client.c:1239
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: 内部エラーã€ç„¡åŠ¹ãªçµ‚了コード %d"
-#: plugins/sudoers/log_client.c:1608
-msgid "unable to unpack ServerMessage"
-msgstr "ServerMessage を展開ã§ãã¾ã›ã‚“"
-
-#: plugins/sudoers/log_client.c:1763 plugins/sudoers/log_client.c:1787
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "ログサーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒå¤±ã‚ã‚Œã¾ã—ãŸ"
-#: plugins/sudoers/log_client.c:1864
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "書ãè¾¼ã¿ãƒãƒƒãƒ•ã‚¡ãŒå¤±ã‚ã‚Œã¾ã—ãŸ"
-#: plugins/sudoers/log_client.c:2010
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "ログサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“"
-#: plugins/sudoers/logging.c:288
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "ユーザー㌠sudoers 内ã«ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/logging.c:290
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "ホスト上ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒèªè¨¼ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/logging.c:292
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "コマンドãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/logging.c:313
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr "%s 㯠sudoers ファイルã«ã‚ã‚Šã¾ã›ã‚“。\n"
-#: plugins/sudoers/logging.c:316
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "%s 㯠%s 上㧠sudo を実行ã™ã‚‹ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
-#: plugins/sudoers/logging.c:319
+#: plugins/sudoers/logging.c:321
#, c-format
msgid "Sorry, user %s may not run sudo on %s.\n"
msgstr "残念ã§ã™ãŒã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ %s 㯠%s 上㧠sudo を実行ã§ãã¾ã›ã‚“。\n"
-#: plugins/sudoers/logging.c:322
+#: plugins/sudoers/logging.c:324
#, 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:359 plugins/sudoers/sudoers.c:629
-#: plugins/sudoers/sudoers.c:631 plugins/sudoers/sudoers.c:633
-#: plugins/sudoers/sudoers.c:635 plugins/sudoers/sudoers.c:785
-#: plugins/sudoers/sudoers.c:787
+#: plugins/sudoers/logging.c:334
+msgid "This incident has been reported to the administrator.\n"
+msgstr "ã“ã®å‡ºæ¥äº‹ã¯ç®¡ç†è€…å®›ã¦ã«å ±å‘Šã•ã‚Œã¾ã—ãŸã€‚\n"
+
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s: コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/logging.c:361 plugins/sudoers/sudoers.c:625
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2888,39 +2931,45 @@ msgstr ""
"'.' 内ã§è¦‹ã¤ã‹ã£ãŸ \"%1$s\" を無視ã—ã¾ã™\n"
"ã“ã® \"%3$s\" を実行ã—ãŸã„å ´åˆã¯ \"sudo ./%2$s\" を使用ã—ã¦ãã ã•ã„。"
-#: plugins/sudoers/logging.c:380
+#: plugins/sudoers/logging.c:387
#, c-format
msgid "%u incorrect password attempt"
msgid_plural "%u incorrect password attempts"
msgstr[0] "%u 回パスワード試行を間é•ãˆã¾ã—ãŸ"
-#: plugins/sudoers/logging.c:436
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "èªè¨¼å¤±æ•—"
-#: plugins/sudoers/logging.c:476 plugins/sudoers/logging.c:496
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "パスワードãŒå¿…è¦ã§ã™"
-#: plugins/sudoers/logging.c:890
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
+msgid "problem parsing sudoers"
+msgstr "sudoers を構文解æžã™ã‚‹æ™‚ã«èµ·ããŸå•é¡Œ"
+
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
+#, c-format
+msgid "%s:%d:%d: %s"
+msgstr "%s:%d:%d: %s"
+
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "%s ã¸ãƒ­ã‚°ã‚’書ã込むã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: plugins/sudoers/match_digest.c:129
+#: plugins/sudoers/match_digest.c:112
#, c-format
-msgid "digest for %s (%s) is not in %s form"
-msgstr "%s (%s) ã®èªè¨¼æ–¹å¼ã¯ %s å½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-
-#: plugins/sudoers/parse.c:233
-msgid "SELinux RBAC is not supported when intercept mode is enabled"
-msgstr "SELinux RBAC ã¯ã‚¤ãƒ³ã‚¿ãƒ¼ã‚»ãƒ—トモードãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã¨ãã«ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+msgid "digest for %s (%s) bad length %zu, expected %zu"
+msgstr "%s (%s) ã®ãƒãƒƒã‚·ãƒ¥ã®é•·ã•ãŒ %zu ã§ã€ 予期ã•ã‚Œã‚‹ %zu ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/parse.c:238
-msgid "SELinux RBAC is not supported when the log_subcmds flag is enabled"
-msgstr "SELinux RBAC ã¯log_subcmds フラグãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã¨ãã«ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+#: plugins/sudoers/match_digest.c:131
+#, c-format
+msgid "digest for %s (%s) is not in %s form"
+msgstr "%s (%s) ã®ãƒãƒƒã‚·ãƒ¥ã¯ %s å½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/parse.c:549
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2929,7 +2978,7 @@ msgstr ""
"\n"
"LDAP 役割: %s\n"
-#: plugins/sudoers/parse.c:552
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2937,115 +2986,110 @@ msgstr ""
"\n"
"sudoers é …ç›®:\n"
-#: plugins/sudoers/parse.c:554
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " RunAsUsers: "
-#: plugins/sudoers/parse.c:569
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " RunAsGroups: "
-#: plugins/sudoers/parse.c:579
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " オプション: "
-#: plugins/sudoers/parse.c:643
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " コマンド:\n"
-#: plugins/sudoers/parse.c:834
+#: plugins/sudoers/parse.c:876
#, c-format
msgid "Matching Defaults entries for %s on %s:\n"
msgstr "既定値ã®ã‚¨ãƒ³ãƒˆãƒªã¨ç…§åˆä¸­ (ユーザーå %s) (ホストå %s):\n"
-#: plugins/sudoers/parse.c:852
+#: plugins/sudoers/parse.c:894
#, c-format
msgid "Runas and Command-specific defaults for %s:\n"
msgstr "ユーザー %s 用㮠Runas ãŠã‚ˆã³ã‚³ãƒžãƒ³ãƒ‰ç‰¹æœ‰ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ:\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:912
#, c-format
msgid "User %s may run the following commands on %s:\n"
msgstr "ユーザー %s 㯠%s 上㧠コマンドを実行ã§ãã¾ã™\n"
-#: plugins/sudoers/parse.c:885
+#: plugins/sudoers/parse.c:927
#, c-format
msgid "User %s is not allowed to run sudo on %s.\n"
msgstr "ユーザー %s 㯠%s 上㧠sudo を実行ã™ã‚‹ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
-#: plugins/sudoers/parse_ldif.c:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "ä¸å®Œå…¨ãª sudoRole: cn: %s を無視ã—ã¾ã™"
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "無効㪠LDIF 属性ã§ã™: %s"
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr "無効㪠%.*s ㌠sudo ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã™"
-#: plugins/sudoers/policy.c:206 plugins/sudoers/policy.c:215
-#, c-format
-msgid "path name for \"%s\" too long"
-msgstr "\"%s\" ã®ãƒ‘スåãŒé•·ã™ãŽã¾ã™"
-
-#: plugins/sudoers/policy.c:328 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒªã‚¹ãƒˆã‚’解æžã§ãã¾ã›ã‚“"
-#: plugins/sudoers/policy.c:485
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr "ユーザーå㌠sudo ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/policy.c:489
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr "ユーザーID㌠sudo ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/policy.c:493
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr "グループID㌠sudo ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/policy.c:497
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr "ホストå㌠sudo ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/policy.c:670
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "無効ãªä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª: %s"
-#: plugins/sudoers/policy.c:846
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "無効㪠chroot ディレクトリ: %s"
-#: plugins/sudoers/policy.c:1025 plugins/sudoers/visudo.c:243
-#: plugins/sudoers/visudo.c:880
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "%s を実行ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/policy.c:1095 plugins/sudoers/policy.c:1132
-#: plugins/sudoers/policy.c:1154 plugins/sudoers/policy.c:1180
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: 無効ãªãƒ¢ãƒ¼ãƒ‰ãƒ•ãƒ©ã‚°ãŒ sudo ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã§æŒ‡å®šã•ã‚Œã¦ã„ã¾ã™: 0x%x"
-#: plugins/sudoers/policy.c:1211
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "sudoers ãƒãƒªã‚·ãƒ¼ãƒ—ラグイン ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s\n"
-#: plugins/sudoers/policy.c:1213
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "sudoers ファイル文法ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d\n"
-#: plugins/sudoers/policy.c:1217
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -3054,27 +3098,27 @@ msgstr ""
"\n"
"sudoers ã®ãƒ‘ス: %s\n"
-#: plugins/sudoers/policy.c:1220
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "nsswitch ã®ãƒ‘ス: %s\n"
-#: plugins/sudoers/policy.c:1222
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "ldap.conf ã®ãƒ‘ス: %s\n"
-#: plugins/sudoers/policy.c:1223
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "ldap.secret ã®ãƒ‘ス: %s\n"
-#: plugins/sudoers/policy.c:1256
+#: plugins/sudoers/policy.c:1337
#, c-format
msgid "unable to register hook of type %d (version %d.%d)"
msgstr "タイプ %d ã®ãƒ•ãƒƒã‚¯ã‚’登録ã§ãã¾ã›ã‚“ (ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d.%d)"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "タイプ %d ã®ãƒ•ãƒƒã‚¯ã‚’登録解除ã§ãã¾ã›ã‚“ (ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d.%d)"
@@ -3213,149 +3257,142 @@ msgstr "SSS ã®ã‚½ãƒ¼ã‚¹ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“。SSSD ã¯ã‚ãªãŸã®ãƒžã‚·
msgid "unable to find symbol \"%s\" in %s"
msgstr "シンボル \"%s\" ㌠%s 内ã«ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:166 plugins/sudoers/sudoers.c:174
-#: plugins/sudoers/sudoers.c:228 plugins/sudoers/sudoers.c:249
-#: plugins/sudoers/sudoers.c:1049
-msgid "problem with defaults entries"
-msgstr "デフォルト項目ã§å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+#: plugins/sudoers/sudoers.c:263
+#, c-format
+msgid "unable to get defaults from %s"
+msgstr "%s ã‹ã‚‰æ—¢å®šå€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:253
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr "有効㪠sudoers ã®ã‚½ãƒ¼ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。終了ã—ã¾ã™"
-#: plugins/sudoers/sudoers.c:327
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "ユーザーã¯ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ %s ã«å¤‰æ›´ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:329
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "-R オプションを %s ã¨å…±ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "ユーザーã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ %s ã«å¤‰æ›´ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:355
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "-D オプションを %s ã¨å…±ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:382
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "コマンドãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:407
+#: plugins/sudoers/sudoers.c:426
msgid "sudoers specifies that root is not allowed to sudo"
msgstr "sudoers ã®æŒ‡å®šã«ã‚ˆã‚Š root ㌠sudo を使用ã™ã‚‹ã“ã¨ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™"
-#: plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "ユーザー㌠closefrom 制é™ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ã¯è¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:458
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "-C オプションを使用ã™ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:518
+#: plugins/sudoers/sudoers.c:537
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr "タイムスタンプã®æ‰€æœ‰è€… (%s): ãã®ã‚ˆã†ãªãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:533
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "tty ãŒã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:534
+#: plugins/sudoers/sudoers.c:553
msgid "sorry, you must have a tty to run sudo"
msgstr "残念ã§ã™ãŒã€sudo を実行ã™ã‚‹ã«ã¯ tty ãŒå¿…è¦ã§ã™"
-#: plugins/sudoers/sudoers.c:541
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "ユーザー %s ã«ã¯ç„¡åŠ¹ãª シェル: %s"
-#: plugins/sudoers/sudoers.c:624
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "コマンドãŒã‚«ãƒ¬ãƒ³ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚Šã¾ã™"
-#: plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "\"cd\" ã¯ã‚·ã‚§ãƒ«ã®å†…蔵コマンドã§ã€ç›´æŽ¥å®Ÿè¡Œã§ãã¾ã›ã‚“。"
-#: plugins/sudoers/sudoers.c:641
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr "権é™ã‚’昇格ã—ãŸã‚·ã‚§ãƒ«ã‚’実行ã™ã‚‹ãŸã‚ã« -s オプションãŒä½¿ã‚れるã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚"
-#: plugins/sudoers/sudoers.c:643
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr "コマンドを実行ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã™ã‚‹ãŸã‚ã« -D オプションを使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
-#: plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "ユーザーã¯ã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡Œã®åˆ¶é™æ™‚間を設定ã™ã‚‹ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:654
+#: plugins/sudoers/sudoers.c:673
msgid "sorry, you are not allowed set a command timeout"
msgstr "残念ã§ã™ãŒã€ã‚ãªãŸã¯ã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡Œã®åˆ¶é™æ™‚間を設定ã™ã‚‹ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:662
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "ユーザーã¯ç’°å¢ƒå¤‰æ•°ã‚’ä¿å­˜ã™ã‚‹ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:664
+#: plugins/sudoers/sudoers.c:683
msgid "sorry, you are not allowed to preserve the environment"
msgstr "残念ã§ã™ãŒã€ã‚ãªãŸã¯ç’°å¢ƒå¤‰æ•°ã‚’ä¿å­˜ã™ã‚‹ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:1037
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "sudoedit ã®å®Ÿè¡Œã« sudo を使用ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "%s を読ã¿è¾¼ã‚ã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:1121 plugins/sudoers/visudo.c:449
-#: plugins/sudoers/visudo.c:748
-#, c-format
-msgid "unable to stat %s"
-msgstr "%s ã®çŠ¶æ…‹å–å¾— (stat) ãŒã§ãã¾ã›ã‚“"
-
-#: plugins/sudoers/sudoers.c:1125 plugins/sudoers/visudo.c:1045
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%s ã¯é€šå¸¸ãƒ•ã‚¡ã‚¤ãƒ«ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: plugins/sudoers/sudoers.c:1129 plugins/sudoers/timestamp.c:252 toke.l:1239
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ID %u ã«ã‚ˆã£ã¦æ‰€æœ‰ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“れ㯠%u ã§ã‚ã‚‹ã¹ãã§ã™"
-#: plugins/sudoers/sudoers.c:1133 toke.l:1244
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "%s ã¯èª°ã§ã‚‚書ãè¾¼ã¿å¯èƒ½ã§ã™"
-#: plugins/sudoers/sudoers.c:1137 toke.l:1247
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, c-format
msgid "%s is owned by gid %u, should be %u"
msgstr "%s ã®ã‚°ãƒ«ãƒ¼ãƒ—ID㯠%u ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“れ㯠%u ã§ã‚ã‚‹ã¹ãã§ã™"
-#: plugins/sudoers/sudoers.c:1170
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "root ã®ã¿ \"-c %s\" を使用ã§ãã¾ã™"
-#: plugins/sudoers/sudoers.c:1189
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr "ä¸æ˜Žãªãƒ­ã‚°ã‚¤ãƒ³ã‚¯ãƒ©ã‚¹ %s"
-#: plugins/sudoers/sudoers.c:1275 plugins/sudoers/sudoers.c:1290
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "ホスト %s ã®åå‰è§£æ±ºãŒã§ãã¾ã›ã‚“"
@@ -3453,17 +3490,17 @@ msgstr "末尾㫠\"!\" ã‚’é…ç½®ã§ãã¾ã›ã‚“"
msgid "unknown search type %d"
msgstr "未知ã®æ¤œç´¢ã‚¿ã‚¤ãƒ— %d"
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, 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:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, 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:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -3472,7 +3509,7 @@ msgstr ""
"%s - sudo セッションログをリプレイã—ã¾ã™\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3528,132 +3565,122 @@ msgstr ""
"\n"
"コマンドãŒä¸€è‡´ã—ã¾ã›ã‚“ã§ã—ãŸ"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%s ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã‚ˆã‚‹æ›¸ãè¾¼ã¿ãŒå¯èƒ½ã§ã™"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, c-format
msgid "unable to truncate time stamp file to %lld bytes"
msgstr "タイムスタンプファイルを %lld ãƒã‚¤ãƒˆã«åˆ‡ã‚Šè©°ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: plugins/sudoers/timestamp.c:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "未æ¥ã®æ™‚刻ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を無視ã—ã¾ã™"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, c-format
msgid "time stamp too far in the future: %20.20s"
msgstr "タイムスタンプãŒé ã™ãŽã‚‹å°†æ¥ã«ãªã£ã¦ã„ã¾ã™: %20.20s"
-#: plugins/sudoers/timestamp.c:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "タイムスタンプファイル %s をロックã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, c-format
-msgid "lecture status path too long: %s/%s"
-msgstr "å—講状æ³æ ¼ç´ãƒ‘スãŒé•·ã™ãŽã¾ã™: %s/%s"
-
#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "sudoedit ã¯ãƒ‘スãªã—ã§è¨­å®šã™ã‚‹ã¹ãã§ã™"
-#: plugins/sudoers/visudo.c:238
+#: plugins/sudoers/visudo.c:254
msgid "the -x option will be removed in a future release"
msgstr "-x オプションã¯å°†æ¥ã®ãƒªãƒªãƒ¼ã‚¹ã§ã¯å‰Šé™¤ã•ã‚Œã¾ã™"
-#: plugins/sudoers/visudo.c:240
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "cvtsudoers ユーティリティーを代ã‚ã‚Šã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„"
-#: plugins/sudoers/visudo.c:292 plugins/sudoers/visudo.c:676
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "%s を編集ã™ã‚‹ãŸã‚ã«ãƒªã‚¿ãƒ¼ãƒ³ã‚’押ã—ã¦ãã ã•ã„: "
-#: plugins/sudoers/visudo.c:307
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr "編集セッションã®å†…容㌠%s 内ã«æ®‹ã£ã¦ã„ã¾ã™"
-#: plugins/sudoers/visudo.c:361
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "指定ã—ãŸã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ (%s) ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:363
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "エディターãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ (エディターã®ãƒ‘ス = %s)"
-#: plugins/sudoers/visudo.c:469 plugins/sudoers/visudo.c:477
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "%s ã®çŠ¶æ…‹å–å¾— (stat) ãŒã§ãã¾ã›ã‚“"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼ã§ã™"
-#: plugins/sudoers/visudo.c:523
+#: plugins/sudoers/visudo.c:565
#, c-format
msgid "unable to stat temporary file (%s), %s unchanged"
msgstr "一時ファイル (%s) ã®çŠ¶æ…‹å–å¾— (stat) ãŒã§ãã¾ã›ã‚“。%s ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:530
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr "一時ファイル (%s) ã®å¤§ãã•ãŒ 0 ã§ã™ã€‚%s ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:536
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "エディター (%s) ãŒç•°å¸¸çµ‚了ã—ã¾ã—ãŸã€‚%s ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:558
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:615
+#: plugins/sudoers/visudo.c:645
#, c-format
msgid "unable to re-open temporary file (%s), %s unchanged."
msgstr "一時ファイル (%s) ã‚’å†åº¦é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“。%s ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“。"
-#: plugins/sudoers/visudo.c:627
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "一時ファイル (%s) ã®æ§‹æ–‡è§£æžãŒã§ãã¾ã›ã‚“。ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã§ã™"
-#: plugins/sudoers/visudo.c:665
-#, c-format
-msgid "internal error, unable to find %s in list!"
-msgstr "内部エラーã€ãƒªã‚¹ãƒˆå†…ã« %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“!"
-
-#: plugins/sudoers/visudo.c:722 plugins/sudoers/visudo.c:752
-#: plugins/sudoers/visudo.c:759
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, c-format
msgid "unable to set (uid, gid) of %s to (%u, %u)"
msgstr "%s ã® (ユーザーID, グループID) ã‚’ (%u, %u) ã«è¨­å®šã§ãã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:787
+#: plugins/sudoers/visudo.c:809
#, c-format
msgid "%s and %s not on the same file system, using mv to rename"
msgstr "%s 㨠%s ã¯åŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«ã‚ã‚Šã¾ã›ã‚“。åå‰ã‚’変更ã™ã‚‹ãŸã‚ã« mv を使用ã—ã¦ã„ã¾ã™"
-#: plugins/sudoers/visudo.c:798
+#: plugins/sudoers/visudo.c:820
#, c-format
msgid "command failed: '%s %s %s', %s unchanged"
msgstr "コマンドã®å¤±æ•—ã§ã™: '%s %s %s'。%s ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:805
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "%s ã®åå‰å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—ãŸã€‚%s ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:825
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "次ã¯ä½•ã§ã—ょã†ã‹? "
-#: plugins/sudoers/visudo.c:839
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3665,41 +3692,41 @@ msgstr ""
" x -- sudoers ファイルã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã›ãšã«çµ‚了ã—ã¾ã™\n"
" Q -- sudoers ファイルã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¦çµ‚了ã—ã¾ã™ (*å±é™ºã§ã™!*)\n"
-#: plugins/sudoers/visudo.c:885
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "%s を実行ã§ãã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:916
+#: plugins/sudoers/visudo.c:938
#, c-format
msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
msgstr "%s: 所有権ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™ã€‚(ユーザーID, グループID) 㯠(%u, %u) ã§ã‚ã‚‹ã¹ãã§ã™\n"
-#: plugins/sudoers/visudo.c:927
+#: plugins/sudoers/visudo.c:949
#, c-format
msgid "%s: bad permissions, should be mode 0%o\n"
msgstr "%s: アクセス権é™ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™ã€‚モード㯠0%o ã§ã‚ã‚‹ã¹ãã§ã™\n"
-#: plugins/sudoers/visudo.c:978 plugins/sudoers/visudo.c:985
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: æ­£ã—ã構文解æžã•ã‚Œã¾ã—ãŸ\n"
-#: plugins/sudoers/visudo.c:1004
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%s ãŒãƒ“ジー状態ã§ã™ã€‚後ã§å†è©¦è¡Œã—ã¦ãã ã•ã„"
-#: plugins/sudoers/visudo.c:1008
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "ãã‚Œã§ã‚‚編集ã—ã¾ã™ã‹? [y/N]"
-#: plugins/sudoers/visudo.c:1104
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "警告: %s:%d:%d: エイリアス %s \"%s\" ã¯ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: plugins/sudoers/visudo.c:1220
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3708,13 +3735,14 @@ msgstr ""
"%s - sudoers ファイルを安全ã«ç·¨é›†ã™ã‚‹\n"
"\n"
-#: plugins/sudoers/visudo.c:1222
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"
@@ -3724,6 +3752,7 @@ msgstr ""
" -c, --check 検査ã®ã¿ã‚’è¡Œã†\n"
" -f, --file=sudoers sudoers ファイルã®ä½ç½®ã‚’指定ã™ã‚‹\n"
" -h, --help ヘルプメッセージを表示ã—ã¦çµ‚了ã™ã‚‹\n"
+" -I, --no-includes include ファイルを編集ã—ãªã„\n"
" -q, --quiet 文法エラーメッセージをより少ãªã (é™ã‹ã«) ã™ã‚‹\n"
" -s, --strict 厳密ãªæ–‡æ³•æ¤œæŸ»ã‚’è¡Œã†\n"
" -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了ã™ã‚‹\n"
@@ -3752,14 +3781,83 @@ msgstr "無効ãªè¡Œã®ç¶™ç¶š"
msgid "invalid IPv6 address"
msgstr "無効㪠IPv6 アドレス"
-#: toke.l:860
+#: toke.l:868
msgid "unexpected line break in string"
msgstr "文字列ã®äºˆæœŸã›ã¬ã¨ã“ã‚ã«æ”¹è¡Œ"
-#: toke.l:1210
+#: toke.l:1218
msgid "too many levels of includes"
msgstr "インクルードã®éšŽå±¤ãŒå¤§ãã™ãŽã¾ã™"
+#~ msgid "%s is group writable"
+#~ msgstr "%s ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã‚ˆã‚‹æ›¸ãè¾¼ã¿ãŒå¯èƒ½ã§ã™"
+
+#~ msgid "lecture status path too long: %s/%s"
+#~ msgstr "å—講状æ³æ ¼ç´ãƒ‘スãŒé•·ã™ãŽã¾ã™: %s/%s"
+
+#~ msgid "Error: %s:%d:%d: cycle in %s \"%s\""
+#~ msgstr "エラー: %s:%d:%d: %s \"%s\" ã§ã‚¨ã‚¤ãƒªã‚¢ã‚¹å®šç¾©ãŒå¾ªç’°ã—ã¦ã„ã¾ã™"
+
+#~ msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
+#~ msgstr "警告: %s:%d:%d: %s \"%s\" ã§ã‚¨ã‚¤ãƒªã‚¢ã‚¹å®šç¾©ãŒå¾ªç’°ã—ã¦ã„ã¾ã™"
+
+#~ msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
+#~ msgstr "警告: %s:%d:%d: %s \"%s\" ã¯å‚ç…§ã•ã‚Œã¦ã„ã‚‹ã®ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "parse error in %s near line %d\n"
+#~ msgstr "%s 内 %d 行付近ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ\n"
+
+#~ msgid "parse error in %s\n"
+#~ msgstr "%s 内ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ\n"
+
+#~ msgid "%s: unknown defaults entry \"%s\""
+#~ msgstr "%s: 未知ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆé …ç›® \"%s\" ã§ã™"
+
+#~ msgid "%s:%d:%d: no value specified for \"%s\""
+#~ msgstr "%s:%d:%d: \"%s\" ã«å€¤ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "%s:%d:%d: invalid operator \"%c=\" for \"%s\""
+#~ msgstr "%s:%d:%d: \"%c=\" 㯠\"%s\" ã«ã¯ç„¡åŠ¹ãªæ¼”ç®—å­ã§ã™"
+
+#~ msgid "%s:%d:%d: option \"%s\" does not take a value"
+#~ msgstr "%s:%d:%d: オプション \"%s\" ã¯å€¤ã‚’ã¨ã‚Šã¾ã›ã‚“"
+
+#~ msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
+#~ msgstr "%s:%d:%d: 0x%x ã¯ã‚ªãƒ—ション \"%s\" ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¿ã‚¤ãƒ—ã¨ã—ã¦ç„¡åŠ¹ã§ã™"
+
+#~ msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
+#~ msgstr "%s:%d:%d: \"%s\" ã¯ã‚ªãƒ—ション \"%s\" ã®å€¤ã¨ã—ã¦ã¯ç„¡åŠ¹ã§ã™"
+
+#~ msgid "%s:%d:%d: path name for \"%s\" too long"
+#~ msgstr "%s:%d:%d: \"%s\" ã®ãƒ‘スåãŒé•·ã™ãŽã¾ã™"
+
+#~ msgid "%s: path name for \"%s\" too long"
+#~ msgstr "%s: \"%s\" ã®ãƒ‘スåãŒé•·ã™ãŽã¾ã™"
+
+#~ msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
+#~ msgstr "%s:%d:%d: \"%s\" ã®å€¤ã¯ '/', '~', ã¾ãŸã¯ '*' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+
+#~ msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
+#~ msgstr "%s:%d:%d: \"%s\" ã®å€¤ã¯ '/' ã§é–‹å§‹ã—ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+
+#~ msgid "parse error in %s near line %d"
+#~ msgstr "%s 内 %d 行付近ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#~ msgid "parse error in %s"
+#~ msgstr "%s 内ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#~ msgid "SELinux RBAC is not supported when intercept mode is enabled"
+#~ msgstr "SELinux RBAC ã¯ã‚¤ãƒ³ã‚¿ãƒ¼ã‚»ãƒ—トモードãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã¨ãã«ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#~ msgid "SELinux RBAC is not supported when the log_subcmds flag is enabled"
+#~ msgstr "SELinux RBAC ã¯log_subcmds フラグãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã¨ãã«ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#~ msgid "problem with defaults entries"
+#~ msgstr "デフォルト項目ã§å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#~ msgid "internal error, unable to find %s in list!"
+#~ msgstr "内部エラーã€ãƒªã‚¹ãƒˆå†…ã« %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“!"
+
#~ msgid "%s is not in the sudoers file. This incident will be reported.\n"
#~ msgstr "%s 㯠sudoers ファイル内ã«ã‚ã‚Šã¾ã›ã‚“。ã“ã®äº‹è±¡ã¯è¨˜éŒ²ãƒ»å ±å‘Šã•ã‚Œã¾ã™ã€‚\n"
@@ -3772,9 +3870,6 @@ msgstr "インクルードã®éšŽå±¤ãŒå¤§ãã™ãŽã¾ã™"
#~ msgid "unable to read diffie-hellman parameters: %s"
#~ msgstr "ディフィー・ヘルマン パラメーターを読ã¿è¾¼ã‚ã¾ã›ã‚“: %s"
-#~ msgid "unknown defaults entry \"%s\""
-#~ msgstr "ä¸æ˜Žãªãƒ‡ãƒ•ã‚©ãƒ«ãƒˆé …ç›® \"%s\" ã§ã™"
-
#~ msgid "%s:%d unknown key: %s"
#~ msgstr "%s:%d 未知ã®éµ: %s"
@@ -3888,9 +3983,6 @@ msgstr "インクルードã®éšŽå±¤ãŒå¤§ãã™ãŽã¾ã™"
#~ "\n"
#~ "SSSD 役割: ä¸æ˜Ž\n"
-#~ msgid "Warning: cycle in %s `%s'"
-#~ msgstr "警告: 循環を発見 %s `%s'"
-
#~ msgid "Warning: unused %s `%s'"
#~ msgstr "警告: 使ã‚ã‚Œã¦ã„ã¾ã›ã‚“ %s `%s'"
diff --git a/plugins/sudoers/po/ko.mo b/plugins/sudoers/po/ko.mo
index 8f2c00fef..a02c73f26 100644
--- a/plugins/sudoers/po/ko.mo
+++ b/plugins/sudoers/po/ko.mo
Binary files differ
diff --git a/plugins/sudoers/po/ko.po b/plugins/sudoers/po/ko.po
index e371b1f64..5d2b063ff 100644
--- a/plugins/sudoers/po/ko.po
+++ b/plugins/sudoers/po/ko.po
@@ -5,21 +5,21 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.11b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 21:00+0900\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-12 12:18+0900\n"
"Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
"Language-Team: Korean <translation-team-ko@googlegroups.com>\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.3.1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 3.1.1\n"
-#: confstr.sh:1 gram.y:1218
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "문법 오류"
@@ -43,13 +43,13 @@ msgstr "*** %h 보안 알림 ***"
msgid "Sorry, try again."
msgstr "죄송합니다만, 다시 ì‹œë„하십시오."
-#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341
-#: gram.y:365 gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427
-#: gram.y:501 gram.y:511 gram.y:523 gram.y:571 gram.y:580 gram.y:589
-#: gram.y:598 gram.y:730 gram.y:738 gram.y:749 gram.y:761 gram.y:780
-#: gram.y:943 gram.y:948 gram.y:956 gram.y:970 gram.y:976 gram.y:1098
-#: gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133 gram.y:1162 gram.y:1171
-#: gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769 gram.y:1816
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
@@ -59,50 +59,64 @@ msgstr "죄송합니다만, 다시 ì‹œë„하십시오."
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
-#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:168 plugins/sudoers/cvtsudoers.c:131
-#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
-#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
-#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
-#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:862
-#: plugins/sudoers/cvtsudoers.c:870 plugins/sudoers/cvtsudoers.c:1365
-#: plugins/sudoers/cvtsudoers.c:1369 plugins/sudoers/cvtsudoers.c:1471
-#: plugins/sudoers/cvtsudoers_csv.c:183 plugins/sudoers/cvtsudoers_csv.c:246
-#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
-#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
-#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:376
-#: plugins/sudoers/cvtsudoers_ldif.c:430 plugins/sudoers/cvtsudoers_ldif.c:438
-#: plugins/sudoers/cvtsudoers_ldif.c:449 plugins/sudoers/cvtsudoers_ldif.c:456
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:481
-#: plugins/sudoers/cvtsudoers_ldif.c:489 plugins/sudoers/cvtsudoers_ldif.c:636
-#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
+#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
+#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
+#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
+#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
+#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
#: plugins/sudoers/cvtsudoers_merge.c:446
@@ -112,11 +126,11 @@ msgstr "죄송합니다만, 다시 ì‹œë„하십시오."
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1158
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -125,124 +139,125 @@ msgstr "죄송합니다만, 다시 ì‹œë„하십시오."
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
-#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
-#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
-#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
-#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
-#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
-#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
-#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
-#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
-#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
-#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
-#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
-#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
-#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
-#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
-#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
-#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
-#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
-#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
-#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
+#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "메모리를 할당할 수 없습니다"
-#: gram.y:622
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "다ì´ì œìŠ¤íŠ¸ì— 경로 ì´ë¦„ì´ í•„ìš”í•©ë‹ˆë‹¤"
-#: gram.y:644
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "%s: \"CWD\" ê°’ì€ '/'; '~'; '*' 문ìžë¡œ 시작해야합니다"
-#: gram.y:650
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr "\"CWD\" 경로가 너무 ê¹ë‹ˆë‹¤"
-#: gram.y:660
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "%s: \"CHROOT\" ê°’ì€ '/'; '~'; '*' 문ìžë¡œ 시작해야합니다"
-#: gram.y:666
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr "\"CHROOT\" 경로가 너무 ê¹ë‹ˆë‹¤"
-#: gram.y:801
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "문법 오류. %s 예약어를 별칭으로 ì¼ìŠµë‹ˆë‹¤"
-#: gram.y:824
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "부ì ì ˆí•œ notbefore ê°’"
-#: gram.y:833
+#: gram.y:834
msgid "invalid notafter value"
msgstr "부ì ì ˆí•œ notafter ê°’"
-#: gram.y:843 plugins/sudoers/policy.c:376
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "제한 시간 ê°’ì´ ë„ˆë¬´ í½ë‹ˆë‹¤"
-#: gram.y:845 plugins/sudoers/policy.c:378
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "부ì ì ˆí•œ 제한 시간 ê°’"
-#: gram.y:966 plugins/sudoers/sudoers.c:1014
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr "ëª…ë ¹ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤"
-#: gram.y:1220 plugins/sudoers/check_aliases.c:96
-#: plugins/sudoers/defaults.c:1275
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1270
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "\"%s\" ë³„ì¹­ì„ ì´ë¯¸ ì •ì˜í–ˆìŠµë‹ˆë‹¤"
-#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
@@ -252,33 +267,48 @@ msgstr "\"%s\" ë³„ì¹­ì„ ì´ë¯¸ ì •ì˜í–ˆìŠµë‹ˆë‹¤"
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
-#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
@@ -308,11 +338,11 @@ msgstr "\"%s\" ë³„ì¹­ì„ ì´ë¯¸ ì •ì˜í–ˆìŠµë‹ˆë‹¤"
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1157
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -321,46 +351,47 @@ msgstr "\"%s\" ë³„ì¹­ì„ ì´ë¯¸ ì •ì˜í–ˆìŠµë‹ˆë‹¤"
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
-#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
-#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
-#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
-#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
-#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
-#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
-#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
-#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
-#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
-#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
-#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
-#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
-#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
-#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
-#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
-#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
-#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
-#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
-#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
-#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -373,25 +404,25 @@ msgstr "\"%s\" ë³„ì¹­ì„ ì´ë¯¸ ì •ì˜í–ˆìŠµë‹ˆë‹¤"
#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
-#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
-#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
-#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
-#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
-#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
-#: toke.l:1226
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
@@ -400,14 +431,14 @@ msgstr "%s: %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
-#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
-#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
@@ -450,7 +481,7 @@ msgstr "%8s : %s"
msgid "%8s : (command continued) %s"
msgstr "%8s : (명령 ê³„ì† ì‹¤í–‰) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -565,14 +596,14 @@ msgstr "%s: 실행 그룹 필드가 빠졌습니다"
msgid "%s exists but is not a directory (0%o)"
msgstr "%sì´(ê°€) 있지만 디렉터리가 아닙니다(0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "mkdir %s ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
-#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "%s 모드를 0%o 값으로 바꿀 수 없습니다"
@@ -587,150 +618,156 @@ msgstr "타ì´ë° íŒŒì¼ ì½ê¸° 오류: %s"
msgid "invalid timing file line: %s"
msgstr "부ì ì ˆí•œ 타ì´ë° íŒŒì¼ í–‰: %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
-#: plugins/sudoers/policy.c:573
-msgid "unable to generate UUID"
-msgstr "UUID를 만들 수 없습니다"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s: 프로토콜 오류: NULL키"
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr "%s: 프로토콜 오류: %sì˜ ìž˜ëª»ëœ í˜•ì‹"
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s: 프로토콜 오류: %sì— NULLê°’ 들어ê°"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "UUID를 만들 수 없습니다"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr "%s: 프로토콜 오류: AcceptMessageì— %s ë¹ ì§"
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr "%s: 세션 ID를 í¬ë§¤íŒ…í•  수 없습니다"
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr "%s: %sì„(를) 설정하지 ì•ŠìŒ"
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr "%s 입출력 로그 경로를 확장할 수 없습니다"
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr "%s 입출력 로그 경로를 만들 수 없습니다"
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr "부ì ì ˆí•œ 입출력 íŒŒì¼ ì„œìˆ ìž %d번"
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr "%d 입출력 íŒŒì¼ ì„œìˆ ìž ë‹«ê¸° 오류: %s"
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr "%d 입출력 íŒŒì¼ ì„œìˆ ìž ì œê±° 오류: %s"
-#: logsrvd/iolog_writer.c:780
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "부ì ì ˆí•œ %s 입출력 로그: %sì„(를) 참조했지만 없습니다"
-#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s: [%lld, %ld] 재개 지ì ì„ ì°¾ì„ ìˆ˜ 없습니다"
-#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
-#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
-#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
-#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr "%sì„(를) ì—´ 수 없습니다"
-#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "%s/%sì„(를) ì—´ 수 없습니다"
-#: logsrvd/iolog_writer.c:839
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "%s/%sì„(를) %s/%s(으)ë¡œ 복사할 수 없습니다: %s"
-#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr "%sì„(를) %s(으)ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다"
-#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s: [%lld, %ld] 재개 지ì ì„ ì°¾ì„ ìˆ˜ 없습니다"
-#: logsrvd/logsrv_util.c:154
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "입출력 로그 íŒŒì¼ %s/%s ë¹ ì§"
-#: logsrvd/logsrv_util.c:161
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: %zu회 ì´ì „ íƒìƒ‰ì„ 진행할 수 없습니다"
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr "릴레ì´ì— ì—°ê²°í•  수 없습니다"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr "서버 메시지가 너무 ê¹ë‹ˆë‹¤: %zu"
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
-#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
-#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
-#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
-#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
-#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
-#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
-#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
-#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
-#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
-#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
-#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -739,633 +776,658 @@ msgstr "서버 메시지가 너무 ê¹ë‹ˆë‹¤: %zu"
msgid "unable to add event to queue"
msgstr "íì— ì´ë²¤íŠ¸ë¥¼ 추가할 수 없습니다"
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr "%2$sì˜ ì˜ˆê¸°ì¹˜ ì•Šì€ ìƒíƒœ %1$d번"
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "ìƒíƒœ 머신 오류"
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "부ì ì ˆí•œ AcceptMessage"
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "부ì ì ˆí•œ RejectMessage"
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "부ì ì ˆí•œ ExitMessage"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "부ì ì ˆí•œ RestartMessage"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "부ì ì ˆí•œ AlertMessage"
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr "%s: 예기치 ì•Šì€ ìž…ì¶œë ¥ ë²„í¼ ë°œê²¬"
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "프로토콜 오류"
-#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
-#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
-#: plugins/sudoers/log_client.c:1618
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "부ì ì ˆí•œ IoBuffer"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "부ì ì ˆí•œ ChangeWindowSize"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "부ì ì ˆí•œ CommandSuspend"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "%2$zu í¬ê¸°ì˜ %1$sì„(를) 언팩할 수 없습니다"
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "%3$sì˜ %2$sì—ì„œ 예기지 ì•Šì€ type_case ê°’ %1$d"
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "ì¸ì‹í•  수 없는 ClientMessage 형ì‹"
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr "%s í´ë¼ì´ì–¸íŠ¸ ê¸°ë¡ ì‹œê°„ 초과"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr "%s í´ë¼ì´ì–¸íŠ¸ì—ì„œ ê¸°ë¡ ë²„í¼ ë¹ ì§"
-#: logsrvd/logsrvd.c:982
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr "%s í´ë¼ì´ì–¸íŠ¸ì—ì„œ ì½ê¸° 시간 초과"
-#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "ì ì ˆí•œ TLS 셧다운 미ì´í–‰ì„ ë™ë°˜í•œ %sì˜ íŒŒì¼ë(EOF)"
-#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:716
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr "í´ë¼ì´ì–¸ë“œ 메시지가 너무 ê¹ë‹ˆë‹¤: %zu"
-#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "í´ë¼ì´ì–¸íŠ¸ 메시지가 너무 ê¹ë‹ˆë‹¤"
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "부ì ì ˆí•œ ClientMessage"
-#: logsrvd/logsrvd.c:1389
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "ì›ê²© IP 주소를 가져올 수 없습니다"
-#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
-#: plugins/sudoers/log_client.c:276
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "ssl ê°ì²´ì— ì‚¬ìš©ìž ë°ì´í„°ë¥¼ ë¶™ì¼ ìˆ˜ 없습니다: %s"
-#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "ê°ì²­ ì†Œì¼“ì„ ì„¤ì •í•  수 없습니다"
-#: logsrvd/logsrvd.c:1718
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr "예기치 ì•Šì€ ì‹œê·¸ë„ %d번"
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "sudo 로그 서버"
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "옵션:"
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "설정 íŒŒì¼ ê²½ë¡œ"
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "ë„ì›€ë§ ë©”ì‹œì§€ë¥¼ 표시한 후 빠져나갑니다"
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "프로세스를 í¬í‚¹í•˜ì§€ ì•Šê³ , í¬ê·¸ë¼ìš´ë“œì—ì„œ 실행"
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "ì—°ê²°ì´ ëŠì„ í™•ë¥ ì— ëŒ€í•œ 백분율"
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "버전 정보를 표시하고 빠져나갑니다"
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Protobuf-C 1.3 ì´ìƒì˜ ë²„ì „ì´ í•„ìš”í•©ë‹ˆë‹¤"
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "부ì ì ˆí•œ ìž„ì˜ ì² íšŒ ê°’: %s"
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:180
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s 버전 %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
-#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
-#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "ì•Œ 수 없는 ì‚¬ìš©ìž %s"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
-#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr "알 수 없는 그룹 %s"
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr "%s 입출력 로그 모드를 í•´ì„í•  수 없습니다"
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr "부ì ì ˆí•œ %s ê°’: %s"
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "TLS를 지ì›í•˜ì§€ 않습니다"
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s: 완전하지 ì•Šì€ ê²½ë¡œ"
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr "알 수 없는 syslog 수단 %s"
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr "알 수 없는 syslog 우선 순위 %s"
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s:%d ì¼ì¹˜í•˜ì§€ 않는 '[': %s"
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr "%s:%d ']' ë‹¤ìŒ ë²„ë¦¬ëŠ” ë‚´ìš©: %s"
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s:%d 부ì ì ˆí•œ 설정 섹션: %s"
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s:%d 부ì ì ˆí•œ 설정 í–‰: %s"
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d(ì—)ì„œ 섹션 ì´ë¦„ì´ ë‚˜ì™€ì•¼ 합니다: %s"
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] ìž˜ëª»ëœ í‚¤: %s"
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:1035
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr "%s 로그 파ì¼ì„ ì—´ 수 없습니다"
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "서버 TLS 컨í…스트를 초기화할 수 없습니다"
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "ë¦´ë ˆì´ TLS 컨í…스트를 초기화할 수 없습니다"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
-#: logsrvd/logsrvd_journal.c:416
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "ì €ë„ íŒŒì¼ì„ 만들 수 없습니다"
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1020
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr "%sì„(를) 잠글 수 없습니다"
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "ì €ë„ íŒŒì¼ì„ 잠글 수 없습니다"
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr "ì €ë„ íŒŒì¼ì„ ì—´ 수 없습니다"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
-#: logsrvd/logsrvd_journal.c:452
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "ì €ë„ íŒŒì¼ì„ 기ë¡í•  수 없습니다"
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "ì €ë„ íŒŒì¼ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다"
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "ì €ë„ íŒŒì¼ ì½ëŠ” 중 예기치 ì•Šì€ íŒŒì¼ ë 발견"
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "ì €ë„ íŒŒì¼ ì½ê¸° 오류"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "부ì ì ˆí•œ ì €ë„ íŒŒì¼. 다시 시작할 수 없습니다"
-#: logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "%3$s ì €ë„ íŒŒì¼ì—ì„œ [%1$lld, %2$ld] 위치를 íƒìƒ‰í•  수 없습니다"
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "%3$sì˜ %2$sì—ì„œ 예기지 ì•Šì€ value_case ê°’ %1$d"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "AcceptMessage í•´ì„ ì˜¤ë¥˜"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "입출력 로그 만드는 중 오류"
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "ìˆ˜ë½ ì´ë²¤íŠ¸ 로깅 중 오류"
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "RejectMessage í•´ì„ ì˜¤ë¥˜"
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "ê±°ì ˆ ì´ë²¤íŠ¸ 로깅 중 오류"
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr "ë내기 ì´ë²¤íŠ¸ ê¸°ë¡ ì˜¤ë¥˜"
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "로그를 ì´ë¯¸ ë냈으며, 다시 시작할 수 없습니다"
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "로그를 다시 시작할 수 없습니다"
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "AlertMessage í•´ì„ ì˜¤ë¥˜"
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "경고 ì´ë²¤íŠ¸ 로깅 중 오류"
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr "ê¸¸ì´ %dì¸ íƒ€ì´ë° 버í¼ë¥¼ í¬ë§¤íŒ…í•  수 없습니다"
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr "%s/%s: %s"
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr "ì—°ê²°ì´ ìž„ì˜ë¡œ ëŠê¹€"
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "입출력 ë²„í¼ ê¸°ë¡ ì¤‘ 오류"
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "ChangeWindowSize ê¸°ë¡ ì¤‘ 오류"
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "CommandSuspend ê¸°ë¡ ì¤‘ 오류"
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "ë¦´ë ˆì´ í˜¸ìŠ¤íŠ¸ì™€ì˜ TLS 핸드 ì…°ì´í¬ 실패"
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "ë¦´ë ˆì´ í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•  수 없습니다"
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s: 부ì ì ˆí•œ ServerHello, server_idê°€ 빠졌습니다"
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1504
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "부ì ì ˆí•œ ServerHello"
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "ì¸ì‹í•  수 없는 ServerMessage 형ì‹"
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr "ë¦´ë ˆì´ %sì—ì„œ ì½ê¸° 시간 초과 (%s)"
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "ë¦´ë ˆì´ ë°ì´í„° ì½ê¸° 시간 초과"
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "ë¦´ë ˆì´ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì´ ì¸ì¦ì„œì™€ ì¼ì¹˜í•˜ì§€ 않습니다"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
-#: logsrvd/logsrvd_relay.c:784
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "ë¦´ë ˆì´ ë°ì´í„° ì½ëŠ” 중 오류"
-#: logsrvd/logsrvd_relay.c:805
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "ë¦´ë ˆì´ ë°ì´í„°ë¥¼ ì½ì„ 수 없습니다"
-#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "ë¦´ë ˆì´ ì„œë²„ ì—°ê²°ì„ ëŠì—ˆìŠµë‹ˆë‹¤"
-#: logsrvd/logsrvd_relay.c:838
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "서버 메시지가 너무 ê¹ë‹ˆë‹¤"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "ë¦´ë ˆì´ %sì— ê¸°ë¡ ì‹œê°„ 초과 (%s)"
-#: logsrvd/logsrvd_relay.c:904
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "ë¦´ë ˆì´ ê¸°ë¡ ì‹œê°„ 초과"
-#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
-#: logsrvd/logsrvd_relay.c:974
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "ë¦´ë ˆì´ ê¸°ë¡ ì¤‘ 오류"
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "ì›ê²© ì„œë²„ì— sudo 입출력 로그를 보냅니다"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "허용 ì´ë²¤íŠ¸ë§Œ 보냅니다 (입출력 안함)"
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "ì„œë²„ì˜ ì¸ì¦ì„œ ê²€ì¦ì— 활용할 ì¸ì¦ì„œ 번들 파ì¼"
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "TLS 암호 키 êµí™˜ì— 사용할 ì¸ì¦ì„œ 파ì¼"
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "로그를 보낼 호스트"
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "다시 진행할 입출력 ë¡œê·¸ì˜ ì›ê²© ID"
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "ê°œì¸ í‚¤ 파ì¼"
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "서버 ì¸ì¦ì„œë¥¼ ê²€ì¦í•˜ì§€ 않습니다"
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•  ë•Œ 활용할 í¬íŠ¸ 번호"
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "ì´ì „ 입출력 로그 ì „ì†¡ì„ ë‹¤ì‹œ 시작합니다"
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "주어진 사유로 명령 ì‹¤í–‰ì„ ê±°ì ˆí•©ë‹ˆë‹¤"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr "ì´ ì‹œê°„ì— ë„달한 후 전송 중단"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "ì„ íƒí•œ 입출력 로그를 ë™ì‹œì— N번 ë³´ë‚´ì–´ ê°ì‚¬ 서버 시험"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "%s:%sì„(를) ì°¾ì„ ìˆ˜ 없습니다: %s"
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "서버 IP 주소를 가져올 수 없습니다"
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "%s/%sì„(를) ì½ì„ 수 없습니다: %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
-#: plugins/sudoers/iolog.c:1024
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "예기치 ì•Šì€ ìž…ì¶œë ¥ ì´ë²¤íŠ¸ %d"
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
-#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: 예기치 ì•Šì€ ìƒíƒœ 번호 %d"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "서버로부터 오류 메시지를 받았습니다: %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "서버로부터 중단 메시지를 받았습니다: %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: 예기지 ì•Šì€ type_case ê°’ %d"
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "서버 ë°ì´í„° ì½ê¸° 시간 초과"
-#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
msgid "host name does not match certificate"
msgstr "호스트 ì´ë¦„ì´ ì¸ì¦ì„œì™€ ì¼ì¹˜í•˜ì§€ 않습니다"
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "갑작스러운 EOF"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "서버 메시지가 너무 ê¹ë‹ˆë‹¤: %u"
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "서버 ê¸°ë¡ ì‹œê°„ 초과"
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "다시 시작 지ì ê³¼ 입출력 로그 ID를 반드시 지정해야합니다"
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "ìž…ì¶œë ¥ì„ ë³´ë‚´ì§€ ì•Šì„ ë•Œ 다시 시작 지ì ì„ 지정하지 않습니다"
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "%d ìƒíƒœë¡œ ê°‘ìžê¸° 빠져나왔습니다"
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "경과 ì‹œê°„ì„ ì„œë²„ë¡œ 보냈습니다 [%lld, %ld]"
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "제출 ì§€ì  ì •ë³´ë¥¼ 서버로부터 받았습니다 [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "TLS 핸드셰ì´í¬ ì‹œê°„ì„ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤"
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "ì´ë²¤íŠ¸ë¥¼ 설정할 수 없습니다"
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "TLS 연결 실패: %s"
-#: logsrvd/tls_client.c:191
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "SSL ê°ì²´ë¥¼ 할당할 수 없습니다: %s"
-#: logsrvd/tls_client.c:205
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "SSL ê°ì²´ì— ì†Œì¼“ì„ ë¶™ì¼ ìˆ˜ 없습니다: %s"
-#: logsrvd/tls_client.c:233
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr "TLS 컨í…스트를 초기화할 수 없습니다"
-#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "%sì— TLS 1.2 암호 모ìŒì„ 설정할 수 없습니다: %s"
-#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "%sì— TLS 1.3 암호 모ìŒì„ 설정할 수 없습니다: %s"
-#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "디피-헬먼 매개변수를 설정할 수 없습니다: %s"
-#: logsrvd/tls_init.c:277
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr "TLS 컨í…스트를 만들 수 없습니다: %s"
-#: logsrvd/tls_init.c:284
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "TLS 프로토콜 최소 ë²„ì „ì„ 1.2ë¡œ 설정할 수 없습니다: %s"
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
-#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
-#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
-#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
-#: plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "ì¼ì‹œ 정보를 가져올 수 없습니다"
@@ -1502,7 +1564,7 @@ msgstr "계정 ê¸°í•œì´ ì§€ë‚¬ê±°ë‚˜ PAM ì„¤ì •ì— sudoì—ì„œ 확ì¸í•  \"accou
msgid "PAM account management error: %s"
msgstr "PAM 계정 관리 오류: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— 없습니다"
@@ -1575,17 +1637,17 @@ msgstr "ê°ì‚¬ ìƒíƒœë¥¼ ê²°ì •í•  수 없습니다"
msgid "unable to commit audit record"
msgstr "ê°ì‚¬ 레코드를 제출할 수 없습니다"
-#: plugins/sudoers/check.c:275
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "%s 지시 íŒŒì¼ ì½ê¸° 오류"
-#: plugins/sudoers/check.c:278
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "%s 지시 íŒŒì¼ ë¬´ì‹œ: ì¼ë°˜ 파ì¼ì´ 아닙니다"
-#: plugins/sudoers/check.c:291
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1605,14 +1667,14 @@ msgstr ""
" #3) 막강한 힘ì—는 ìƒë‹¹í•œ ì±…ìž„ì´ ë’¤ë”°ë¦…ë‹ˆë‹¤.\n"
"\n"
-#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
-#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "알 수 없는 uid %u"
-#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
msgid "%s: %s\n"
msgstr "%s: %s\n"
@@ -1642,7 +1704,7 @@ msgstr "순서 시작: %s: %s"
msgid "order padding: %s: %s"
msgstr "순서 패딩: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "%s 문법 버전 %d\n"
@@ -1662,14 +1724,14 @@ msgstr "지ì›í•˜ì§€ 않는 %s 출력 형ì‹"
msgid "%s: input and output files must be different"
msgstr "%s: 입출력 파ì¼ì€ 달ë¼ì•¼í•©ë‹ˆë‹¤"
-#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:165
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
-#: plugins/sudoers/visudo.c:969
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "sudoers 기본 ê°’ì„ ì´ˆê¸°í™”í•  수 없습니다"
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s: %s: %s: %s"
@@ -1694,18 +1756,18 @@ msgstr "부ì ì ˆí•œ ìƒëžµ 형ì‹: %s"
msgid "invalid filter: %s"
msgstr "부ì ì ˆí•œ í•„í„°: %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, c-format
msgid "failed to parse %s file, unknown error"
msgstr "%s íŒŒì¼ í•´ì„ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. ì•Œ 수 없는 오류."
#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "%sì— ê¸°ë¡í•  수 없습니다"
-#: plugins/sudoers/cvtsudoers.c:1501
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1714,7 +1776,7 @@ msgstr ""
"%s - sudoers íŒŒì¼ í˜•ì‹ì„ 변환합니다\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1503
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -2167,359 +2229,383 @@ msgid "Log user's input for the command being run"
msgstr "실행 ëª…ë ¹ì— ëŒ€í•œ ì‚¬ìš©ìž ìž…ë ¥ 기ë¡"
#: plugins/sudoers/def_data.c:356
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "터미ë„ì— ì—°ê²°í•˜ì§€ ì•Šì•˜ì„ ê²½ìš° 명령 표준 ìž…ë ¥ì„ ê¸°ë¡"
+
+#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "실행 ëª…ë ¹ì˜ í„°ë¯¸ë„ ìž…ë ¥ì„ ê¸°ë¡í•©ë‹ˆë‹¤"
+
+#: plugins/sudoers/def_data.c:364
msgid "Log the output of the command being run"
msgstr "실행 ëª…ë ¹ì— ëŒ€í•œ 출력 기ë¡"
-#: plugins/sudoers/def_data.c:360
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "터미ë„ì— ì—°ê²°í•˜ì§€ ì•Šì•˜ì„ ê²½ìš° 명령 표준 ì¶œë ¥ì„ ê¸°ë¡"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "터미ë„ì— ì—°ê²°í•˜ì§€ ì•Šì•˜ì„ ê²½ìš° 명령 표준 오류를 기ë¡"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "실행 ëª…ë ¹ì˜ í„°ë¯¸ë„ ì¶œë ¥ì„ ê¸°ë¡í•©ë‹ˆë‹¤"
+
+#: plugins/sudoers/def_data.c:380
msgid "Compress I/O logs using zlib"
msgstr "zlib로 입출력 로그 압축"
-#: plugins/sudoers/def_data.c:364
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "í•­ìƒ ëª…ë ¹ì„ ìœ ì‚¬ ttyì—ì„œ 실행"
-#: plugins/sudoers/def_data.c:368
+#: plugins/sudoers/def_data.c:388
#, c-format
msgid "Plugin for non-Unix group support: %s"
msgstr "비 유닉스 ê·¸ë£¹ì„ ì§€ì›í•˜ëŠ” 플러그ì¸: %s"
-#: plugins/sudoers/def_data.c:372
+#: plugins/sudoers/def_data.c:392
#, c-format
msgid "Directory in which to store input/output logs: %s"
msgstr "입출력 로그를 저장할 디렉터리: %s"
-#: plugins/sudoers/def_data.c:376
+#: plugins/sudoers/def_data.c:396
#, c-format
msgid "File in which to store the input/output log: %s"
msgstr "입출력 로그를 저장할 파ì¼: %s"
-#: plugins/sudoers/def_data.c:380
+#: plugins/sudoers/def_data.c:400
msgid "Add an entry to the utmp/utmpx file when allocating a pty"
msgstr "pty를 할당할 ë•Œ utmp/utmpx 파ì¼ì— 항목 추가"
-#: plugins/sudoers/def_data.c:384
+#: plugins/sudoers/def_data.c:404
msgid "Set the user in utmp to the runas user, not the invoking user"
msgstr "utmpì˜ ì‚¬ìš©ìžë¥¼ 실제 실행 사용ìžê°€ ì•„ë‹Œ 대리 실행 사용ìžë¡œ 설정"
-#: plugins/sudoers/def_data.c:388
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "권한 허용 설정: %s"
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "권한 제한 설정: %s"
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr "백그ë¼ìš´ë“œì˜ ptyì—ì„œ ëª…ë ¹ì„ ì‹¤í–‰í•©ë‹ˆë‹¤"
-#: plugins/sudoers/def_data.c:400
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "사용할 PAM 서비스 ì´ë¦„: %s"
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:424
#, c-format
msgid "PAM service name to use for login shells: %s"
msgstr "ë¡œê·¸ì¸ ì…¸ì—ì„œ 사용할 PAM 서비스 ì´ë¦„: %s"
-#: plugins/sudoers/def_data.c:408
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "sudo를 -A 옵션으로 실행할 ë•Œ 활용할 PAM 서비스 ì´ë¦„: %s"
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:432
msgid "Attempt to establish PAM credentials for the target user"
msgstr "ëŒ€ìƒ ì‚¬ìš©ìžì˜ PAM ì¸ì¦ 처리 ì‹œë„합니다"
-#: plugins/sudoers/def_data.c:416
+#: plugins/sudoers/def_data.c:436
msgid "Create a new PAM session for the command to run in"
msgstr "실행할 ëª…ë ¹ì— ìƒˆ PAM ì„¸ì…˜ì„ ë§Œë“­ë‹ˆë‹¤"
-#: plugins/sudoers/def_data.c:420
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "PAM 계정 ê²€ì¦ ê´€ë¦¬ë¥¼ 수행합니다"
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "최대 입출력 로그 순차 번호: %s"
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "sudoersì— ë„¤íŠ¸ì›Œí¬ ê·¸ë£¹ ì§€ì› í™œì„±í™”"
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:452
msgid "Check parent directories for writability when editing files with sudoedit"
msgstr "sudoeditë¡œ 파ì¼ì„ 편집할 ë•Œ ìƒìœ„ 디렉터리 ê¸°ë¡ ê°€ëŠ¥ 여부 확ì¸"
-#: plugins/sudoers/def_data.c:436
+#: plugins/sudoers/def_data.c:456
msgid "Follow symbolic links when editing files with sudoedit"
msgstr "sudoeditë¡œ 파ì¼ì„ 편집할 ë•Œ 심볼릭 ë§í¬ ë”°ë¼ê°"
-#: plugins/sudoers/def_data.c:440
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr "ì•Œ 수 없는 시스템 ê·¸ë£¹ì— ê·¸ë£¹ í”ŒëŸ¬ê·¸ì¸ ìš”ì²­"
-#: plugins/sudoers/def_data.c:444
+#: plugins/sudoers/def_data.c:464
msgid "Match netgroups based on the entire tuple: user, host and domain"
msgstr "user, host, domain ì „ì²´ íŠœí”Œì„ ê¸°ë°˜ìœ¼ë¡œ ë„¤íŠ¸ì›Œí¬ ê·¸ë£¹ 비êµ"
-#: plugins/sudoers/def_data.c:448
+#: plugins/sudoers/def_data.c:468
msgid "Allow commands to be run even if sudo cannot write to the audit log"
msgstr "sudoì—ì„œ ê°ì‹œ 로그를 기ë¡í•  수 ì—†ì„ ê²½ìš°ì—ë„ ëª…ë ¹ 실행 허용"
-#: plugins/sudoers/def_data.c:452
+#: plugins/sudoers/def_data.c:472
msgid "Allow commands to be run even if sudo cannot write to the I/O log"
msgstr "sudoì—ì„œ 입출력 로그를 기ë¡í•  수 ì—†ì„ ê²½ìš°ì—ë„ ëª…ë ¹ 실행 허용"
-#: plugins/sudoers/def_data.c:456
+#: plugins/sudoers/def_data.c:476
msgid "Allow commands to be run even if sudo cannot write to the log file"
msgstr "sudoì—ì„œ 로그 파ì¼ì— 기ë¡í•  수 ì—†ì„ ê²½ìš°ì—ë„ ëª…ë ¹ 실행 허용"
-#: plugins/sudoers/def_data.c:460
+#: plugins/sudoers/def_data.c:480
msgid "Resolve groups in sudoers and match on the group ID, not the name"
msgstr "sudoersì˜ ê·¸ë£¹ì„ í•´ì„하고 그룹 ì´ë¦„ì´ ì•„ë‹Œ ID와 비êµ"
-#: plugins/sudoers/def_data.c:464
+#: plugins/sudoers/def_data.c:484
#, 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:468
+#: plugins/sudoers/def_data.c:488
#, c-format
msgid "User that will own the I/O log files: %s"
msgstr "입출력 로그 파ì¼ì„ 소유할 사용ìž: %s"
-#: plugins/sudoers/def_data.c:472
+#: plugins/sudoers/def_data.c:492
#, c-format
msgid "Group that will own the I/O log files: %s"
msgstr "입출력 로그 파ì¼ì„ 소유할 그룹: %s"
-#: plugins/sudoers/def_data.c:476
+#: plugins/sudoers/def_data.c:496
#, c-format
msgid "File mode to use for the I/O log files: 0%o"
msgstr "입출력 로그 파ì¼ì— 사용할 íŒŒì¼ ëª¨ë“œ: 0%o"
-#: plugins/sudoers/def_data.c:480
+#: plugins/sudoers/def_data.c:500
#, c-format
msgid "Execute commands by file descriptor instead of by path: %s"
msgstr "경로가 ì•„ë‹Œ íŒŒì¼ ì„œìˆ ìžë¡œ 명령어 실행: %s"
-#: plugins/sudoers/def_data.c:484
+#: plugins/sudoers/def_data.c:504
msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
msgstr "경고를 출력하는 대신 sudoersì—ì„œ ì•Œ 수 없는 기본 í•­ëª©ì„ ë¬´ì‹œ"
-#: plugins/sudoers/def_data.c:488
+#: plugins/sudoers/def_data.c:508
#, c-format
msgid "Time in seconds after which the command will be terminated: %u"
msgstr "명령 처리가 ëë‚œ í›„ì˜ ì´ˆ 단위 시간: %u"
-#: plugins/sudoers/def_data.c:492
+#: plugins/sudoers/def_data.c:512
msgid "Allow the user to specify a timeout on the command line"
msgstr "사용ìžê°€ 명령행ì—ì„œ 제한 ì‹œê°„ì„ ì§€ì •í•˜ë„ë¡ í—ˆìš©"
-#: plugins/sudoers/def_data.c:496
+#: plugins/sudoers/def_data.c:516
msgid "Flush I/O log data to disk immediately instead of buffering it"
msgstr "입출력 로그 ë°ì´í„°ë¥¼ 버í¼ë§í•˜ëŠ” 대신 즉시 디스í¬ë¡œ 플러싱"
-#: plugins/sudoers/def_data.c:500
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr "syslogë¡œ 로깅할 ë•Œ 프로세스 ID í¬í•¨"
-#: plugins/sudoers/def_data.c:504
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "ì¸ì¦ 타임스탬프 레코드 형ì‹: %s"
-#: plugins/sudoers/def_data.c:508
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "ì¸ì¦ 실패 메시지: %s"
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "ì‚¬ìš©ìž ì´ë¦„ 비êµì‹œ ëŒ€ì†Œë¬¸ìž ë¬´ì‹œ"
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "그룹 ì´ë¦„ 비êµì‹œ ëŒ€ì†Œë¬¸ìž ë¬´ì‹œ"
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr "sudoersì—ì„œ ëª…ë ¹ì„ í—ˆìš©í•  ë•Œ 기ë¡"
-#: plugins/sudoers/def_data.c:524
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "sudoersì—ì„œ ëª…ë ¹ì„ ê±°ì ˆí•  ë•Œ 기ë¡"
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "개별 í¬íŠ¸ 정보를 추가하여 ì—°ê²°í•  sudo 로그 서버"
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "초 단위 sudo 로그 서버 제한 시간: %u"
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "ì—°ê²°í•œ 로그 서버 ì†Œì¼“ì— SO_KEEPALIVE 소켓 옵션 활성화"
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "ê°ì‚¬ ì„œë²„ì˜ CA 번들 íŒŒì¼ ê²½ë¡œ: %s"
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "sudoers ì¸ì¦ íŒŒì¼ ê²½ë¡œ: %s"
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "sudoers ê°œì¸ í‚¤ íŒŒì¼ ê²½ë¡œ: %s"
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "로그 서버 ì¸ì¦ì„œ 유효성 ê²€ì¦"
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "사용ìž/그룹 IDë¡œì˜ ì•Œ 수 없는 실행 허용"
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "유효한 ì…¸ì—ì„œ 사용ìžê°€ ëª…ë ¹ì„ ì‹¤í–‰í•  경우만 허용"
-#: plugins/sudoers/def_data.c:564
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "sudo를 실행하는 사용ìžë¥¼ PAM ì›ê²© 사용ìžë¡œ 설정"
-#: plugins/sudoers/def_data.c:568
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "로컬 호스트 ì´ë¦„ì— PAM ì›ê²© ì‚¬ìš©ìž ì„¤ì •"
-#: plugins/sudoers/def_data.c:572
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "명령 실행 전 바꿀 작업 디렉터리: %s"
-#: plugins/sudoers/def_data.c:576
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "명령 실행 전 바꿀 루트 디렉터리: %s"
-#: plugins/sudoers/def_data.c:580
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "로그 ê¸°ë¡ í˜•ì‹: %s"
-#: plugins/sudoers/def_data.c:584
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "SELinux RBAC 지ì›ì„ 사용합니다"
-#: plugins/sudoers/def_data.c:588
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "sudo를 ì²˜ìŒ ì‹¤í–‰í•  ë•Œ 만든 파ì¼ì˜ 경로: %s"
-#: plugins/sudoers/def_data.c:592
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "추가 ëª…ë ¹ì„ ê°€ë¡œì±„ê³  sudoer ì œí•œì„ ì ìš©í•©ë‹ˆë‹¤"
-#: plugins/sudoers/def_data.c:596
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr "ì›ë³¸ 명령으로 실행하는 하위 명령 기ë¡"
-#: plugins/sudoers/def_data.c:600
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr "실행 명령 ë내기 ìƒíƒœ 기ë¡"
-#: plugins/sudoers/def_data.c:604
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "가로챈 세션ì—ì„œì˜ ìˆœì°¨ 명령 실행시 ì¸ì¦í•´ì•¼ 합니다"
-#: plugins/sudoers/def_data.c:608
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "setuid ë˜ëŠ” setgid í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•  가로채기 명령 실행 허용"
-#: plugins/sudoers/def_data.c:612
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "프로세스 주소 ì˜ì—­ì„ 확장할 최대 í¬ê¸°(ë°”ì´íŠ¸ 단위): %s"
-#: plugins/sudoers/def_data.c:616
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "코어 ë¤í”„ íŒŒì¼ ìµœëŒ€ ìƒì„± í¬ê¸°(ë°”ì´íŠ¸ 단위): %s"
-#: plugins/sudoers/def_data.c:620
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "프로세스 최대 CPU 사용 시간(초 단위): %s"
-#: plugins/sudoers/def_data.c:624
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "프로세스 ë°ì´í„° 세그먼트 최대 í¬ê¸°(ë°”ì´íŠ¸ 단위): %s"
-#: plugins/sudoers/def_data.c:628
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "프로세스ì—ì„œ 만들 최대 íŒŒì¼ í¬ê¸°(ë°”ì´íŠ¸ 단위): %s"
-#: plugins/sudoers/def_data.c:632
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "프로세스 실행 최대 잠금 횟수: %s"
-#: plugins/sudoers/def_data.c:636
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "메모리ì—ì„œ 잠글 프로세스 최대 í¬ê¸°(ë°”ì´íŠ¸ 단위): %s"
-#: plugins/sudoers/def_data.c:640
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "프로세스ì—ì„œ ì—´ íŒŒì¼ ìµœëŒ€ 갯수: %s"
-#: plugins/sudoers/def_data.c:644
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "사용ìžê°€ ë™ì‹œ 실행할 최대 프로세스 갯수: %s"
-#: plugins/sudoers/def_data.c:648
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "프로세스 ìƒì£¼ì‹œ 최대 확장 í¬ê¸°(ë°”ì´íŠ¸ 단위): %s"
-#: plugins/sudoers/def_data.c:652
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "프로세스 ìŠ¤íƒ í¬ê¸° ì¦ê°€ 최대 í¬ê¸°(ë°”ì´íŠ¸ 단위): %s"
-#: plugins/sudoers/def_data.c:656
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr "비 ëŒ€í™”ì‹ ìƒíƒœì—ì„œë„ ì¸ì¦ ì‹œë„"
-#: plugins/sudoers/def_data.c:660
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr "I/O 로그 입력시 ì›ë¬¸ 암호 저장"
-#: plugins/sudoers/def_data.c:664
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr "암호 프롬프트 대조시 사용할 ì •ê·œ í‘œí˜„ì‹ ëª©ë¡"
-#: plugins/sudoers/def_data.c:668
+#: plugins/sudoers/def_data.c:688
#, c-format
msgid "The mechanism used by the intercept and log_subcmds options: %s"
msgstr "intercept 옵션과 log_subcmds 옵션ì—ì„œ 지ì›í•˜ëŠ” 매커니즘: %s"
-#: plugins/sudoers/def_data.c:672
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "실행 후 명령 ë° ì¸ìž ê²€ì¦ ì‹œë„"
+
+#: plugins/sudoers/def_data.c:696
#, c-format
msgid "AppArmor profile to use in the new security context: %s"
msgstr "새 보안 컨í…스트ì—ì„œ 활용할 AppArmor 프로파ì¼: %s"
@@ -2554,31 +2640,31 @@ msgstr "\"%2$s\" ì˜µì…˜ì˜ ë¶€ì ì ˆí•œ 기본 í˜•ì‹ 0x%1$x"
msgid "value \"%s\" is invalid for option \"%s\""
msgstr "\"%s\" ê°’ì€ \"%s\" ì˜µì…˜ì— ë§žì§€ 않습니다"
-#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
-#: plugins/sudoers/policy.c:216
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
msgid "path name for \"%s\" too long"
msgstr "\"%s\" 경로 ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤"
-#: plugins/sudoers/defaults.c:1133
+#: plugins/sudoers/defaults.c:1134
#, c-format
msgid "values for \"%s\" must start with a '/', '~', or '*'"
msgstr "\"%s\" ê°’ì€ '/', '~', '*' 문ìžë¡œ 시작해야합니다"
-#: plugins/sudoers/defaults.c:1140
+#: plugins/sudoers/defaults.c:1141
#, c-format
msgid "values for \"%s\" must start with a '/'"
msgstr "\"%s\" ê°’ì€ '/' 문ìžë¡œ 시작해야합니다"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv: envpê°€ 깨졌습니다. 길ì´ê°€ ì¼ì¹˜í•˜ì§€ 않습니다"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "환경 êµ¬ì„±ì„ ë‹¤ì‹œ 갖출 수 없습니다"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, c-format
msgid "sorry, you are not allowed to set the following environment variables: %s"
msgstr "죄송하지만 ë‹¤ìŒ í™˜ê²½ 변수를 설정하ë„ë¡ í—ˆê°€ë°›ì§€ 않았습니다: %s"
@@ -2593,27 +2679,27 @@ msgstr "%2$sì—ì„œ 지ì›í•˜ì§€ 않는 다ì´ì œìŠ¤íŠ¸ í˜•ì‹ %1$d"
msgid "%s: read error"
msgstr "%s: ì½ê¸° 오류"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%sì€(는) %d uidê°€ 소유해야 합니다"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, c-format
msgid "%s must only be writable by owner"
msgstr "%sì€(는) 소유ìžë§Œ 쓸 수 있습니다"
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "%sì„(를) 불러올 수 없습니다: %s"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, c-format
msgid "unable to find symbol \"group_plugin\" in %s"
msgstr "%sì—ì„œ \"group_plugin\" ì‹¬ë³¼ì„ ì°¾ì„ ìˆ˜ 없습니다"
-#: plugins/sudoers/group_plugin.c:107
+#: plugins/sudoers/group_plugin.c:202
#, c-format
msgid "%s: incompatible group plugin major version %d, expected %d"
msgstr "%s: 호환ë˜ì§€ 않는 그룹 í”ŒëŸ¬ê·¸ì¸ ì£¼ 버전 %d입니다. %dì´(ê°€) 필요합니다."
@@ -2636,10 +2722,10 @@ msgstr "로컬 IP 주소 ë° ë„·ë§ˆìŠ¤í¬ ìŒ:\n"
msgid "unable to update sequence file"
msgstr "시퀀스 파ì¼ì„ ì—…ë°ì´íŠ¸í•  수 없습니다"
-#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
-#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
-#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
-#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "입출력 ë¡œê·¸ì— ê¸°ë¡í•  수 없습니다: %s"
@@ -2649,25 +2735,25 @@ msgstr "입출력 ë¡œê·¸ì— ê¸°ë¡í•  수 없습니다: %s"
msgid "unable to create %s/%s"
msgstr "%s/%sì„(를) 만들 수 없습니다"
-#: plugins/sudoers/iolog.c:955
+#: plugins/sudoers/iolog.c:957
#, c-format
msgid "%s: internal error, I/O log file for event %d not open"
msgstr "%s: 내부 오류. ì´ë²¤íŠ¸ %d ë²ˆì˜ ìž…ì¶œë ¥ 로그 파ì¼ì„ 열지 않았습니다"
-#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1182
-#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
-#: plugins/sudoers/visudo.c:552
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "í´ë¡ì„ ì½ì„ 수 없습니다"
-#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
-#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: 내부 오류. 부ì ì ˆí•œ ì‹œê·¸ë„ %d번"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "ldaps를 사용할 ë•Œ starttls를 지ì›í•˜ì§€ 않습니다"
@@ -2690,7 +2776,7 @@ msgstr "LDAP를 초기화할 수 없습니다: %s"
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:1886 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "부ì ì ˆí•œ sudoOrder ì†ì„±: %s"
@@ -2700,12 +2786,12 @@ msgstr "부ì ì ˆí•œ sudoOrder ì†ì„±: %s"
msgid "%s: port too large"
msgstr "%s: í¬íŠ¸ 번호가 너무 í½ë‹ˆë‹¤"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "지ì›í•˜ì§€ 않는 LDAP URI 형ì‹: %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "ldap ë° ldaps URI를 함께 사용할 수 없습니다"
@@ -2730,111 +2816,111 @@ msgstr "ê°ì‹œ ì‹œìŠ¤í…œì„ ì—´ 수 없습니다"
msgid "unable to send audit message"
msgstr "ê°ì‹œ 메시지를 보낼 수 없습니다"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
-#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "ì´ë²¤íŠ¸ 루프 오류"
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "SSL_CTX ê°ì²´ 만들기 실패: %s"
-#: plugins/sudoers/log_client.c:225
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "%s ì¸ì¦ì„œ ì¸ì¦ ë²ˆë“¤ì„ ë¶ˆëŸ¬ì˜¬ 수 없습니다"
-#: plugins/sudoers/log_client.c:247
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "%s ì¸ì¦ì„œë¥¼ 불러올 수 없습니다"
-#: plugins/sudoers/log_client.c:261
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "%s ê°œì¸ í‚¤ë¥¼ 불러올 수 없습니다"
-#: plugins/sudoers/log_client.c:270
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "SSL ê°ì²´ë¥¼ 할당할 수 없습니다: %s"
-#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "%s:%së¡œì˜ TLS ì—°ê²° 실패: %s"
-#: plugins/sudoers/log_client.c:538
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "TLS ì´ˆê¸°í™”ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤"
-#: plugins/sudoers/log_client.c:548
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "TLS 핸드셰ì´í‚¹ì— 실패했습니다"
-#: plugins/sudoers/log_client.c:1246
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: 내부 오류. 부ì ì ˆí•œ 종료 ìƒíƒœ %d"
-#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "로그 ì„œë²„ì˜ ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤"
-#: plugins/sudoers/log_client.c:1876
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "ê¸°ë¡ ë²„í¼ ë¹ ì§"
-#: plugins/sudoers/log_client.c:2024
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "로그 ì„œë²„ì— ì—°ê²°í•  수 없습니다"
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "사용ìžê°€ sudoersì— ì—†ìŠµë‹ˆë‹¤"
-#: plugins/sudoers/logging.c:300
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "사용ìžê°€ 호스트ì—ì„œ ì¸ì¦í•˜ì§€ 않았습니다"
-#: plugins/sudoers/logging.c:302
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "ëª…ë ¹ì„ í—ˆìš©í•˜ì§€ 않았습니다"
-#: plugins/sudoers/logging.c:323
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr "%sì€(는) sudoers 파ì¼ì— 없습니다.\n"
-#: plugins/sudoers/logging.c:326
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "%s 사용ìžëŠ” %sì—ì„œ sudo를 실행할 수 없습니다.\n"
-#: plugins/sudoers/logging.c:329
+#: plugins/sudoers/logging.c:321
#, c-format
msgid "Sorry, user %s may not run sudo on %s.\n"
msgstr "죄송하지만, %s 사용ìžëŠ” %sì—ì„œ sudo를 실행하면 안ë©ë‹ˆë‹¤.\n"
-#: plugins/sudoers/logging.c:332
+#: plugins/sudoers/logging.c:324
#, 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/logging.c:334
msgid "This incident has been reported to the administrator.\n"
msgstr "ì´ë²ˆ ì‹œë„는 관리ìžì—게 보고했습니다.\n"
-#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
-#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
-#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
-#: plugins/sudoers/sudoers.c:801
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s: ëª…ë ¹ì´ ì—†ìŠµë‹ˆë‹¤"
-#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2843,30 +2929,30 @@ msgstr ""
"'.'ì— ë¬´ì‹œ ì¤‘ì¸ \"%1$s\" 요소가 있습니다.\n"
"\"%3$s\" ëª…ë ¹ì„ ì‹¤í–‰í•˜ë ¤ë©´, \"sudo ./%2$s\" ëª…ë ¹ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤."
-#: plugins/sudoers/logging.c:395
+#: plugins/sudoers/logging.c:387
#, c-format
msgid "%u incorrect password attempt"
msgid_plural "%u incorrect password attempts"
msgstr[0] "ìž˜ëª»ëœ ì•”í˜¸ ìž…ë ¥ ì‹œë„ %u번"
-#: plugins/sudoers/logging.c:485
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "ì¸ì¦ 실패"
-#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "암호가 필요합니다"
-#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
msgid "problem parsing sudoers"
msgstr "sudoers í•´ì„ ë¬¸ì œ"
-#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
msgid "%s:%d:%d: %s"
msgstr "%s:%d:%d: %s"
-#: plugins/sudoers/logging.c:1068
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "로그 파ì¼ì— 기ë¡í•  수 없습니다: %s"
@@ -2881,7 +2967,7 @@ msgstr "%1$s 다ì´ì œìŠ¤íŠ¸(%2$s)는 %4$zu 길ì´ë¥¼ 기대했지만 잘못ëœ
msgid "digest for %s (%s) is not in %s form"
msgstr "%s 다ì´ì œìŠ¤íŠ¸(%s)는 %s 형ì‹ì´ 아닙니다"
-#: plugins/sudoers/parse.c:585
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2890,7 +2976,7 @@ msgstr ""
"\n"
"LDAP ì—­í• : %s\n"
-#: plugins/sudoers/parse.c:588
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2898,110 +2984,110 @@ msgstr ""
"\n"
"Sudoers 항목:\n"
-#: plugins/sudoers/parse.c:590
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " 실행 사용ìž: "
-#: plugins/sudoers/parse.c:605
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " 실행 그룹: "
-#: plugins/sudoers/parse.c:615
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " 옵션: "
-#: plugins/sudoers/parse.c:679
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " 명령:\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:876
#, c-format
msgid "Matching Defaults entries for %s on %s:\n"
msgstr "%2$sì—ì„œ %1$sì— ì¼ì¹˜í•˜ëŠ” 기본 항목:\n"
-#: plugins/sudoers/parse.c:888
+#: plugins/sudoers/parse.c:894
#, c-format
msgid "Runas and Command-specific defaults for %s:\n"
msgstr "%sì˜ ì‹¤í–‰ 권한 ë° ëª…ë ¹ë³„ 기본 ê°’:\n"
-#: plugins/sudoers/parse.c:906
+#: plugins/sudoers/parse.c:912
#, c-format
msgid "User %s may run the following commands on %s:\n"
msgstr "%s 사용ìžëŠ” %sì—ì„œ ë‹¤ìŒ ëª…ë ¹ì„ ì‹¤í–‰í•´ì•¼ 합니다:\n"
-#: plugins/sudoers/parse.c:921
+#: plugins/sudoers/parse.c:927
#, c-format
msgid "User %s is not allowed to run sudo on %s.\n"
msgstr "%s 사용ìžëŠ” %sì—ì„œ sudo를 실행하ë„ë¡ í—ˆê°€ë°›ì§€ 않았습니다.\n"
-#: plugins/sudoers/parse_ldif.c:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "미완결 sudoRole 무시: cn: %s"
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "부ì ì ˆí•œ LDIF ì†ì„±: %s"
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr "sudo í”„ë¡ íŠ¸ì—”ë“œì˜ %.*s ì„¤ì •ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤"
-#: plugins/sudoers/policy.c:351 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "ë„¤íŠ¸ì›Œí¬ ì£¼ì†Œ 목ë¡ì„ í•´ì„í•  수 없습니다"
-#: plugins/sudoers/policy.c:508
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr "sudo 프론트엔드ì—ì„œ ì‚¬ìš©ìž ì´ë¦„ì„ ì„¤ì •í•˜ì§€ 않았습니다"
-#: plugins/sudoers/policy.c:512
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr "sudo 프론트엔드ì—ì„œ ì‚¬ìš©ìž ID를 설정하지 않았습니다"
-#: plugins/sudoers/policy.c:516
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr "sudo 프론트엔드ì—ì„œ 그룹 ID를 지정하지 않았습니다"
-#: plugins/sudoers/policy.c:520
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr "sudo 프론트엔드ì—ì„œ 호스트 ì´ë¦„ì„ ì„¤ì •í•˜ì§€ 않았습니다"
-#: plugins/sudoers/policy.c:706
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "부ì ì ˆí•œ ìž‘ì—… 디렉터리: %s"
-#: plugins/sudoers/policy.c:886
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "부ì ì ˆí•œ 루트 변경 디렉터리: %s"
-#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "%sì„(를) 실행할 수 없습니다"
-#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
-#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: sudo í”„ë¡ íŠ¸ì—”ë“œì˜ ìƒíƒœ 플래그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: 0x%x"
-#: plugins/sudoers/policy.c:1262
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "Sudoers ì •ì±… í”ŒëŸ¬ê·¸ì¸ ë²„ì „ %s\n"
-#: plugins/sudoers/policy.c:1264
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "Sudoers íŒŒì¼ ë¬¸ë²• 버전 %d\n"
-#: plugins/sudoers/policy.c:1268
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -3010,27 +3096,27 @@ msgstr ""
"\n"
"Sudoers 경로: %s\n"
-#: plugins/sudoers/policy.c:1271
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "nsswitch 경로: %s\n"
-#: plugins/sudoers/policy.c:1273
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "ldap.conf 경로: %s\n"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "ldap.secret 경로: %s\n"
-#: plugins/sudoers/policy.c:1307
+#: plugins/sudoers/policy.c:1337
#, c-format
msgid "unable to register hook of type %d (version %d.%d)"
msgstr "%d 형ì‹ì˜ 후í¬ë¥¼ 등ë¡í•  수 없습니다(버전 %d.%d)"
-#: plugins/sudoers/policy.c:1325
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "%d 형ì‹ì˜ í›„í¬ ë“±ë¡ì„ 해제할 수 없습니다(버전 %d.%d)"
@@ -3103,7 +3189,7 @@ msgstr "%s 그룹 ID를 í•´ì„í•  수 없습니다"
#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1162
#: plugins/sudoers/set_perms.c:1460
msgid "perm stack overflow"
-msgstr "perm ìŠ¤íƒ ì˜¤ë²„í”Œë¡œìš°"
+msgstr "권한 ìŠ¤íƒ ì˜¤ë²„í”Œë¡œìš°"
#: plugins/sudoers/set_perms.c:125 plugins/sudoers/set_perms.c:376
#: plugins/sudoers/set_perms.c:456 plugins/sudoers/set_perms.c:719
@@ -3111,7 +3197,7 @@ msgstr "perm ìŠ¤íƒ ì˜¤ë²„í”Œë¡œìš°"
#: plugins/sudoers/set_perms.c:1173 plugins/sudoers/set_perms.c:1393
#: plugins/sudoers/set_perms.c:1471 plugins/sudoers/set_perms.c:1562
msgid "perm stack underflow"
-msgstr "parm ìŠ¤íƒ ì–¸ë”플로우"
+msgstr "권한 ìŠ¤íƒ ì–¸ë”플로우"
#: plugins/sudoers/set_perms.c:185 plugins/sudoers/set_perms.c:503
#: plugins/sudoers/set_perms.c:1227 plugins/sudoers/set_perms.c:1505
@@ -3169,148 +3255,142 @@ msgstr "SSS 소스를 초기화할 수 없습니다. ë¨¸ì‹ ì— SSSD를 설치했
msgid "unable to find symbol \"%s\" in %s"
msgstr "%2$sì—ì„œ \"%1$s\" ì‹¬ë³¼ì„ ì°¾ì„ ìˆ˜ 없습니다"
-#: plugins/sudoers/sudoers.c:258
+#: plugins/sudoers/sudoers.c:263
#, c-format
msgid "unable to get defaults from %s"
msgstr "%sì˜ ê¸°ë³¸ê°’ì„ ê°€ì ¸ì˜¬ 수 없습니다"
-#: plugins/sudoers/sudoers.c:265
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr "올바른 sudoers 설정 ì›ë³¸ì´ 없습니다. 나갑니다."
-#: plugins/sudoers/sudoers.c:341
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "%sì„(를) 루트 디렉터리로 변환하ë„ë¡ í—ˆìš©í•˜ì§€ 않습니다"
-#: plugins/sudoers/sudoers.c:343
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "-R 옵션과 %s ì˜µì…˜ì˜ ë³‘í–‰ ì‚¬ìš©ì„ í—ˆê°€ë°›ì§€ 않았습니다"
-#: plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "%s ë””ë ‰í„°ë¦¬ë¡œì˜ ì´ë™ì„ 허용하지 않습니다"
-#: plugins/sudoers/sudoers.c:369
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "-D 옵션과 %s ì˜µì…˜ì˜ ë³‘í–‰ ì‚¬ìš©ì„ í—ˆê°€ë°›ì§€ 않았습니다"
-#: plugins/sudoers/sudoers.c:396
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "지정한 ëª…ë ¹ì´ ì—†ìŒ"
-#: plugins/sudoers/sudoers.c:421
+#: plugins/sudoers/sudoers.c:426
msgid "sudoers specifies that root is not allowed to sudo"
msgstr "sudoersì—ì„œ rootê°€ sudo를 실행하지 못하게 지정했습니다"
-#: plugins/sudoers/sudoers.c:471
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "사용ìžê°€ closefrom 제한 ê°’ì„ ë”°ë¡œ ì ìš©í•˜ë„ë¡ í—ˆìš©í•˜ì§€ 않았습니다"
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "-C 옵션 ì‚¬ìš©ì„ í—ˆê°€ë°›ì§€ 않았습니다"
-#: plugins/sudoers/sudoers.c:532
+#: plugins/sudoers/sudoers.c:537
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr "타임스탬프 소유ìž(%s): ì‚¬ìš©ìž ì—†ìŒ"
-#: plugins/sudoers/sudoers.c:547
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "tty ì—†ìŒ"
-#: plugins/sudoers/sudoers.c:548
+#: plugins/sudoers/sudoers.c:553
msgid "sorry, you must have a tty to run sudo"
msgstr "죄송하지만 sudo를 실행하려면 tty를 확보해야합니다"
-#: plugins/sudoers/sudoers.c:555
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "%s 사용ìžì—게 부ì ì ˆí•œ ì…¸ 제공: %s"
-#: plugins/sudoers/sudoers.c:638
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "현재 ë””ë ‰í„°ë¦¬ì˜ ëª…ë ¹"
-#: plugins/sudoers/sudoers.c:653
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "\"cd\"는 ì…¸ 내장 명령으로, ì§ì ‘ 실행할 수 없습니다."
-#: plugins/sudoers/sudoers.c:655
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr "-s ì˜µì…˜ì€ ë³„ë„ ê¶Œí•œì„ ë¶€ì—¬í•œ ì…¸ì—ì„œ 실행할 ë•Œ 사용합니다."
-#: plugins/sudoers/sudoers.c:657
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr "-D ì˜µì…˜ì€ ì§€ì • 디렉터리ì—ì„œ ëª…ë ¹ì„ ì‹¤í–‰í•  ë•Œ 사용합니다."
-#: plugins/sudoers/sudoers.c:666
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "사용ìžê°€ 명령 처리 제한 ì‹œê°„ì„ ì„¤ì •í•˜ë„ë¡ í—ˆìš©í•˜ì§€ 않았습니다"
-#: plugins/sudoers/sudoers.c:668
+#: plugins/sudoers/sudoers.c:673
msgid "sorry, you are not allowed set a command timeout"
msgstr "죄송하지만, 명령 처리 제한 ì‹œê°„ì„ ì„¤ì •í•  수 없습니다"
-#: plugins/sudoers/sudoers.c:676
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "사용ìžê°€ 환경 설정 ê°’ì„ ìœ ì§€í•˜ë„ë¡ í—ˆìš©í•˜ì§€ 않았습니다"
-#: plugins/sudoers/sudoers.c:678
+#: plugins/sudoers/sudoers.c:683
msgid "sorry, you are not allowed to preserve the environment"
msgstr "죄송하지만 ì´ í™˜ê²½ ìƒíƒœë¥¼ 유지하ë„ë¡ í—ˆê°€ë°›ì§€ 않았습니다"
-#: plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "sudoedit는 sudo로 실행할 필요가 없습니다"
-#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "%sì„(를) ì½ì„ 수 없습니다"
-#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
-#: plugins/sudoers/visudo.c:764
-#, c-format
-msgid "unable to stat %s"
-msgstr "%sì˜ ìƒíƒœë¥¼ 가져올 수 없습니다"
-
-#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%sì€(는) ì¼ë°˜ 파ì¼ì´ 아닙니다"
-#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%sì€(는) %u uidê°€ 소유했지만, %u uidê°€ 소유해야합니다"
-#: plugins/sudoers/sudoers.c:1147 toke.l:1252
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "%sì— ëª¨ë‘ê°€ 기ë¡í•  수 있습니다"
-#: plugins/sudoers/sudoers.c:1151 toke.l:1255
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, c-format
msgid "%s is owned by gid %u, should be %u"
msgstr "%sì€(는) %u gidê°€ 소유했지만, %u gidê°€ 소유해야합니다"
-#: plugins/sudoers/sudoers.c:1184
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "루트만 \"-c %s\" ì˜µì…˜ì„ ì‚¬ìš©í•  수 있습니다"
-#: plugins/sudoers/sudoers.c:1203
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr "ì•Œ 수 없는 ë¡œê·¸ì¸ í´ëž˜ìŠ¤ %s"
-#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "%s 호스트를 í•´ì„í•  수 없습니다"
@@ -3408,17 +3488,17 @@ msgstr "ìž˜ëª»ëœ í›„ìœ„ ë¬¸ìž \"!\""
msgid "unknown search type %d"
msgstr "ì•Œ 수 없는 검색 í˜•ì‹ %d"
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, 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:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, c-format
msgid "usage: %s [-h] [-d dir] -l [search expression]\n"
msgstr "사용법: %s [-h] [-d <디렉터리>] -l [<검색ì‹>]\n"
-#: plugins/sudoers/sudoreplay.c:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -3427,7 +3507,7 @@ msgstr ""
"%s - sudo 세션 로그를 ë³´ì—¬ì¤ë‹ˆë‹¤\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3483,127 +3563,122 @@ msgstr ""
"\n"
"ëª…ë ¹ì´ ì¼ì¹˜í•˜ì§€ ì•ŠìŒ"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%sì€(는) ê·¸ë£¹ì´ ê¸°ë¡í•  수 있습니다"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, c-format
msgid "unable to truncate time stamp file to %lld bytes"
msgstr "타임스탬프 파ì¼ì„ %lld ë°”ì´íŠ¸ë¡œ ìžë¥¼ 수 없습니다"
-#: plugins/sudoers/timestamp.c:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "미래 타임스탬프 값 무시"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, c-format
msgid "time stamp too far in the future: %20.20s"
msgstr "타임스탬프 ê°’ì´ ë¯¸ëž˜ 값으로 너무 밀려있습니다: %20.20s"
-#: plugins/sudoers/timestamp.c:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "%s 타임스탬프 파ì¼ì„ 잠글 수 없습니다"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, c-format
-msgid "lecture status path too long: %s/%s"
-msgstr "지침 ìƒíƒœ 경로가 너무 ê¹ë‹ˆë‹¤: %s/%s"
-
#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "sudoeditì— ê²½ë¡œë¥¼ 지정하면 안ë©ë‹ˆë‹¤"
-#: plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:254
msgid "the -x option will be removed in a future release"
msgstr "-x ì˜µì…˜ì€ ì¶”í›„ 릴리스ì—ì„œ 제거 예정입니다"
-#: plugins/sudoers/visudo.c:251
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "cvtsudoers 유틸리티를 대신 사용해보십시오"
-#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "%s í•­ëª©ì„ íŽ¸ì§‘í•˜ë ¤ë©´ return 키를 누르십시오: "
-#: plugins/sudoers/visudo.c:321
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr "%sì— íŽ¸ì§‘ 세션 ë‚´ìš©ì´ ë‚¨ì•˜ìŠµë‹ˆë‹¤"
-#: plugins/sudoers/visudo.c:397
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "지정 편집기(%s)가 없습니다"
-#: plugins/sudoers/visudo.c:399
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "편집기가 없습니다(편집기 경로 = %s)"
-#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "%sì˜ ìƒíƒœë¥¼ 가져올 수 없습니다"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "쓰기 오류"
-#: plugins/sudoers/visudo.c:559
+#: plugins/sudoers/visudo.c:565
#, c-format
msgid "unable to stat temporary file (%s), %s unchanged"
msgstr "ìž„ì‹œ íŒŒì¼ ìƒíƒœë¥¼ 가져올 수 없습니다(%s). %sì„(를) 바꾸지 않았습니다"
-#: plugins/sudoers/visudo.c:566
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr "ìž„ì‹œ íŒŒì¼ ê¸¸ì´ê°€ 0입니다(%s). %sì„(를) 바꾸지 않았습니다"
-#: plugins/sudoers/visudo.c:572
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "편집기(%s) 실패. %sì„(를) 바꾸지 않았습니다"
-#: plugins/sudoers/visudo.c:594
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s 바꾸지 ì•ŠìŒ"
-#: plugins/sudoers/visudo.c:639
+#: plugins/sudoers/visudo.c:645
#, c-format
msgid "unable to re-open temporary file (%s), %s unchanged."
msgstr "ìž„ì‹œ 파ì¼(%s)ì„ ë‹¤ì‹œ ì—´ 수 없습니다. %sì„(를) 바꾸지 않았습니다."
-#: plugins/sudoers/visudo.c:652
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "ìž„ì‹œ 파ì¼(%s)ì„ í•´ì„í•  수 없습니다. ì•Œ 수 없는 오류"
-#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, c-format
msgid "unable to set (uid, gid) of %s to (%u, %u)"
msgstr "%sì˜ uid/gid를 %u/%u 값으로 설정할 수 없습니다"
-#: plugins/sudoers/visudo.c:803
+#: plugins/sudoers/visudo.c:809
#, c-format
msgid "%s and %s not on the same file system, using mv to rename"
msgstr "%s ë° %sì€(는) ë™ì¼í•œ íŒŒì¼ ì‹œìŠ¤í…œì— ì—†ìŠµë‹ˆë‹¤. mv 명령으로 ì´ë¦„ì„ ë°”ê¿‰ë‹ˆë‹¤"
-#: plugins/sudoers/visudo.c:814
+#: plugins/sudoers/visudo.c:820
#, c-format
msgid "command failed: '%s %s %s', %s unchanged"
msgstr "명령 실행 실패: '%s %s %s', %sì„(를) 바꾸지 않았습니다"
-#: plugins/sudoers/visudo.c:821
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "%s ì´ë¦„ 바꾸기 오류. %sì„(를) 바꾸지 않았습니다"
-#: plugins/sudoers/visudo.c:841
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "어떻게 하시겠습니까? "
-#: plugins/sudoers/visudo.c:855
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3615,41 +3690,41 @@ msgstr ""
" sudoers 파ì¼ì„ 바꾼 ìƒíƒœì—ì„œ 저장하지 ì•Šê³  나갑니다(X)\n"
" sudoers 파ì¼ì„ 바꾼 ìƒíƒœì—ì„œ 저장하고 ë냅니다(Q)\n"
-#: plugins/sudoers/visudo.c:901
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "%sì„(를) 실행할 수 ì—†ìŒ"
-#: plugins/sudoers/visudo.c:932
+#: plugins/sudoers/visudo.c:938
#, c-format
msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
msgstr "%s: ìž˜ëª»ëœ ì†Œìœ ìž uid/gid를 %u/%u 값으로 설정해야 합니다\n"
-#: plugins/sudoers/visudo.c:943
+#: plugins/sudoers/visudo.c:949
#, c-format
msgid "%s: bad permissions, should be mode 0%o\n"
msgstr "%s: ìž˜ëª»ëœ ê¶Œí•œìž…ë‹ˆë‹¤. 0%o 모드 ê°’ì„ ì„¤ì •í•´ì•¼ 합니다\n"
-#: plugins/sudoers/visudo.c:991 plugins/sudoers/visudo.c:998
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: í•´ì„ ì„±ê³µ\n"
-#: plugins/sudoers/visudo.c:1017
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%sì„(를) 사용중입니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ ì‹œë„하십시오"
-#: plugins/sudoers/visudo.c:1021
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "ê·¸ëž˜ë„ íŽ¸ì§‘í•˜ì‹œê² ìŠµë‹ˆê¹Œ? [y/N]"
-#: plugins/sudoers/visudo.c:1117
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "경고: %s:%d:%d 사용하지 않는 %s \"%s\"ì´(ê°€) 있습니다"
-#: plugins/sudoers/visudo.c:1229
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3658,13 +3733,14 @@ msgstr ""
"%s - sudoers 파ì¼ì„ 안전하게 편집합니다\n"
"\n"
-#: plugins/sudoers/visudo.c:1231
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"
@@ -3672,10 +3748,11 @@ msgstr ""
"\n"
"옵션:\n"
" -c, --check í™•ì¸ ì „ìš© 모드\n"
-" -f, --file=sudoers sudoers íŒŒì¼ ìœ„ì¹˜ 지정\n"
+" -f, --file=sudoers sudoers íŒŒì¼ ìœ„ì¹˜ë¥¼ 지정합니다\n"
" -h, --help ë„ì›€ë§ ë©”ì‹œì§€ë¥¼ 나타낸 후 빠져나갑니다\n"
+" -I, --no-includes ì¸í´ë£¨ë“œ 파ì¼ì„ 편집하지 않습니다\n"
" -q, --quiet ìžì„¸í•œ 문법 오류 메시지를 줄입니다(없앰)\n"
-" -s, --strict 엄격한 문법 검사 시행\n"
+" -s, --strict 엄격한 문법 검사를 시행합니다\n"
" -V, --version 버전 정보를 나타낸 후 빠져나갑니다\n"
#: toke.l:189
@@ -3710,6 +3787,12 @@ msgstr "예기치 ì•Šì€ ê°œí–‰ ë¬¸ìž ë°œê²¬"
msgid "too many levels of includes"
msgstr "í¬í•¨ ë ˆë²¨ì´ ë„ˆë¬´ 많습니다"
+#~ msgid "%s is group writable"
+#~ msgstr "%sì€(는) ê·¸ë£¹ì´ ê¸°ë¡í•  수 있습니다"
+
+#~ msgid "lecture status path too long: %s/%s"
+#~ msgstr "지침 ìƒíƒœ 경로가 너무 ê¹ë‹ˆë‹¤: %s/%s"
+
#~ msgid "Error: %s:%d:%d: cycle in %s \"%s\""
#~ msgstr "오류: %4$s \"%5$s\"ì˜ %1$s:%2$d:%3$d: 사ì´í´"
diff --git a/plugins/sudoers/po/pl.mo b/plugins/sudoers/po/pl.mo
index b79746926..c4310c5a7 100644
--- a/plugins/sudoers/po/pl.mo
+++ b/plugins/sudoers/po/pl.mo
Binary files differ
diff --git a/plugins/sudoers/po/pl.po b/plugins/sudoers/po/pl.po
index 8a7dd56ea..a3756dc16 100644
--- a/plugins/sudoers/po/pl.po
+++ b/plugins/sudoers/po/pl.po
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.11b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 21:56+0200\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-11 21:45+0200\n"
"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
"Language: pl\n"
@@ -17,7 +17,7 @@ msgstr ""
"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 gram.y:1218
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "błąd składni"
@@ -41,13 +41,13 @@ msgstr "*** informacje dotyczące BEZPIECZEŃSTWA dla %h ***"
msgid "Sorry, try again."
msgstr "Niestety, proszę spróbować ponownie."
-#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341
-#: gram.y:365 gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427
-#: gram.y:501 gram.y:511 gram.y:523 gram.y:571 gram.y:580 gram.y:589
-#: gram.y:598 gram.y:730 gram.y:738 gram.y:749 gram.y:761 gram.y:780
-#: gram.y:943 gram.y:948 gram.y:956 gram.y:970 gram.y:976 gram.y:1098
-#: gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133 gram.y:1162 gram.y:1171
-#: gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769 gram.y:1816
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
@@ -57,50 +57,64 @@ msgstr "Niestety, proszę spróbować ponownie."
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
-#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:168 plugins/sudoers/cvtsudoers.c:131
-#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
-#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
-#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
-#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:862
-#: plugins/sudoers/cvtsudoers.c:870 plugins/sudoers/cvtsudoers.c:1365
-#: plugins/sudoers/cvtsudoers.c:1369 plugins/sudoers/cvtsudoers.c:1471
-#: plugins/sudoers/cvtsudoers_csv.c:183 plugins/sudoers/cvtsudoers_csv.c:246
-#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
-#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
-#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:376
-#: plugins/sudoers/cvtsudoers_ldif.c:430 plugins/sudoers/cvtsudoers_ldif.c:438
-#: plugins/sudoers/cvtsudoers_ldif.c:449 plugins/sudoers/cvtsudoers_ldif.c:456
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:481
-#: plugins/sudoers/cvtsudoers_ldif.c:489 plugins/sudoers/cvtsudoers_ldif.c:636
-#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
+#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
+#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
+#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
+#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
+#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
#: plugins/sudoers/cvtsudoers_merge.c:446
@@ -110,11 +124,11 @@ msgstr "Niestety, proszę spróbować ponownie."
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1158
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -123,124 +137,125 @@ msgstr "Niestety, proszę spróbować ponownie."
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
-#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
-#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
-#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
-#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
-#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
-#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
-#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
-#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
-#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
-#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
-#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
-#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
-#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
-#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
-#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
-#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
-#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
-#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
-#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
+#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "nie udało się przydzielić pamięci"
-#: gram.y:622
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "skrót wymaga nazwy pliku"
-#: gram.y:644
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "wartości \"CWD\" muszą zaczynać się od '/', '~' lub '*'"
-#: gram.y:650
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr "ścieżka \"CWD\" zbyt długa"
-#: gram.y:660
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "wartości \"CHROOT\" muszą zaczynać się od '/', '~' lub '*'"
-#: gram.y:666
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr "ścieżka \"CHROOT\" zbyt długa"
-#: gram.y:801
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "błąd składni, słowo zastrzeżone %s użyte jako nazwa aliasu"
-#: gram.y:824
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "błędna wartość notbefore"
-#: gram.y:833
+#: gram.y:834
msgid "invalid notafter value"
msgstr "błędna wartość notafter"
-#: gram.y:843 plugins/sudoers/policy.c:376
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "wartość limitu czasu zbyt duża"
-#: gram.y:845 plugins/sudoers/policy.c:378
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "błędna wartość limitu czasu"
-#: gram.y:966 plugins/sudoers/sudoers.c:1014
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr "polecenie zbyt długie"
-#: gram.y:1220 plugins/sudoers/check_aliases.c:96
-#: plugins/sudoers/defaults.c:1275
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1270
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "Alias \"%s\" jest już zdefiniowany"
-#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
@@ -250,33 +265,48 @@ msgstr "Alias \"%s\" jest już zdefiniowany"
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
-#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
@@ -306,11 +336,11 @@ msgstr "Alias \"%s\" jest już zdefiniowany"
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1157
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -319,46 +349,47 @@ msgstr "Alias \"%s\" jest już zdefiniowany"
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
-#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
-#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
-#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
-#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
-#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
-#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
-#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
-#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
-#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
-#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
-#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
-#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
-#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
-#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
-#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
-#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
-#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
-#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
-#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
-#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -371,25 +402,25 @@ msgstr "Alias \"%s\" jest już zdefiniowany"
#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
-#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
-#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
-#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
-#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
-#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
-#: toke.l:1226
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
@@ -398,14 +429,14 @@ msgstr "%s: %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
-#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
-#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
@@ -448,7 +479,7 @@ msgstr "%8s : %s"
msgid "%8s : (command continued) %s"
msgstr "%8s : (kontynuacja polecenia) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -563,14 +594,14 @@ msgstr "%s: brak pola z grupÄ… runas"
msgid "%s exists but is not a directory (0%o)"
msgstr "%s istnieje, ale nie jest katalogiem (0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "nie udało się wykonać mkdir %s"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
-#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "nie udało się zmienić uprawnień %s na 0%o"
@@ -585,150 +616,156 @@ msgstr "błąd podczas czytania pliku czasu: %s"
msgid "invalid timing file line: %s"
msgstr "błędna linia pliku czasu: %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
-#: plugins/sudoers/policy.c:573
-msgid "unable to generate UUID"
-msgstr "nie udało się wygenerować UUID-a"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s: błąd protokołu: klucz NULL"
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr "%s: błąd protokołu: niewłaściwy typ dla %s"
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s: błąd protokołu: napotkano wartość NULL w %s"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "nie udało się wygenerować UUID-a"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr "%s: błąd protokołu: brak %s w AcceptMessage"
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr "%s: nie udało się sformatować id sesji"
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr "%s: %s nie jest ustawiony"
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr "nie udało się rozwinąć ścieżki iologu %s"
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr "nie udało się utworzyć ścieżki iologu %s"
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr "błędny iofd %d"
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr "błąd zamykania iofd %d: %s"
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr "błąd opróżniania bufora iofd %d: %s"
-#: logsrvd/iolog_writer.c:780
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "błędny log we/wy %s: %s użyty, ale nie zdefiniowany"
-#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s: nie udało się odnaleźć punktu wznowienia [%lld, %ld]"
-#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
-#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
-#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
-#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr "nie udało się otworzyć %s"
-#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "nie udało się otworzyć %s/%s"
-#: logsrvd/iolog_writer.c:839
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "nie udało się skopiować %s/%s do %s/%s: %s"
-#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr "nie udało się zmienić nazwy %s na %s"
-#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s: nie udało się odnaleźć punktu wznowienia [%lld, %ld]"
-#: logsrvd/logsrv_util.c:154
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "brak pliku logu we/wy %s/%s"
-#: logsrvd/logsrv_util.c:161
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: nie udało przesunąć %zu w przód"
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr "nie udało się połączyć z przekaźnikiem"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr "komunikat serwera zbyt duży: %zu"
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
-#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
-#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
-#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
-#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
-#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
-#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
-#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
-#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
-#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
-#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
-#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -737,633 +774,658 @@ msgstr "komunikat serwera zbyt duży: %zu"
msgid "unable to add event to queue"
msgstr "nie udało się dodać zdarzenia do kolejki"
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr "nieoczekiwany stan %d dla %s"
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "błąd maszyny stanów"
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "błędny AcceptMessage"
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "błędny RejectMessage"
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "błędny ExitMessage"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "błędny RestartMessage"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "błędny AlertMessage"
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr "%s: nieoczekiwany IoBuffer"
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "błąd protokołu"
-#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
-#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
-#: plugins/sudoers/log_client.c:1618
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "błędny IoBuffer"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "błędny ChangeWindowSize"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "błędny CommandSuspend"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "nie udało się rozpakować %s, rozmiar %zu"
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "nieoczekiwana wartość type_case %d w %s z %s"
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "nie rozpoznany typ ClientMessage"
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr "przekroczony limit czasu przy pisaniu do klienta %s"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr "brak bufora zapisu dla klienta %s"
-#: logsrvd/logsrvd.c:982
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr "przekroczony limit czasu przy czytaniu od klienta %s"
-#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "EOF od %s bez właściwego zakończenia połączenia TLS"
-#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:716
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr "komunikat klienta zbyt duży %zu"
-#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "komunikat klienta zbyt duży"
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "błędny ClientMessage"
-#: logsrvd/logsrvd.c:1389
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "nie udało się uzyskać zdalnego adresu IP"
-#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
-#: plugins/sudoers/log_client.c:276
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "Nie udało się dołączyć danych użytkownika do obiektu SSL: %s"
-#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "nie udało się ustanowić gniazda nasłuchującego"
-#: logsrvd/logsrvd.c:1718
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr "nieoczekiwany sygnał %d"
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "serwer logów sudo"
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "Opcje:"
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "ścieżka do pliku konfiguracyjnego"
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "wyświetlenie pomocy i zakończenie"
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "bez wykonywania fork, działanie na pierwszym planie"
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "procentowe prawdopodobieństwo odrzucenia połączenia"
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "wyświetlenie informacji o wersji i zakończenie"
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Wymagany Protobuf-C w wersji 1.3 lub wyższej"
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "błędna wartość losowego gubienia: %s"
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:180
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s wersja %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
-#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
-#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "nieznany użytkownik %s"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
-#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr "nieznana grupa %s"
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr "nie udało się przeanalizować uprawnień iologu %s"
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr "błędna wartość %s: %s"
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "TLS nie jest obsługiwany"
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s: nie jest pełną ścieżką"
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr "nieznana wartość facility sysloga %s"
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr "nieznany priorytet sysloga %s"
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s:%d niedopasowany '[': %s"
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr "%s:%d śmieci po ']': %s"
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s: %d błędna sekcja konfiguracji: %s"
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s:%d błędna linia konfiguracji: %s"
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d oczekiwano nazwy sekcji: %s"
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] niedozwolony klucz: %s"
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:1035
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr "nie udało się otworzyć pliku logu %s"
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "nie udało się zainicjować kontekstu serwera TLS"
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "nie udało się zainicjować kontekstu przekaźnika TLS"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
-#: logsrvd/logsrvd_journal.c:416
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "nie udało się utworzuć pliku kroniki"
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1020
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr "nie udało się zablokować %s"
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "nie udało się zablokować pliku kroniki"
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr "nie udało się otworzyć pliku kroniki"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
-#: logsrvd/logsrvd_journal.c:452
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "nie udało się zapisać pliku kroniki"
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "nie udało się zmienić nazwy pliku kroniki"
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "nieoczekiwany koniec pliku podczas odczytu pliku kroniki"
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "błąd podczas odczytu pliku kroniki"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "błędny plik kroniki, nie udało się zrestartować"
-#: logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "nie udało się przewinąć do [%lld, %ld] w pliku kroniki %s"
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "nieoczekiwana wartość value_case %d w %s z %s"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "błąd analizy AcceptMessage"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "błąd tworzenia logu we/wy"
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "błąd logowania zdarzenia akceptacji"
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "błąd analizy RejectMessage"
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "błąd logowania zdarzenia odrzucenia"
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr "błąd logowania zdarzenia wyjścia"
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "log jest już kompletny, nie może być wznowiony"
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "nie udało się wznownić logu"
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "błąd analizy AlertMessage"
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "błąd logowania zdarzenia alarmu"
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr "nie udało się sformatować bufora czasu, długość %d"
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr "%s/%s: %s"
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr "losowe odrzucanie połączenia"
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "błąd zapisu IoBuffer"
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "błąd zapisu ChangeWindowSize"
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "błąd zapisu CommandSuspend"
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "przywitanie TLS z hostem przekaźnika nie powiodło się"
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "nie udało się połączyć z hostem przekaźnika"
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s: błędne ServerHello, brak server_id"
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1504
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "błędne ServerHello"
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "nie rozpoznany typ ServerMessage"
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr "przekroczony limit czasu przy czytaniu z przekaźnika %s (%s)"
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "przekroczony limit czasu przy czytaniu z przekaźnika"
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "nazwa hosta przekaźnika nie pasuje do certyfikatu"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
-#: logsrvd/logsrvd_relay.c:784
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "błąd podczas odczytu z przekaźnika"
-#: logsrvd/logsrvd_relay.c:805
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "nie udał się odczyt z przekaźnika"
-#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "serwer przekaźnika zamknął połączenie"
-#: logsrvd/logsrvd_relay.c:838
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "komunikat serwera zbyt duży"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "przekroczony limit czasu przy pisaniu do przekaźnika %s (%s)"
-#: logsrvd/logsrvd_relay.c:904
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "przekroczony limit czasu przy pisaniu do przekaźnika"
-#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
-#: logsrvd/logsrvd_relay.c:974
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "błąd zapisu do przekaźnika"
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "wysyłanie logu we/wy sudo na zdalny serwer"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "samo wysłanie zdarzenia akceptującego (bez we/wy)"
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "plik paczki certyfikatów do weryfikacji certyfikatu serwera"
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "plik certyfikatu do powitania TLS"
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "host do wysyłania logów"
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "zdalny ID logu we/wy do wznowienia"
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "plik klucza prywatnego"
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "bez weryfikacji certyfikatu serwera"
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "port do użycia przy łączeniu z hostem"
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "wznowienie poprzedniego transferu logu we/wy"
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "odrzucenie polecenia z podanym powodem"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr "zakończenie przesyłania po osiągnięciu tego czasu"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "test serwera audytu przez wysłanie wybranego logu we/wy N razy równolegle"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "nie udało się wyszukać %s:%s: %s"
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "nie udało się uzyskać adresu IP serwera"
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "nie udało się odczytać %s/%s: %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
-#: plugins/sudoers/iolog.c:1024
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "nieoczekiwane zdarzenie we/wy %d"
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
-#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: nieoczekiwany stan %d"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "odebrano od serwera komunikat błędu: %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "odebrano od serwera komunikat zerwania: %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: nieoczekiwana wartość type_case %d"
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "przekroczony limit czasu przy czytaniu z serwera"
-#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
msgid "host name does not match certificate"
msgstr "nazwa hosta nie pasuje do certyfikatu"
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "przedwczesny EOF"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "komunikat serwera zbyt duży: %u"
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "przekroczony limit czasu przy pisaniu do serwera"
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "muszą być podane jednocześnie punkt wznowienia i ID iolog"
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "nie można ustawić punktu restartu, jeśli żadne we/wy nie jest wysyłane"
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "zakończono przedwcześnie ze stanem %d"
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "miniony czas wysłany do serwera [%lld, %ld]"
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "odebrano od serwera punkt zatwierdzenia [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "przekroczony limit czasu powitania TLS"
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "nie udało się ustawić zdarzenia"
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "Połączenie TLS nie powiodło się: %s"
-#: logsrvd/tls_client.c:191
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "nie udało się przydzielić obiektu SSL: %s"
-#: logsrvd/tls_client.c:205
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "Nie udało się dołączyć gniazda do obiektu SSL: %s"
-#: logsrvd/tls_client.c:233
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr "nie udało się zainicjować kontekstu TLS"
-#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "nie udało się ustawić szyfrowania TLS 1.2 na %s: %s"
-#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "nie udało się ustawić szyfrowania TLS 1.3 na %s: %s"
-#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "nie udało się ustawić parametrów Diffie-Hellmana: %s"
-#: logsrvd/tls_init.c:277
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr "nie udało się utworzyć kontekstu TLS: %s"
-#: logsrvd/tls_init.c:284
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "nie udało się ustawić minimalnej wersji protokołu na TLS 1.2: %s"
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
-#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
-#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
-#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
-#: plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "nie udało się pobrać aktualnego czasu"
@@ -1500,7 +1562,7 @@ msgstr "Konto wygasło lub w konfiguracji PAM brak sekcji \"account\" dla sudo,
msgid "PAM account management error: %s"
msgstr "BÅ‚Ä…d zarzÄ…dzania kontem PAM: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "nie istniejesz w bazie danych %s"
@@ -1573,17 +1635,17 @@ msgstr "Nie udało się określić warunku audytowego"
msgid "unable to commit audit record"
msgstr "nie udało się zatwierdzić rekordu audytowego"
-#: plugins/sudoers/check.c:275
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "błąd podczas czytania pliku instrukcji %s"
-#: plugins/sudoers/check.c:278
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "zignorowano plik instrukcji %s: nie jest zwykłym plikiem"
-#: plugins/sudoers/check.c:291
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1603,14 +1665,14 @@ msgstr ""
" 3) z dużą władzą wiąże się duża odpowiedzialność.\n"
"\n"
-#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
-#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "nieznany uid %u"
-#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
msgid "%s: %s\n"
msgstr "%s: %s\n"
@@ -1640,7 +1702,7 @@ msgstr "poczÄ…tkowa ranga: %s: %s"
msgid "order padding: %s: %s"
msgstr "wyrównanie rangi: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "%s, wersja gramatyki %d\n"
@@ -1660,14 +1722,14 @@ msgstr "nieobsługiwany format wyjścia %s"
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:399 plugins/sudoers/sudoers.c:165
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
-#: plugins/sudoers/visudo.c:969
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "nie udało się zainicjować wartości domyślnych sudoers"
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s: %s: %s: %s"
@@ -1692,18 +1754,18 @@ msgstr "błędny typ ograniczenia: %s"
msgid "invalid filter: %s"
msgstr "błędny filtr: %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, 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:1478 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "nie udało się zapisać do %s"
-#: plugins/sudoers/cvtsudoers.c:1501
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1712,7 +1774,7 @@ msgstr ""
"%s - konwersja między formatami pliku sudoers\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1503
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -2166,359 +2228,383 @@ msgid "Log user's input for the command being run"
msgstr "Logowanie wejścia użytkownika dla uruchamianych poleceń"
#: plugins/sudoers/def_data.c:356
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "Logowanie standardowego wejścia polecenia, jeśli nie jest podłączone do terminala"
+
+#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "Logowanie wejścia terminala użytkownika dla uruchamianych poleceń"
+
+#: plugins/sudoers/def_data.c:364
msgid "Log the output of the command being run"
msgstr "Logowanie wyjścia z uruchamianych poleceń"
-#: plugins/sudoers/def_data.c:360
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "Logowanie standardowego wyjścia polecenia, jeśli nie jest podłączone do terminala"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "Logowanie standardowego wyjścia błędów polecenia, jeśli nie jest podłączone do terminala"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "Logowanie wyjścia terminala z uruchamianych poleceń"
+
+#: plugins/sudoers/def_data.c:380
msgid "Compress I/O logs using zlib"
msgstr "Kompresja logów we/wy przy użyciu zliba"
-#: plugins/sudoers/def_data.c:364
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "Uruchamianie poleceń zawsze na pseudoterminalu"
-#: plugins/sudoers/def_data.c:368
+#: plugins/sudoers/def_data.c:388
#, c-format
msgid "Plugin for non-Unix group support: %s"
msgstr "Wtyczka do obsługi grup nieuniksowych: %s"
-#: plugins/sudoers/def_data.c:372
+#: plugins/sudoers/def_data.c:392
#, 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:376
+#: plugins/sudoers/def_data.c:396
#, 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:380
+#: plugins/sudoers/def_data.c:400
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:384
+#: plugins/sudoers/def_data.c:404
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:388
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "Zbiór dozwolonych uprawnień: %s"
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "Zbiór ograniczonych uprawnień: %s"
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr "Uruchomienie poleceń na pseudoterminalu w tle"
-#: plugins/sudoers/def_data.c:400
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "Nazwa usługi PAM do użycia: %s"
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:424
#, 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:408
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "Nazwa usługi PAM do użycia, kiedy sudo jest uruchomione z opcją -A: %s"
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:432
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:416
+#: plugins/sudoers/def_data.c:436
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:420
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "Wykonanie zarządzania poprawnością konta PAM"
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "Maksymalny numer sekwencji logu we/wy: %s"
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "Włączenie obsługi grup sieciowych w sudoers"
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:452
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:436
+#: plugins/sudoers/def_data.c:456
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:440
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr "Odpytanie wtyczki group pod kÄ…tem nieznanych grup systemowych"
-#: plugins/sudoers/def_data.c:444
+#: plugins/sudoers/def_data.c:464
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:448
+#: plugins/sudoers/def_data.c:468
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:452
+#: plugins/sudoers/def_data.c:472
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:456
+#: plugins/sudoers/def_data.c:476
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:460
+#: plugins/sudoers/def_data.c:480
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:464
+#: plugins/sudoers/def_data.c:484
#, 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:468
+#: plugins/sudoers/def_data.c:488
#, 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:472
+#: plugins/sudoers/def_data.c:492
#, 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:476
+#: plugins/sudoers/def_data.c:496
#, 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:480
+#: plugins/sudoers/def_data.c:500
#, 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:484
+#: plugins/sudoers/def_data.c:504
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:488
+#: plugins/sudoers/def_data.c:508
#, 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:492
+#: plugins/sudoers/def_data.c:512
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:496
+#: plugins/sudoers/def_data.c:516
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:500
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr "Dołączanie identyfikatora procesu przy logowaniu przez syslog"
-#: plugins/sudoers/def_data.c:504
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "Rodzaj rekordu znacznika czasu uwierzytelniania: %s"
-#: plugins/sudoers/def_data.c:508
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "Komunikat błędu uwierzytelnienia: %s"
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "Ignorowanie wielkości liter przy dopasowywaniu nazw użytkownika"
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "Ignorowanie wielkości liter przy dopasowywaniu nazw grup"
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr "Logowanie kiedy polecenie jest dozwolone przez sudoers"
-#: plugins/sudoers/def_data.c:524
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "Logowanie kiedy polecenie jest zabronione przez sudoers"
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "Serwer(y) logów sudo do połączenia, z opcjonalnym portem"
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Limit czasu serwera logów sudo w sekundach: %u"
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "Włączenie opcji gniazda SO_KEEPALIVE na gnieździe połączonym z serwerem logów"
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "Ścieżka do pliku paczki CA serwera audytu: %s"
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "Ścieżka do pliku certyfikatu sudoers: %s"
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "Ścieżka do pliku klucza prywatnego sudoers: %s"
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "Sprawdzenie poprawności certyfikatu serwera logów"
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "Zezwolenie na użycie nieznanego ID użytkownika i/lub grupy runas"
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "Zezwolenie na uruchamianie poleceń tylko jako użytkownik z prawidłową powłoką"
-#: plugins/sudoers/def_data.c:564
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "Ustawienie użytkownika zdalnego PAM na użytkownika uruchamiającego sudo"
-#: plugins/sudoers/def_data.c:568
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "Ustawienie hosta zdalnego PAM nazwÄ™ hosta lokalnego"
-#: plugins/sudoers/def_data.c:572
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "Katalog roboczy do zmiany przed uruchomieniem polecenia: %s"
-#: plugins/sudoers/def_data.c:576
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "Katalog główny do zmiany przed uruchomieniem polecenia: %s"
-#: plugins/sudoers/def_data.c:580
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "Format logów do tworzenia: %s"
-#: plugins/sudoers/def_data.c:584
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "Włączenie obsługi RBAC SELinux"
-#: plugins/sudoers/def_data.c:588
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "Ścieżka do pliku tworzonego przy pierwszym uruchomieniu sudo: %s"
-#: plugins/sudoers/def_data.c:592
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "Przechwycenie dalszych poleceń i zastosowanie do nich restrykcji sudoers"
-#: plugins/sudoers/def_data.c:596
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr "Logowanie podpoleceń uruchamianych przez pierwotne polecenie"
-#: plugins/sudoers/def_data.c:600
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr "Logowanie stanu wyjścia poleceń"
-#: plugins/sudoers/def_data.c:604
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "Dalsze polecenia w przechwyconej sesji muszą być uwierzytelniane"
-#: plugins/sudoers/def_data.c:608
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "Zezwolenie na uruchamianie programów setuid lub setgid z przechwyconego polecenia"
-#: plugins/sudoers/def_data.c:612
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "Maksymalny rozmiar, do jakiego może rosnąć przestrzeń adresowa procesu (w bajtach): %s"
-#: plugins/sudoers/def_data.c:616
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "Maksymalny rozmiar pliku core, jaki może być utworzony (w bajtach): %s"
-#: plugins/sudoers/def_data.c:620
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "Maksymalna ilość czasu CPU, jaką proces może użyć (w sekundach): %s"
-#: plugins/sudoers/def_data.c:624
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "Maksymalny rozmiar segmentu danych procesu (w bajtach): %s"
-#: plugins/sudoers/def_data.c:628
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "Maksymalny rozmiar pliku, jaki proces może utworzyć (w bajtach): %s"
-#: plugins/sudoers/def_data.c:632
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "Maksymalna liczba blokad, jaką proces może ustanowić: %s"
-#: plugins/sudoers/def_data.c:636
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "Maksymalny rozmiar, jaki proces może zablokować w pamięci (w bajtach): %s"
-#: plugins/sudoers/def_data.c:640
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "Maksymalna liczba plików, jaką proces może mieć otwartych: %s"
-#: plugins/sudoers/def_data.c:644
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "Maksymalna liczba procesów, jaką użytkownik może jednocześnie uruchomić: %s"
-#: plugins/sudoers/def_data.c:648
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "Maksymalny rozmiar, do jakiego może urosnąć rozmiar rezydentny procesu (w bajtach): %s"
-#: plugins/sudoers/def_data.c:652
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "Maksymalny rozmiar, do jakiego może urosnąć stos procesu (w bajtach): %s"
-#: plugins/sudoers/def_data.c:656
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr "Próba uwierzytelnienia nawet w trybie nieinteraktywnym"
-#: plugins/sudoers/def_data.c:660
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr "Zapisywanie haseł czystym tekstwem na wejściu/wyjściu logu"
-#: plugins/sudoers/def_data.c:664
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr "Lista wyrażeń regularnych do użycia przy dopasowywania pytania o hasło"
-#: plugins/sudoers/def_data.c:668
+#: plugins/sudoers/def_data.c:688
#, c-format
msgid "The mechanism used by the intercept and log_subcmds options: %s"
msgstr "Mechanizm używany przez opcje intercept i log_subcmds: %s"
-#: plugins/sudoers/def_data.c:672
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "Próba weryfikacji polecenia i argumentów po uruchomieniu"
+
+#: plugins/sudoers/def_data.c:696
#, c-format
msgid "AppArmor profile to use in the new security context: %s"
msgstr "Profil AppArmor do użycia w nowym kontekście bezpieczeństwa: %s"
@@ -2553,31 +2639,31 @@ msgstr "błędny typ Defaults 0x%x dla opcji \"%s\""
msgid "value \"%s\" is invalid for option \"%s\""
msgstr "błędna wartość \"%s\" dla opcji \"%s\""
-#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
-#: plugins/sudoers/policy.c:216
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
msgid "path name for \"%s\" too long"
msgstr "ścieżka pliku \"%s\" zbyt długa"
-#: plugins/sudoers/defaults.c:1133
+#: plugins/sudoers/defaults.c:1134
#, c-format
msgid "values for \"%s\" must start with a '/', '~', or '*'"
msgstr "wartości \"%s\" muszą zaczynać się od '/', '~' lub '*'"
-#: plugins/sudoers/defaults.c:1140
+#: plugins/sudoers/defaults.c:1141
#, c-format
msgid "values for \"%s\" must start with a '/'"
msgstr "wartości \"%s\" muszą zaczynać się od '/'"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv: uszkodzone envp, niezgodność długości"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "nie udało się przebudować środowiska"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, 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"
@@ -2592,27 +2678,27 @@ msgstr "nieobsługiwany typ skrótu %d dla %s"
msgid "%s: read error"
msgstr "%s: błąd odczytu"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "właścicielem %s musi być uid %d"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, 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:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "nie udało się załadować %s: %s"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, 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:107
+#: plugins/sudoers/group_plugin.c:202
#, c-format
msgid "%s: incompatible group plugin major version %d, expected %d"
msgstr "%s: niezgodna główna wersja wtyczki grup %d, oczekiwano %d"
@@ -2635,10 +2721,10 @@ msgstr "Pary lokalnych adresów IP i masek:\n"
msgid "unable to update sequence file"
msgstr "nie udało się uaktualnić pliku sekwencji"
-#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
-#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
-#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
-#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "nie udało się zapisać do pliku logu we/wy: %s"
@@ -2648,25 +2734,25 @@ msgstr "nie udało się zapisać do pliku logu we/wy: %s"
msgid "unable to create %s/%s"
msgstr "nie udało się utworzyć %s/%s"
-#: plugins/sudoers/iolog.c:955
+#: plugins/sudoers/iolog.c:957
#, 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:1054 plugins/sudoers/iolog.c:1182
-#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
-#: plugins/sudoers/visudo.c:552
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "nie udało się odczytać zegara"
-#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
-#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: błąd wewnętrzny, błędny sygnał %d"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "brak obsługi starttls w przypadku użycia ldaps"
@@ -2689,7 +2775,7 @@ msgstr "nie udało się zainicjować LDAP: %s"
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:1886 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "błędny atrybut sudoOrder: %s"
@@ -2699,12 +2785,12 @@ msgstr "błędny atrybut sudoOrder: %s"
msgid "%s: port too large"
msgstr "%s: za duży numer portu"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "nieobsługiwany rodzaj URI LDAP: %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "nie można mieszać URI ldap i ldaps"
@@ -2729,111 +2815,111 @@ msgstr "nie udało się otworzyć systemu audytowego"
msgid "unable to send audit message"
msgstr "nie udało się wysłać komunikatu audytowego"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
-#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "błąd w pętli zdarzeń"
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "Utworzenie nowego obiektu SSL_CTX nie powiodło się: %s"
-#: plugins/sudoers/log_client.c:225
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "nie udało się załadować paczki certyfikatów CA %s"
-#: plugins/sudoers/log_client.c:247
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "nie udało się załadować certyfikatu %s"
-#: plugins/sudoers/log_client.c:261
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "nie udało się załadować klucza prywatnego %s"
-#: plugins/sudoers/log_client.c:270
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "Nie udało się przydzielić obiektu SSL: %s"
-#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "Połączenie TLS do %s:%s nie powiodło się: %s"
-#: plugins/sudoers/log_client.c:538
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "Inicjowanie TLS nie powiodło się"
-#: plugins/sudoers/log_client.c:548
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "Powitanie TLS nie powiodło się"
-#: plugins/sudoers/log_client.c:1246
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: błąd wewnętrzny, błędny kod wyjścia %d"
-#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "utracono połączenie z serwerem logów"
-#: plugins/sudoers/log_client.c:1876
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "brak bufora zapisu"
-#: plugins/sudoers/log_client.c:2024
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "nie udało się połączyć z serwerem logów"
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "użytkownik NIE występuje w sudoers"
-#: plugins/sudoers/logging.c:300
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "użytkownik NIE jest autoryzowany na hoście"
-#: plugins/sudoers/logging.c:302
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "polecenie niedozwolone"
-#: plugins/sudoers/logging.c:323
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr "%s nie jest w pliku sudoers.\n"
-#: plugins/sudoers/logging.c:326
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "%s nie ma uprawnień do uruchamiania sudo na %s.\n"
-#: plugins/sudoers/logging.c:329
+#: plugins/sudoers/logging.c:321
#, 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:332
+#: plugins/sudoers/logging.c:324
#, 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:342
+#: plugins/sudoers/logging.c:334
msgid "This incident has been reported to the administrator.\n"
msgstr "Ten incydent został zgłoszony do administratora.\n"
-#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
-#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
-#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
-#: plugins/sudoers/sudoers.c:801
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s: nie znaleziono polecenia"
-#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2842,7 +2928,7 @@ msgstr ""
"zignorowano plik \"%s\" znaleziony w '.'\n"
"Proszę użyć \"sudo ./%s\", jeśli to \"%s\" ma być uruchomiony."
-#: plugins/sudoers/logging.c:395
+#: plugins/sudoers/logging.c:387
#, c-format
msgid "%u incorrect password attempt"
msgid_plural "%u incorrect password attempts"
@@ -2850,24 +2936,24 @@ 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:485
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "błąd uwierzytelniania"
-#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "wymagane jest hasło"
-#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
msgid "problem parsing sudoers"
msgstr "problem przy analizie pliku sudoers"
-#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
msgid "%s:%d:%d: %s"
msgstr "%s:%d:%d: %s"
-#: plugins/sudoers/logging.c:1068
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "nie udało się zapisać pliku logu: %s"
@@ -2882,7 +2968,7 @@ msgstr "skrót dla %s (%s) ma błędną długość %zu, oczekiwano %zu"
msgid "digest for %s (%s) is not in %s form"
msgstr "skrót dla %s (%s) nie jest w postaci %s"
-#: plugins/sudoers/parse.c:585
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2891,7 +2977,7 @@ msgstr ""
"\n"
"Rola LDAP: %s\n"
-#: plugins/sudoers/parse.c:588
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2899,110 +2985,110 @@ msgstr ""
"\n"
"Wpis sudoers:\n"
-#: plugins/sudoers/parse.c:590
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " Jako użytkownicy: "
-#: plugins/sudoers/parse.c:605
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " Jako grupy: "
-#: plugins/sudoers/parse.c:615
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " Opcje: "
-#: plugins/sudoers/parse.c:679
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " Polecenia:\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:876
#, 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:888
+#: plugins/sudoers/parse.c:894
#, 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:906
+#: plugins/sudoers/parse.c:912
#, 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:921
+#: plugins/sudoers/parse.c:927
#, 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:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "zignorowano niekompletne sudoRole: cn: %s"
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "błędny atrybut LDIF: %s"
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr "błędna wartość %.*s ustawiona przez frontend sudo"
-#: plugins/sudoers/policy.c:351 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "nie udało się przeanalizować listy adresów sieciowych"
-#: plugins/sudoers/policy.c:508
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr "nazwa użytkownika nie ustawiona przez frontend sudo"
-#: plugins/sudoers/policy.c:512
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr "ID użytkownika nie ustawiony przez frontend sudo"
-#: plugins/sudoers/policy.c:516
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr "ID grupy nie ustawiony przez frontend sudo"
-#: plugins/sudoers/policy.c:520
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr "nazwa hosta nie ustawiona przez frontend sudo"
-#: plugins/sudoers/policy.c:706
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "błędny katalog roboczy: %s"
-#: plugins/sudoers/policy.c:886
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "błędny katalog chroot: %s"
-#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "nie udało się wywołać %s"
-#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
-#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: błędne flagi trybu z frontendu sudo: 0x%x"
-#: plugins/sudoers/policy.c:1262
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "Wersja wtyczki polityki sudoers %s\n"
-#: plugins/sudoers/policy.c:1264
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "Wersja gramatyki pliku sudoers %d\n"
-#: plugins/sudoers/policy.c:1268
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -3011,27 +3097,27 @@ msgstr ""
"\n"
"Ścieżka do sudoers: %s\n"
-#: plugins/sudoers/policy.c:1271
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "ścieżka do nsswitch: %s\n"
-#: plugins/sudoers/policy.c:1273
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "ścieżka do ldap.conf: %s\n"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "ścieżka do ldap.secret: %s\n"
-#: plugins/sudoers/policy.c:1307
+#: plugins/sudoers/policy.c:1337
#, 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/policy.c:1325
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "nie udało się wyrejestrować uchwytu typu %d (wersja %d.%d)"
@@ -3170,148 +3256,142 @@ msgstr "nie udało się zainicjować źródła SSS. Czy SSSD jest zainstalowany
msgid "unable to find symbol \"%s\" in %s"
msgstr "nie udało się odnaleźć symbolu \"%s\" w %s"
-#: plugins/sudoers/sudoers.c:258
+#: plugins/sudoers/sudoers.c:263
#, c-format
msgid "unable to get defaults from %s"
msgstr "nie udało się pobrać wartości domyślnych z %s"
-#: plugins/sudoers/sudoers.c:265
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr "nie znaleziono poprawnych źródeł sudoers, zakończenie"
-#: plugins/sudoers/sudoers.c:341
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "użytkownik nie ma uprawnień do zmiany katalogu głównego na %s"
-#: plugins/sudoers/sudoers.c:343
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "brak uprawnień do używania opcji -R z %s"
-#: plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "użytkownik nie ma uprawnień do zmiany katalogu na %s"
-#: plugins/sudoers/sudoers.c:369
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "brak uprawnień do używania opcji -D z %s"
-#: plugins/sudoers/sudoers.c:396
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "nie podano polecenia"
-#: plugins/sudoers/sudoers.c:421
+#: plugins/sudoers/sudoers.c:426
msgid "sudoers specifies that root is not allowed to sudo"
msgstr "wg sudoers root nie ma prawa używać sudo"
-#: plugins/sudoers/sudoers.c:471
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "użytkownik nie ma pozwolenia na zmianę limitu closefrom"
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "brak uprawnień do używania opcji -C"
-#: plugins/sudoers/sudoers.c:532
+#: plugins/sudoers/sudoers.c:537
#, 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:547
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "brak tty"
-#: plugins/sudoers/sudoers.c:548
+#: plugins/sudoers/sudoers.c:553
msgid "sorry, you must have a tty to run sudo"
msgstr "niestety do uruchomienia sudo konieczny jest tty"
-#: plugins/sudoers/sudoers.c:555
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "błędna powłoka użytkownika %s: %s"
-#: plugins/sudoers/sudoers.c:638
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "polecenie w bieżącym katalogu"
-#: plugins/sudoers/sudoers.c:653
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "\"cd\" to polecenie wbudowane powłoki, nie może być uruchomione bezpośrednio."
-#: plugins/sudoers/sudoers.c:655
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr "można użyć opcji -s do uruchomienia powłoki uprzywilejowanej."
-#: plugins/sudoers/sudoers.c:657
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr "można użyć opcji -D do uruchomienia polecenia w podanym katalogu."
-#: plugins/sudoers/sudoers.c:666
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "użytkownik nie ma uprawnień do ustawienia limitu czasu polecenia"
-#: plugins/sudoers/sudoers.c:668
+#: plugins/sudoers/sudoers.c:673
msgid "sorry, you are not allowed set a command timeout"
msgstr "niestety brak uprawnień do ustawienia limitu czasu polecenia"
-#: plugins/sudoers/sudoers.c:676
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "użytkownik nie ma uprawnień do zachowania środowiska"
-#: plugins/sudoers/sudoers.c:678
+#: plugins/sudoers/sudoers.c:683
msgid "sorry, you are not allowed to preserve the environment"
msgstr "niestety brak uprawnień do zachowania środowiska"
-#: plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "sudoedit nie musi być uruchamiany przez sudo"
-#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "nie udało się odczytać %s"
-#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
-#: plugins/sudoers/visudo.c:764
-#, c-format
-msgid "unable to stat %s"
-msgstr "nie udało się wykonać stat na %s"
-
-#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%s nie jest zwykłym plikiem"
-#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, 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:1147 toke.l:1252
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "%s jest zapisywalny dla świata"
-#: plugins/sudoers/sudoers.c:1151 toke.l:1255
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, 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:1184
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "tylko root może używać \"-c %s\""
-#: plugins/sudoers/sudoers.c:1203
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr "nieznana klasa logowania %s"
-#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "nie udało się rozwiązać nazwy hosta %s"
@@ -3409,17 +3489,17 @@ msgstr "niedozwolony kończący \"!\""
msgid "unknown search type %d"
msgstr "nieznany typ wyszukiwania %d"
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, 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:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, 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:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -3428,7 +3508,7 @@ msgstr ""
"%s - odtwarzanie logów sesji sudo\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3484,127 +3564,122 @@ msgstr ""
"\n"
"Polecenie nie znalezione"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%s jest zapisywalny dla groupy"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, 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:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "znacznik czasu zbyt daleko w przyszłości"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, 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:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "nie udało się zablokować pliku znacznika czasu %s"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, c-format
-msgid "lecture status path too long: %s/%s"
-msgstr "ścieżka stanu instrukcji zbyt długa: %s/%s"
-
#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "sudoedit nie powinien być podawany ze ścieżką"
-#: plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:254
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:251
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "należy rozważyć użycie zamiast niej narzędzia cvtsudoers"
-#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "wciśnięcie return przejdzie do edycji %s: "
-#: plugins/sudoers/visudo.c:321
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr "zawartość sesji edycji pozostawiona w %s"
-#: plugins/sudoers/visudo.c:397
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "podany edytor (%s) nie istnieje"
-#: plugins/sudoers/visudo.c:399
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "nie znaleziono edytora (ścieżka = %s)"
-#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "nie udało się wykonać stat na %s"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "błąd zapisu"
-#: plugins/sudoers/visudo.c:559
+#: plugins/sudoers/visudo.c:565
#, 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:566
+#: plugins/sudoers/visudo.c:572
#, 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:572
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "błąd edytora (%s), %s nie zmieniony"
-#: plugins/sudoers/visudo.c:594
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s nie zmieniony"
-#: plugins/sudoers/visudo.c:639
+#: plugins/sudoers/visudo.c:645
#, 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:652
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "nie udało się przeanalizować pliku tymczasowego (%s), nieznany błąd"
-#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, 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:803
+#: plugins/sudoers/visudo.c:809
#, 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:814
+#: plugins/sudoers/visudo.c:820
#, 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:821
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "błąd podczas zmiany nazwy %s, %s nie zmieniony"
-#: plugins/sudoers/visudo.c:841
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "Co teraz? "
-#: plugins/sudoers/visudo.c:855
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3616,41 +3691,41 @@ msgstr ""
" (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:901
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "nie udało się uruchomić %s"
-#: plugins/sudoers/visudo.c:932
+#: plugins/sudoers/visudo.c:938
#, 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:943
+#: plugins/sudoers/visudo.c:949
#, 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:991 plugins/sudoers/visudo.c:998
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: składnia poprawna\n"
-#: plugins/sudoers/visudo.c:1017
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%s zajęty, proszę spróbować później"
-#: plugins/sudoers/visudo.c:1021
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "Modyfikować mimo to? [y/N]"
-#: plugins/sudoers/visudo.c:1117
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "Uwaga: %s:%d:%d: nie użyty %s \"%s\""
-#: plugins/sudoers/visudo.c:1229
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3659,25 +3734,27 @@ msgstr ""
"%s - bezpieczna edycja pliku sudoers\n"
"\n"
-#: plugins/sudoers/visudo.c:1231
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\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"
+" -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"
+" -I, --no-includes bez edycji plików dołączanych\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:189
msgid "empty string"
diff --git a/plugins/sudoers/po/ro.mo b/plugins/sudoers/po/ro.mo
index 0f59bc499..5ee5fc10a 100644
--- a/plugins/sudoers/po/ro.mo
+++ b/plugins/sudoers/po/ro.mo
Binary files differ
diff --git a/plugins/sudoers/po/ro.po b/plugins/sudoers/po/ro.po
index ded6a7538..b9effbaed 100644
--- a/plugins/sudoers/po/ro.po
+++ b/plugins/sudoers/po/ro.po
@@ -11,13 +11,14 @@
# Actualizare a algoritmului formelor de plural (de la „trei-vechi†la „patruâ€, experimental).
# Actualizare a traducerii pentru versiunea 1.9.10b1, făcută de R-GC.
# Actualizare a traducerii pentru versiunea 1.9.11b1, făcută de R-GC.
+# Actualizare a traducerii pentru versiunea 1.9.12b2, făcută de R-GC.
#
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.11b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 21:04+0200\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-12 11:15+0200\n"
"Last-Translator: Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>\n"
"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
"Language: ro\n"
@@ -26,9 +27,9 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=((n==1) ? 0 : (n==2) ? 1 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 2 : 3);\n"
"X-Bugs: Report translation errors to the Language-Team address.\n"
-"X-Generator: Poedit 3.0.1\n"
+"X-Generator: Poedit 3.1.1\n"
-#: confstr.sh:1 gram.y:1218
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "eroare de sintaxă"
@@ -52,13 +53,13 @@ msgstr "*** Informații de SECURITATE pentru %h ***"
msgid "Sorry, try again."
msgstr "Încercați din nou."
-#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341
-#: gram.y:365 gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427
-#: gram.y:501 gram.y:511 gram.y:523 gram.y:571 gram.y:580 gram.y:589
-#: gram.y:598 gram.y:730 gram.y:738 gram.y:749 gram.y:761 gram.y:780
-#: gram.y:943 gram.y:948 gram.y:956 gram.y:970 gram.y:976 gram.y:1098
-#: gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133 gram.y:1162 gram.y:1171
-#: gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769 gram.y:1816
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
@@ -68,50 +69,64 @@ msgstr "Încercați din nou."
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
-#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:168 plugins/sudoers/cvtsudoers.c:131
-#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
-#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
-#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
-#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:862
-#: plugins/sudoers/cvtsudoers.c:870 plugins/sudoers/cvtsudoers.c:1365
-#: plugins/sudoers/cvtsudoers.c:1369 plugins/sudoers/cvtsudoers.c:1471
-#: plugins/sudoers/cvtsudoers_csv.c:183 plugins/sudoers/cvtsudoers_csv.c:246
-#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
-#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
-#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:376
-#: plugins/sudoers/cvtsudoers_ldif.c:430 plugins/sudoers/cvtsudoers_ldif.c:438
-#: plugins/sudoers/cvtsudoers_ldif.c:449 plugins/sudoers/cvtsudoers_ldif.c:456
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:481
-#: plugins/sudoers/cvtsudoers_ldif.c:489 plugins/sudoers/cvtsudoers_ldif.c:636
-#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
+#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
+#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
+#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
+#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
+#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
#: plugins/sudoers/cvtsudoers_merge.c:446
@@ -121,11 +136,11 @@ msgstr "Încercați din nou."
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1158
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -134,124 +149,125 @@ msgstr "Încercați din nou."
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
-#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
-#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
-#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
-#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
-#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
-#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
-#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
-#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
-#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
-#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
-#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
-#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
-#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
-#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
-#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
-#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
-#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
-#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
-#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
+#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "nu se poate aloca memoria"
-#: gram.y:622
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "tabelul sumelor de control necesită un nume de cale"
-#: gram.y:644
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "valorile pentru „CWD†trebuie să înceapă cu un caracter: „/â€, „~â€, sau „*â€"
-#: gram.y:650
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr "calea „CWD†este prea lungă"
-#: gram.y:660
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "valorile pentru „CHROOT†trebuie să înceapă cu un caracter: „/â€, „~â€, sau „*â€"
-#: gram.y:666
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr "calea „CHROOT†este prea lungă"
-#: gram.y:801
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "eroare de sintaxă, cuvântul rezervat %s utilizat ca nume de alias"
-#: gram.y:824
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "valoare „notbefore†nevalidă"
-#: gram.y:833
+#: gram.y:834
msgid "invalid notafter value"
msgstr "valoare „notafter†nevalidă"
-#: gram.y:843 plugins/sudoers/policy.c:376
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "limită de timp prea mare"
-#: gram.y:845 plugins/sudoers/policy.c:378
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "valoare de limită de timp nevalidă"
-#: gram.y:966 plugins/sudoers/sudoers.c:1014
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr "comandă prea lungă"
-#: gram.y:1220 plugins/sudoers/check_aliases.c:96
-#: plugins/sudoers/defaults.c:1275
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1270
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "Aliasul „%s†este deja definit"
-#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
@@ -261,33 +277,48 @@ msgstr "Aliasul „%s†este deja definit"
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
-#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
@@ -317,11 +348,11 @@ msgstr "Aliasul „%s†este deja definit"
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1157
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -330,46 +361,47 @@ msgstr "Aliasul „%s†este deja definit"
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
-#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
-#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
-#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
-#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
-#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
-#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
-#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
-#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
-#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
-#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
-#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
-#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
-#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
-#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
-#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
-#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
-#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
-#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
-#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
-#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -382,25 +414,25 @@ msgstr "Aliasul „%s†este deja definit"
#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
-#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
-#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
-#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
-#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
-#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
-#: toke.l:1226
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
@@ -409,14 +441,14 @@ msgstr "%s: %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
-#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
-#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
@@ -459,7 +491,7 @@ msgstr "%8s : %s"
msgid "%8s : (command continued) %s"
msgstr "%8s : (comandă continuată) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -574,14 +606,14 @@ msgstr "%s: câmpul de grup efectiv (rulează ca grupul X) lipsește"
msgid "%s exists but is not a directory (0%o)"
msgstr "%s există dar nu este un director (0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "nu s-a putut executa «mkdir», pentru a crea directorul %s"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
-#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "nu s-a putut modifica modul de acces de la %s la 0%o"
@@ -596,150 +628,156 @@ msgstr "eroare la citirea fișierului de sincronizare: %s"
msgid "invalid timing file line: %s"
msgstr "linie de fișier de sincronizare nevalidă: %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
-#: plugins/sudoers/policy.c:573
-msgid "unable to generate UUID"
-msgstr "nu s-a putut genera UUID-ul"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s: eroare de protocol: cheie nulă (NULL)"
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr "%s: eroare de protocol: tip incorect pentru %s"
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s: eroare de protocol: valoare nulă (NULL) găsită în %s"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "nu s-a putut genera UUID-ul"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr "%s: eroare de protocol: lipsește %s din AcceptMessage"
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr "%s: nu se poate formata ID-ul sesiunii"
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr "%s: %s nu este configurat"
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr "nu se poate expanda calea către iolog %s"
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr "nu se poate crea calea către iolog %s"
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr "iofd nevalid: %d"
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr "eroare la închiderea iofd %d: %s"
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr "eroare la golirea iofd %d: %s"
-#: logsrvd/iolog_writer.c:780
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "jurnal de In/Ieș nevalid %s: %s menționat, dar nu definit"
-#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s: nu se poate găsi punctul de reluare [%lld, %ld]"
-#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
-#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
-#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
-#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr "nu se poate deschide %s"
-#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "nu se poate deschide %s/%s"
-#: logsrvd/iolog_writer.c:839
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "nu se poate copia %s/%s în %s/%s: %s"
-#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr "nu se poate redenumi %s în %s"
-#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s: nu se poate găsi punctul de reluare [%lld, %ld]"
-#: logsrvd/logsrv_util.c:154
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "lipsește fișierul jurnal de In/Ieș %s/%s"
-#: logsrvd/logsrv_util.c:161
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: nu se poate căuta mai departe %zu"
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr "nu se poate conecta la releu"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr "mesajul serverului este prea mare: %zu"
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
-#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
-#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
-#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
-#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
-#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
-#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
-#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
-#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
-#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
-#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
-#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -748,375 +786,400 @@ msgstr "mesajul serverului este prea mare: %zu"
msgid "unable to add event to queue"
msgstr "nu se poate adăuga evenimentul la coadă"
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr "stare neașteptată %d pentru %s"
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "eroare de stare a mașinii"
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "AcceptMessage nevalid"
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "RejectMessage nevalid"
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "ExitMessage nevalid"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "RestartMessage nevalid"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "AlertMessage nevalid"
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr "%s: IoBuffer neașteptat"
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "eroare de protocol"
-#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
-#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
-#: plugins/sudoers/log_client.c:1618
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "IoBuffer nevalid"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "ChangeWindowSize nevalid"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "CommandSuspend nevalid"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "nu se poate despacheta %s cu dimensiunea %zu"
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "valoare type_case %d neașteptată în %s din %s"
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "tip de ClientMessage nerecunoscut"
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr "a expirat timpul de scriere la clientul %s"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr "lipsește memoria tampon de scriere pentru clientul %s"
-#: logsrvd/logsrvd.c:982
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr "a expirat timpul de citire de la clientul %s"
-#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "sfârșit de fișier de la %s fără închiderea corectă a TLS"
-#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:716
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr "mesajul clientului este prea mare: %zu"
-#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "mesajul clientului este prea mare"
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "ClientMessage nevalid"
-#: logsrvd/logsrvd.c:1389
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "nu se poate obține adresa IP de la distanță"
-#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
-#: plugins/sudoers/log_client.c:276
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "Nu se pot atașa datele utilizatorului la obiectul ssl: %s"
-#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "nu se poate configura soclul de ascultare"
-#: logsrvd/logsrvd.c:1718
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr "semnal neașteptat %d"
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "server de jurnal al sudo"
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "Opțiuni:"
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "calea către fișierul de configurare"
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "afișează mesajul de ajutor și iese"
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "nu se bifurcă, rulează în prim-plan"
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "șansele procentuale de conexiuni vor scădea"
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "afișează informațiile despre versiune și iese"
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Este necesară versiunea Protobuf-C 1.3 sau mai mare"
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "valoare nevalidă a probabilității de pierdere: %s"
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:180
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s versiunea %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
-#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
-#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "utilizator necunoscut %s"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
-#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr "grup necunoscut %s"
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr "nu se poate analiza modul iolog %s"
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr "valoare nevalidă pentru %s: %s"
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "fără suport TLS"
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s: nu este o cale complet calificată"
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr "facilitate de syslog necunoscută %s"
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr "prioritate de syslog necunoscută %s"
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s:%d „[†desperecheată: %s"
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr "%s:%d gunoi după „]â€: %s"
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s:%d secțiune de configurare nevalidă: %s"
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s:%d linie de configurare nevalidă: %s"
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d nume de secțiune așteptat: %s"
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] cheie ilegală: %s"
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:1035
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr "nu se poate deschide fișierul de jurnal: %s"
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "nu se poate inițializa contextul TLS al serverului"
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "nu se poate inițializa contextul TLS al releului"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
-#: logsrvd/logsrvd_journal.c:416
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "nu se poate crea fișierul de jurnal"
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1020
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr "nu se poate bloca %s"
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "nu se poate bloca fișierul de jurnal"
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr "nu se poate deschide fișierul de jurnal"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
-#: logsrvd/logsrvd_journal.c:452
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "nu se poate scrie fișierul de jurnal"
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "nu se poate redenumi fișierul de jurnal"
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "sfârșit de fișier neașteptat la citirea fișierului de jurnal"
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "eroare la citirea fișierului de jurnal"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "fișier de jurnal nevalid, nu se poate reporni"
-#: logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "nu se poate ajunge la poziția [%lld, %ld] din fișierul de jurnal %s"
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "value_case neașteptată %d în %s din %s"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "eroare la analizarea AcceptMessage"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "eroare la crearea jurnalului de In/IeÈ™"
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "eroare la înregistrarea evenimentului de acceptare"
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "eroare la analizarea RejectMessage"
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "eroare la înregistrarea evenimentului de respingere"
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr "eroare la înregistrarea evenimentului de ieșire"
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "jurnalul este deja complet, nu poate fi repornit"
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "nu se poate reporni jurnalizarea"
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "eroare la analizarea AlertMessage"
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "eroare la înregistrarea evenimentului de alertă"
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr "nu se poate formata memoria tampon de timp, lungime %d"
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr "%s/%s: %s"
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr "întreruperea aleatorie a conexiunii"
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "eroare la scrierea IoBuffer"
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "eroare la scrierea ChangeWindowSize"
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "eroare la scrierea CommandSuspend"
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "negocierea TLS cu gazda releu a eșuat"
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "nu se poate conecta la gazda releu"
@@ -1125,251 +1188,251 @@ msgstr "nu se poate conecta la gazda releu"
# «→ aici pare că lipsește un spațiu după cele două puncte.»
# ***
# corectare efectuată
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s: ServerHello nevalid, server_id lipsește"
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1504
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "ServerHello nevalid"
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "tip de ServerMessage nerecunoscut"
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr "a expirat limita de timp de citire de la releu %s (%s)"
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "a expirat limita de timp de citire de la releul"
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "numele gazdei releului nu se potrivește cu certificatul"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
-#: logsrvd/logsrvd_relay.c:784
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "eroare la citirea de la releu"
-#: logsrvd/logsrvd_relay.c:805
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "nu se poate citi de la releu"
-#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "conexiune închisă a serverului de releu"
-#: logsrvd/logsrvd_relay.c:838
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "mesajul serverului este prea mare"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "a expirat limita de timp la scrierea la releu %s (%s)"
-#: logsrvd/logsrvd_relay.c:904
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "a expirat limita de timp de scriere la releu"
-#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
-#: logsrvd/logsrvd_relay.c:974
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "eroare la scrierea la releu"
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "trimite jurnalul de In/Ieș al «sudo» la serverul de la distanță"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "trimite doar un eveniment de acceptare (fără In/Ieș)"
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "fișierul pachet de certificate pentru a verifica certificatul serverului"
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "fișier de certificat pentru negocierea TLS"
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "gazda la care se trimit jurnalele"
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "ID-ul de la distanță al jurnalului In/Ieș care urmează să fie reluat"
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "fișier de cheie privată"
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "nu se verifică certificatul serverului"
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "portul de utilizat atunci când vă conectați la gazdă"
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "repornește transferul precedent de jurnal In/Ieș"
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "respinge comanda cu motivul specificat"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr "oprește transferul după ce s-a atins acest timp"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "testează serverul de auditare prin trimiterea jurnalului de In/Ieș selectat de n ori în paralel"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "nu se poate căuta %s:%s: %s"
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "nu se poate obține adresa IP a serverului"
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "nu se poate citi %s/%s: %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
-#: plugins/sudoers/iolog.c:1024
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "eveniment de In/Ieș neașteptat %d"
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
-#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: stare neașteptată %d"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "mesaj de eroare primit de la server: %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "mesaj de renunțare primit de la server: %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: valoare type_case neașteptată %d"
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "a expirat limita de timp de citire de la server"
-#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
msgid "host name does not match certificate"
msgstr "numele gazdei nu se potrivește cu certificatul"
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "sfârșit de fișier prematur"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "mesajul serverului este prea mare: %u"
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "a expirat limita de timp de scriere la server"
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "trebuie să fie specificat atît ID-ul iolog cît și punctul de repornire"
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "un punct de repornire poate să nu fie stabilit când nicio In/Ieș nu este stabilită"
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "a ieșit prematur cu starea %d"
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "timpul scurs trimis la server [%lld, %ld]"
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "punctul de consemnare primit de la server [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "a expirat limita de timp a negocierii TLS"
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "nu s-a putut configura evenimentul"
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "conexiunea TLS a eșuat: %s"
-#: logsrvd/tls_client.c:191
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "nu s-a putut aloca obiectul ssl: %s"
-#: logsrvd/tls_client.c:205
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "Nu s-a putut atașa soclul la obiectul ssl: %s"
-#: logsrvd/tls_client.c:233
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr "nu s-a putut inițializa contextul ssl: %s"
-#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "nu s-a putut configura suita de cifrare TLS 1.2 la valoarea %s: %s"
-#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "nu s-a putut configura suita de cifrare TLS 1.3 la valoarea %s: %s"
-#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "nu se pot stabili parametrii diffie-hellman: %s"
-#: logsrvd/tls_init.c:277
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr "nu se poate crea contextul TLS: %s"
-#: logsrvd/tls_init.c:284
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "nu se poate stabili versiunea de protocol minimă la TLS 1.2: %s"
@@ -1387,12 +1450,12 @@ msgstr "nu se poate stabili versiunea de protocol minimă la TLS 1.2: %s"
# din zi†nu prea are sens iar „orarul zilei†ar fi „the daily scheduleâ€Â»
# ===
# Ok, rămîne așa cum este
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
-#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
-#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
-#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
-#: plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "nu se poate obține ora actuală"
@@ -1529,7 +1592,7 @@ msgstr "Contul este expirat sau configurării PAM îi lipsește o secțiune „a
msgid "PAM account management error: %s"
msgstr "Eroare de gestionare a contului PAM: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "nu existați în baza de date %s"
@@ -1602,17 +1665,17 @@ msgstr "Nu s-a putut determina condiția de auditare"
msgid "unable to commit audit record"
msgstr "nu se poate consemna înregistrarea de auditare"
-#: plugins/sudoers/check.c:275
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "eroare la citirea fișierului de instrucțiuni %s"
-#: plugins/sudoers/check.c:278
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "se ignoră fișierul de instrucțiuni %s: nu este un fișier obișnuit"
-#: plugins/sudoers/check.c:291
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1633,14 +1696,14 @@ msgstr ""
" 3. Cu o mare putere vine o mare responsabilitate.\n"
"\n"
-#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
-#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "uid necunoscut %u"
-#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
msgid "%s: %s\n"
msgstr "%s: %s\n"
@@ -1670,7 +1733,7 @@ msgstr "ordinea de pornire: %s: %s"
msgid "order padding: %s: %s"
msgstr "completarea de ordine: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "%s versiune de gramatică %d\n"
@@ -1690,14 +1753,14 @@ msgstr "format de ieșire nesuportat %s"
msgid "%s: input and output files must be different"
msgstr "%s: fișierele de intrare și ieșire trebuie să fie diferite"
-#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:165
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
-#: plugins/sudoers/visudo.c:969
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "nu se poate iniÈ›ializa valorile implicite ale lui „sudoersâ€"
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s: %s: %s: %s"
@@ -1722,18 +1785,18 @@ msgstr "tip de suprimare nevalid: %s"
msgid "invalid filter: %s"
msgstr "filtru nevalid: %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, c-format
msgid "failed to parse %s file, unknown error"
msgstr "nu s-a putut analiza fișierul %s, eroare necunoscută"
#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "nu se poate scrie la %s"
-#: plugins/sudoers/cvtsudoers.c:1501
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1742,7 +1805,7 @@ msgstr ""
"%s - converteÈ™te între formatele de fiÈ™ier „sudoersâ€\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1503
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -2192,102 +2255,122 @@ msgstr "Umask(masca de Unix) specificată în „sudoersâ€, o va înlocui pe ce
#: plugins/sudoers/def_data.c:352
msgid "Log user's input for the command being run"
-msgstr "Înregistrează în jurnal intrarea utilizatorului pentru comanda care se rulează"
+msgstr "Înregistrează în jurnal intrarea utilizatorului pentru comanda care se execută"
#: plugins/sudoers/def_data.c:356
-msgid "Log the output of the command being run"
-msgstr "Înregistrează în jurnal ieșirea comenzii care se rulează"
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "Înregistrează în jurnal intrarea standard a comenzii dacă nu este conectată la un terminal"
#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "Înregistrează în jurnal intrarea terminalului utilizatorului pentru comanda care se execută"
+
+#: plugins/sudoers/def_data.c:364
+msgid "Log the output of the command being run"
+msgstr "Înregistrează în jurnal ieșirea comenzii care se execută"
+
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "Înregistrează în jurnal ieșirea standard a comenzii dacă nu este conectată la un terminal"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "Înregistrează în jurnal eroarea standard a comenzii dacă nu este conectată la un terminal"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "Înregistrează în jurnal ieșirea terminalului comenzii care se execută"
+
+#: plugins/sudoers/def_data.c:380
msgid "Compress I/O logs using zlib"
msgstr "Comprimă înregistrările din jurnal de In/Ieș utilizând «zlib»"
-#: plugins/sudoers/def_data.c:364
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "Execută întotdeauna comenzile într-un pseudo-tty"
-#: plugins/sudoers/def_data.c:368
+#: plugins/sudoers/def_data.c:388
#, c-format
msgid "Plugin for non-Unix group support: %s"
msgstr "Modul pentru suport de grup non-Unix: %s"
-#: plugins/sudoers/def_data.c:372
+#: plugins/sudoers/def_data.c:392
#, c-format
msgid "Directory in which to store input/output logs: %s"
msgstr "Directorul în care se stochează informațiile returnate de operațiile de intrare/ieșire: %s"
-#: plugins/sudoers/def_data.c:376
+#: plugins/sudoers/def_data.c:396
#, c-format
msgid "File in which to store the input/output log: %s"
msgstr "Fișierul în care se stochează informațiile returnate de operațiile de intrare/ieșire: %s"
-#: plugins/sudoers/def_data.c:380
+#: plugins/sudoers/def_data.c:400
msgid "Add an entry to the utmp/utmpx file when allocating a pty"
msgstr "Adaugă o intrare la fișierul „utmp/utmpx†când se alocă un pty"
-#: plugins/sudoers/def_data.c:384
+#: plugins/sudoers/def_data.c:404
msgid "Set the user in utmp to the runas user, not the invoking user"
msgstr "StabileÈ™te utilizatorul în utmp la utilizatorul „run asâ€, nu la utilizatorul care invocă"
-#: plugins/sudoers/def_data.c:388
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "Setul de privilegii permise: %s"
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "Setul de privilegii limită: %s"
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr "Rulează comenzile pe un pty în fundal"
-#: plugins/sudoers/def_data.c:400
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "Numele serviciului PAM de utilizat: %s"
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:424
#, c-format
msgid "PAM service name to use for login shells: %s"
msgstr "Numele serviciului PAM de utilizat pentru shell-urile de autentificare: %s"
-#: plugins/sudoers/def_data.c:408
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "Numele serviciului PAM de utilizat atunci când «sudo» este rulat cu opÈ›iunea „-Aâ€: %s"
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:432
msgid "Attempt to establish PAM credentials for the target user"
msgstr "Încearcă să stabilească certificări PAM pentru utilizatorul vizat"
-#: plugins/sudoers/def_data.c:416
+#: plugins/sudoers/def_data.c:436
msgid "Create a new PAM session for the command to run in"
msgstr "Creează o nouă sesiune PAM pentru a rula comanda în ea"
-#: plugins/sudoers/def_data.c:420
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "Realizează gestionarea validării contului PAM"
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "Numărul maxim de secvență al jurnalului de In/Ieș: %s"
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "Activează suportul de „netgroup†(grup de reÈ›ea) „sudoersâ€"
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:452
msgid "Check parent directories for writability when editing files with sudoedit"
msgstr "Verifică directoarele părinte pentru capacitatea de scriere când se editează fișiere cu «sudoedit»"
-#: plugins/sudoers/def_data.c:436
+#: plugins/sudoers/def_data.c:456
msgid "Follow symbolic links when editing files with sudoedit"
msgstr "Urmărește legăturile simbolice când se editează fișierele cu «sudoedit»"
-#: plugins/sudoers/def_data.c:440
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr "Interoghează modulul grupului pentru grupuri de sistem necunoscute"
@@ -2311,19 +2394,19 @@ msgstr "Interoghează modulul grupului pentru grupuri de sistem necunoscute"
# Morala, pentru „trăznaia†unuia, se scrie o
# pagină întreagă(destul de vastă) în Wikipedia.
# Și „bagă în boalăâ€, multă lume „luminatăâ€! 😇ï¸
-#: plugins/sudoers/def_data.c:444
+#: plugins/sudoers/def_data.c:464
msgid "Match netgroups based on the entire tuple: user, host and domain"
msgstr "Potrivește „netgroups†(grupurile de rețea) pe baza întregului triplet: utilizator, gazdă și domeniu"
-#: plugins/sudoers/def_data.c:448
+#: plugins/sudoers/def_data.c:468
msgid "Allow commands to be run even if sudo cannot write to the audit log"
msgstr "Permite executarea comenzilor chiar dacă «sudo» nu poate să scrie în jurnalul auditare"
-#: plugins/sudoers/def_data.c:452
+#: plugins/sudoers/def_data.c:472
msgid "Allow commands to be run even if sudo cannot write to the I/O log"
msgstr "Permite executarea comenzilor chiar dacă «sudo» nu poate să scrie în jurnalul de In/Ieș"
-#: plugins/sudoers/def_data.c:456
+#: plugins/sudoers/def_data.c:476
msgid "Allow commands to be run even if sudo cannot write to the log file"
msgstr "Permite executarea comenzilor chiar dacă «sudo» nu poate să scrie în fișierul de jurnal"
@@ -2333,11 +2416,11 @@ msgstr "Permite executarea comenzilor chiar dacă «sudo» nu poate să scrie î
# „Identifică grupurile din „sudoers†și face potrivirea după ID-ul grupului, nu după numeâ€
# ***
# Opinii/Idei?
-#: plugins/sudoers/def_data.c:460
+#: plugins/sudoers/def_data.c:480
msgid "Resolve groups in sudoers and match on the group ID, not the name"
msgstr "Rezolvă grupurile în „sudoers†și face potrivirea după ID-ul grupului, nu după nume"
-#: plugins/sudoers/def_data.c:464
+#: plugins/sudoers/def_data.c:484
#, c-format
msgid "Log entries larger than this value will be split into multiple syslog messages: %u"
msgstr "Intrările în jurnal mai mari decât această valoare vor fi împărțite în mai multe mesaje syslog: %u"
@@ -2367,166 +2450,166 @@ msgstr "Intrările în jurnal mai mari decât această valoare vor fi împărți
# istoric al acestor informații...
# (marcajul de timp, este decît
# „o plus valoare†a acestor informații)
-#: plugins/sudoers/def_data.c:468
+#: plugins/sudoers/def_data.c:488
#, c-format
msgid "User that will own the I/O log files: %s"
msgstr "Utilizatorul ce va fi proprietarul fișierelor jurnalului de In/Ieș: %s"
-#: plugins/sudoers/def_data.c:472
+#: plugins/sudoers/def_data.c:492
#, c-format
msgid "Group that will own the I/O log files: %s"
msgstr "Grupul ce va fi proprietarul fișierelor jurnalului de In/Ieș: %s"
-#: plugins/sudoers/def_data.c:476
+#: plugins/sudoers/def_data.c:496
#, c-format
msgid "File mode to use for the I/O log files: 0%o"
msgstr "Modul de acces la fișier, utilizat pentru fișierele jurnalului de In/Ieș: 0%o"
-#: plugins/sudoers/def_data.c:480
+#: plugins/sudoers/def_data.c:500
#, c-format
msgid "Execute commands by file descriptor instead of by path: %s"
msgstr "Execută comenzile după descriptorul fișierului în loc de, după calea de acces: %s"
-#: plugins/sudoers/def_data.c:484
+#: plugins/sudoers/def_data.c:504
msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
msgstr "Ignoră intrările Defaults necunoscute din „sudoers†în loc de-a genera un avertisment"
-#: plugins/sudoers/def_data.c:488
+#: plugins/sudoers/def_data.c:508
#, c-format
msgid "Time in seconds after which the command will be terminated: %u"
msgstr "Timpul în secunde după care comanda va fi terminată: %u"
-#: plugins/sudoers/def_data.c:492
+#: plugins/sudoers/def_data.c:512
msgid "Allow the user to specify a timeout on the command line"
msgstr "Permite utilizatorul să specifice o limită de timp, de la linia de comandă"
-#: plugins/sudoers/def_data.c:496
+#: plugins/sudoers/def_data.c:516
msgid "Flush I/O log data to disk immediately instead of buffering it"
msgstr "Transferă imediat datele jurnalului de In/Ieș pe disc, în loc să le stocheze în memoria tampon"
-#: plugins/sudoers/def_data.c:500
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr "Include ID-ul procesului când se înregistrează via syslog"
-#: plugins/sudoers/def_data.c:504
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "Tipul de înregistrare a marcajului de timp a autentificării: %s"
-#: plugins/sudoers/def_data.c:508
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "Mesaj de autentificare eșuată: %s"
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "Ignoră diferența dintre majusculele/minuscule când se caută după numele de utilizator"
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "Ignoră diferența dintre majusculele/minuscule când se caută după numele de grup"
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr "ÃŽnregistrează când o comandă este permisă de „sudoersâ€"
-#: plugins/sudoers/def_data.c:524
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "ÃŽnregistrează când o comandă este respinsă de „sudoersâ€"
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "Server(e) de înregistrare a jurnalului «sudo», la care se conectează cu portul opțional"
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Limita de timp a serverului de înregistrare a jurnalului «sudo», în secunde: %u"
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "Activează opțiunea de soclu SO_KEEPALIVE pe soclul conectat la serverul de înregistrare a jurnalului"
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "Calea către fișierul pachet CA al serverului de auditare: %s"
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "Calea către fiÈ™ierul certificat „sudoersâ€: %s"
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "Calea către fiÈ™ierul cheie privată „sudoersâ€: %s"
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "Verifică dacă certificatul serverului de înregistrare a jurnalului, este valid"
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "Permite utilizarea de ID de grup și/sau utilizator „run as†necunoscut"
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "Permite doar rularea de comenzi ca un utilizator cu un shell valid"
-#: plugins/sudoers/def_data.c:564
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "Stabilește utilizatorul de la distanță de pam, la utilizatorul care rulează «sudo»"
-#: plugins/sudoers/def_data.c:568
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "Stabilește gazda de la distanță de pam, la numele de gazdă local"
-#: plugins/sudoers/def_data.c:572
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "Directorul de lucru la care trebuie să se schimbe, înainte de a executa comanda: %s"
-#: plugins/sudoers/def_data.c:576
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "Directorul rădăcină la care trebuie să se schimbe, înainte de a executa comanda: %s"
-#: plugins/sudoers/def_data.c:580
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "Formatul jurnalelor de produs: %s"
-#: plugins/sudoers/def_data.c:584
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "Activează suportul RBAC în SELinux"
-#: plugins/sudoers/def_data.c:588
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "Calea către fișierul care este creat prima dată când «sudo» este rulat: %s"
-#: plugins/sudoers/def_data.c:592
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "Interceptează comenzile următoare, È™i le aplică restricÈ›iile „sudoersâ€"
-#: plugins/sudoers/def_data.c:596
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr "Înregistrează în jurnal subcomenzile executate de comanda originală"
-#: plugins/sudoers/def_data.c:600
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr "Înregistrează în jurnal starea de ieșire a comenzilor"
-#: plugins/sudoers/def_data.c:604
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "Comenzile ulterioare dintr-o sesiune interceptată trebuie să fie autentificate"
-#: plugins/sudoers/def_data.c:608
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "Permite unei comenzi interceptate să execute programe marcate setuid sau setgid"
-#: plugins/sudoers/def_data.c:612
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "Dimensiunea maximă la care spațiul de adrese al procesului poate crește (în octeți): %s"
@@ -2539,74 +2622,78 @@ msgstr "Dimensiunea maximă la care spațiul de adrese al procesului poate creș
# ***
# citez, de aici:
# „In computing, a core dump,[a] memory dump, crash dump, storage dump, system dump, or ABEND dump[1] consists of the recorded state of the working memory of a computer program at a specific time, generally when the program has crashed or otherwise terminated abnormally.â€
-#: plugins/sudoers/def_data.c:616
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "Fișierul de transferare a conținutului memoriei(core dump), pentru depanare, de cea mai mare dimensiune care poate fi creat (în octeți): %s"
-#: plugins/sudoers/def_data.c:620
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "Cantitatea maximă de timp CPU pe care o poate utiliza procesul (în secunde): %s"
-#: plugins/sudoers/def_data.c:624
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "Dimensiunea maximă a segmentului de date pentru proces (în octeți): %s"
-#: plugins/sudoers/def_data.c:628
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "Fișierul de cea mai mare dimensiune pe care procesul îl poate crea (în octeți): %s"
-#: plugins/sudoers/def_data.c:632
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "Numărul maxim de blocări pe care procesul le poate stabili: %s"
-#: plugins/sudoers/def_data.c:636
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "Dimensiunea maximă pe care procesul o poate bloca în memorie (în octeți): %s"
-#: plugins/sudoers/def_data.c:640
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "Numărul maxim de fișiere pe care procesul le poate avea deschise: %s"
-#: plugins/sudoers/def_data.c:644
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "Numărul maxim de procese pe care utilizatorul le poate rula simultan: %s"
-#: plugins/sudoers/def_data.c:648
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "Dimensiunea maximă până la care poate crește dimensiunea setului rezident al procesului (în octeți): %s"
-#: plugins/sudoers/def_data.c:652
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "Dimensiunea maximă până la care poate crește stiva procesului (în octeți): %s"
-#: plugins/sudoers/def_data.c:656
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr "Încercați să vă autentificați chiar și în modul non-interactiv"
-#: plugins/sudoers/def_data.c:660
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr "Stochează parolele în formatul de text simplu în intrarea jurnalului de In/Ieș"
-#: plugins/sudoers/def_data.c:664
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr "Listă de expresii regulate de utilizat atunci când se potrivește o solicitare de parolă"
-#: plugins/sudoers/def_data.c:668
+#: plugins/sudoers/def_data.c:688
#, c-format
msgid "The mechanism used by the intercept and log_subcmds options: %s"
msgstr "Mecanismul utilizat de opÈ›iunile „intercept†și „log_subcmdsâ€: %s"
-#: plugins/sudoers/def_data.c:672
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "Încearcă să verifice comanda și argumentele după execuție"
+
+#: plugins/sudoers/def_data.c:696
#, c-format
msgid "AppArmor profile to use in the new security context: %s"
msgstr "Profilul AppArmor de utilizat în noul context de securitate: %s"
@@ -2641,31 +2728,31 @@ msgstr "tip de Defaults nevalid 0x%x pentru opÈ›iunea „%sâ€"
msgid "value \"%s\" is invalid for option \"%s\""
msgstr "valoarea „%s†nu este validă pentru opÈ›iunea „%sâ€"
-#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
-#: plugins/sudoers/policy.c:216
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
msgid "path name for \"%s\" too long"
msgstr "numele căii pentru „%s†este prea lung"
-#: plugins/sudoers/defaults.c:1133
+#: plugins/sudoers/defaults.c:1134
#, c-format
msgid "values for \"%s\" must start with a '/', '~', or '*'"
msgstr "valorile pentru „%s†trebuie să înceapă cu un „/â€, „~â€, sau „*â€"
-#: plugins/sudoers/defaults.c:1140
+#: plugins/sudoers/defaults.c:1141
#, c-format
msgid "values for \"%s\" must start with a '/'"
msgstr "valorile pentru „%s†trebuie să înceapă cu un caracter „/â€"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv: envp corupt, nepotrivire a lungimii"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "nu se poate reconstrui mediul"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, c-format
msgid "sorry, you are not allowed to set the following environment variables: %s"
msgstr "nu aveți permisiunea de a stabili următoarele variabile de mediu: %s"
@@ -2680,27 +2767,27 @@ msgstr "tip de sumă de control nesuportată %d pentru %s"
msgid "%s: read error"
msgstr "%s: eroare de citire"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s trebuie să fie deținut de uid-ul %d"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, c-format
msgid "%s must only be writable by owner"
msgstr "%s trebuie să poată fi scris numai de către proprietar"
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "nu se poate încărca %s: %s"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, c-format
msgid "unable to find symbol \"group_plugin\" in %s"
msgstr "nu se poate găsi simbolul „group_plugin†în %s"
-#: plugins/sudoers/group_plugin.c:107
+#: plugins/sudoers/group_plugin.c:202
#, c-format
msgid "%s: incompatible group plugin major version %d, expected %d"
msgstr "%s: versiunea majoră a modului de grup %d, este incompatibilă, se aștepta %d"
@@ -2723,10 +2810,10 @@ msgstr "Perechile adresă de IP locală și mască de rețea:\n"
msgid "unable to update sequence file"
msgstr "nu se poate actualiza fișierul de secvență"
-#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
-#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
-#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
-#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "nu se poate scrie în fișierul jurnal de In/Ieș: %s"
@@ -2736,25 +2823,25 @@ msgstr "nu se poate scrie în fișierul jurnal de In/Ieș: %s"
msgid "unable to create %s/%s"
msgstr "nu se poate crea %s/%s"
-#: plugins/sudoers/iolog.c:955
+#: plugins/sudoers/iolog.c:957
#, c-format
msgid "%s: internal error, I/O log file for event %d not open"
msgstr "%s: eroare internă, fișierul jurnal de In/Ieș pentru evenimentul %d nu este deschis"
-#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1182
-#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
-#: plugins/sudoers/visudo.c:552
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "nu se poate citi ceasul"
-#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
-#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: eroare internă, semnal nevalid %d"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "starttls nu este acceptat când se utilizează ldaps"
@@ -2777,7 +2864,7 @@ msgstr "nu se poate inițializa LDAP: %s"
msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()"
msgstr "start_tls specificat, dar bibliotecile LDAP nu acceptă ldap_start_tls_s() sau ldap_start_tls_s_np()"
-#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "atribut sudoOrder nevalid: %s"
@@ -2787,12 +2874,12 @@ msgstr "atribut sudoOrder nevalid: %s"
msgid "%s: port too large"
msgstr "%s: portul este prea mare"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "tip de URI LDAP neacceptat: %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "nu se pot fuziona adrese URI, ldap și ldaps"
@@ -2817,111 +2904,111 @@ msgstr "nu se poate deschide sistemul de auditare"
msgid "unable to send audit message"
msgstr "nu se poate trimite mesajul de auditare"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
-#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "eroare în bucla de eveniment"
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "Crearea unui nou obiect SSL_CTX a eșuat: %s"
-#: plugins/sudoers/log_client.c:225
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "nu se poate încărca pachetul de autoritate de certificare %s"
-#: plugins/sudoers/log_client.c:247
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "nu se poate încărca certificatul %s"
-#: plugins/sudoers/log_client.c:261
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "nu se poate încărca cheia privată %s"
-#: plugins/sudoers/log_client.c:270
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "Nu se poate aloca obiectul ssl: %s"
-#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "Conexiunea TLS la %s:%s a eșuat: %s"
-#: plugins/sudoers/log_client.c:538
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "Inițializarea TLS nu a reușit"
-#: plugins/sudoers/log_client.c:548
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "Negocierea TLS nu a reușit"
-#: plugins/sudoers/log_client.c:1246
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: eroare internă, stare de ieșire nevalidă %d"
-#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "a fost pierdută conexiunea la serverul de înregistrare a jurnalului"
-#: plugins/sudoers/log_client.c:1876
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "lipsește memoria tampon de scriere"
-#: plugins/sudoers/log_client.c:2024
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "nu se poate conecta la serverul de înregistrare a jurnalului"
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "utilizatorul NU este în „sudoersâ€"
-#: plugins/sudoers/logging.c:300
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "utilizatorul NU este autorizat pe gazdă"
-#: plugins/sudoers/logging.c:302
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "comanda nu este permisă"
-#: plugins/sudoers/logging.c:323
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr "%s nu se află în fiÈ™ierul „sudoersâ€.\n"
-#: plugins/sudoers/logging.c:326
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "%s nu are permisiunea de a rula «sudo» pe %s.\n"
-#: plugins/sudoers/logging.c:329
+#: plugins/sudoers/logging.c:321
#, c-format
msgid "Sorry, user %s may not run sudo on %s.\n"
msgstr "Este posibil ca utilizatorul %s să nu poată executa «sudo» pe %s.\n"
-#: plugins/sudoers/logging.c:332
+#: plugins/sudoers/logging.c:324
#, c-format
msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n"
msgstr "Utilizatorului %s nu îi este permis să execute „%s%s%s†ca %s%s%s pe %s.\n"
-#: plugins/sudoers/logging.c:342
+#: plugins/sudoers/logging.c:334
msgid "This incident has been reported to the administrator.\n"
msgstr "Acest incident a fost raportat administratorului.\n"
-#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
-#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
-#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
-#: plugins/sudoers/sudoers.c:801
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s: comanda nu a fost găsită"
-#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2930,7 +3017,7 @@ msgstr ""
"se ignoră „%s†găsit în „.â€\n"
"Utilizați «sudo ./%s» dacă aceasta este „%s†pe care doriți să o rulați."
-#: plugins/sudoers/logging.c:395
+#: plugins/sudoers/logging.c:387
#, c-format
msgid "%u incorrect password attempt"
msgid_plural "%u incorrect password attempts"
@@ -2939,24 +3026,24 @@ msgstr[1] "două încercări de parolă incorecte"
msgstr[2] "%u încercări de parolă incorecte"
msgstr[3] "%u de încercări de parolă incorecte"
-#: plugins/sudoers/logging.c:485
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "eșec de autentificare"
-#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "o parolă este necesară"
-#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
msgid "problem parsing sudoers"
msgstr "problemă la analizarea sintaxei lui „sudoersâ€"
-#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
msgid "%s:%d:%d: %s"
msgstr "%s:%d:%d: %s"
-#: plugins/sudoers/logging.c:1068
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "nu se poate scrie fișierul de jurnal: %s"
@@ -2971,7 +3058,7 @@ msgstr "suma de control pentru %s (%s) are lungimea greșită %zu, se aștepta %
msgid "digest for %s (%s) is not in %s form"
msgstr "suma de control pentru %s (%s) nu este în formatul %s"
-#: plugins/sudoers/parse.c:585
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2980,7 +3067,7 @@ msgstr ""
"\n"
"Regula LDAP: %s\n"
-#: plugins/sudoers/parse.c:588
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2988,110 +3075,110 @@ msgstr ""
"\n"
"Intrare „sudoersâ€:\n"
-#: plugins/sudoers/parse.c:590
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " RuleazăCaUtilizatorii: "
-#: plugins/sudoers/parse.c:605
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " RuleazăCaGrupurile: "
-#: plugins/sudoers/parse.c:615
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " Opțiuni: "
-#: plugins/sudoers/parse.c:679
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " Comenzi:\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:876
#, c-format
msgid "Matching Defaults entries for %s on %s:\n"
msgstr "Se potrivesc intrările Defaults pentru %s pe %s:\n"
-#: plugins/sudoers/parse.c:888
+#: plugins/sudoers/parse.c:894
#, c-format
msgid "Runas and Command-specific defaults for %s:\n"
msgstr "Valori implicite specifice „Run_as†și comenzii pentru %s:\n"
-#: plugins/sudoers/parse.c:906
+#: plugins/sudoers/parse.c:912
#, c-format
msgid "User %s may run the following commands on %s:\n"
msgstr "Utilizatorul %s poate să ruleze următoarele comenzi pe %s:\n"
-#: plugins/sudoers/parse.c:921
+#: plugins/sudoers/parse.c:927
#, c-format
msgid "User %s is not allowed to run sudo on %s.\n"
msgstr "Utilizatorului %s nu îi este permis să ruleze «sudo» pe %s.\n"
-#: plugins/sudoers/parse_ldif.c:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "se ignoră sudoRole incompletă: cn: %s"
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "atribut LDIF nevalid: %s"
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr "%.*s nevalid stabilit de interfața «sudo»"
-#: plugins/sudoers/policy.c:351 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "nu se poate analiza lista de adrese de rețea"
-#: plugins/sudoers/policy.c:508
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr "numele de utilizator nu este stabilit de interfața sudo"
-#: plugins/sudoers/policy.c:512
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr "ID-ul utilizatorului nu este stabilit de interfața «sudo»"
-#: plugins/sudoers/policy.c:516
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr "ID-ul grupului nu este stabilit de interfața «sudo»"
-#: plugins/sudoers/policy.c:520
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr "numele gazdei nu este stabilit de interfața sudo"
-#: plugins/sudoers/policy.c:706
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "director de lucru nevalid: %s"
-#: plugins/sudoers/policy.c:886
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "director „chroot†nevalid: %s"
-#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "nu se poate executa %s"
-#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
-#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: indicatori de mod nevalizi în interfața «sudo»: 0x%x"
-#: plugins/sudoers/policy.c:1262
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "Versiunea modulului de politică „sudoersâ€, este %s\n"
-#: plugins/sudoers/policy.c:1264
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "Versiunea de gramatică a fiÈ™ierului „sudoersâ€, este %d\n"
-#: plugins/sudoers/policy.c:1268
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -3100,27 +3187,27 @@ msgstr ""
"\n"
"Cale „sudoersâ€: %s\n"
-#: plugins/sudoers/policy.c:1271
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "cale nsswitch: %s\n"
-#: plugins/sudoers/policy.c:1273
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "cale ldap.conf: %s\n"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "cale ldap.secret: %s\n"
-#: plugins/sudoers/policy.c:1307
+#: plugins/sudoers/policy.c:1337
#, c-format
msgid "unable to register hook of type %d (version %d.%d)"
msgstr "nu se poate înregistra cârligul de tip %d (versiunea %d.%d)"
-#: plugins/sudoers/policy.c:1325
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "nu se poate anula înregistrarea cârligului de tip %d (versiunea %d.%d)"
@@ -3259,148 +3346,142 @@ msgstr "nu se poate inițializa sursa SSS. Este SSSD instalat pe mașină?"
msgid "unable to find symbol \"%s\" in %s"
msgstr "nu se poate găsi simbolul „%s†în %s"
-#: plugins/sudoers/sudoers.c:258
+#: plugins/sudoers/sudoers.c:263
#, c-format
msgid "unable to get defaults from %s"
msgstr "nu se pot obține valorile implicite de la %s"
-#: plugins/sudoers/sudoers.c:265
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr "nicio sursă „sudoers†validă, se iese"
-#: plugins/sudoers/sudoers.c:341
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "utilizatorul nu are permisiunea de a schimba directorul rădăcină în %s"
-#: plugins/sudoers/sudoers.c:343
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "nu aveți permisiunea de a utiliza opțiunea „-R†cu %s"
-#: plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "utilizatorului nu îi este permis să schimbe directorul la %s"
-#: plugins/sudoers/sudoers.c:369
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "nu aveți permisiunea de a utiliza opțiunea „-D†cu %s"
-#: plugins/sudoers/sudoers.c:396
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "nicio comandă specificată"
-#: plugins/sudoers/sudoers.c:421
+#: plugins/sudoers/sudoers.c:426
msgid "sudoers specifies that root is not allowed to sudo"
msgstr "„sudoers†specifică că root nu are permisiunea să execute «sudo»"
-#: plugins/sudoers/sudoers.c:471
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "utilizatorului nu îi este permis să suprascrie limita de closefrom"
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "nu aveÈ›i permisiunea de a utiliza opÈ›iunea „-Câ€"
-#: plugins/sudoers/sudoers.c:532
+#: plugins/sudoers/sudoers.c:537
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr "proprietar marcaj de timp (%s): Nu există un astfel de utilizator"
-#: plugins/sudoers/sudoers.c:547
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "fără tty"
-#: plugins/sudoers/sudoers.c:548
+#: plugins/sudoers/sudoers.c:553
msgid "sorry, you must have a tty to run sudo"
msgstr "trebuie să aveți un tty pentru a rula «sudo»"
-#: plugins/sudoers/sudoers.c:555
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "shell nevalid pentru utilizatorul %s: %s"
-#: plugins/sudoers/sudoers.c:638
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "comandă în directorul curent"
-#: plugins/sudoers/sudoers.c:653
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "«cd» este o comandă încorporată în shell, nu poate fi rulată direct."
-#: plugins/sudoers/sudoers.c:655
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr "opțiunea „-s†poate fi utilizată pentru a rula un shell privilegiat."
-#: plugins/sudoers/sudoers.c:657
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr "opțiunea „-D†poate fi folosită pentru a rula o comandă într-un anumit director."
-#: plugins/sudoers/sudoers.c:666
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "utilizatorului nu îi este permis să stabilească o limită de timp a comenzii"
-#: plugins/sudoers/sudoers.c:668
+#: plugins/sudoers/sudoers.c:673
msgid "sorry, you are not allowed set a command timeout"
msgstr "nu aveți permisiunea de a stabili o limită de timp a comenzii"
-#: plugins/sudoers/sudoers.c:676
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "utilizatorului nu îi este permis să păstreze mediul"
-#: plugins/sudoers/sudoers.c:678
+#: plugins/sudoers/sudoers.c:683
msgid "sorry, you are not allowed to preserve the environment"
msgstr "nu aveți permisiunea să păstrați mediul"
-#: plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "«sudoedit» nu are nevoie să fie rulat via «sudo»"
-#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "nu se poate citi %s"
-#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
-#: plugins/sudoers/visudo.c:764
-#, c-format
-msgid "unable to stat %s"
-msgstr "nu se poate stabili starea lui %s"
-
-#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%s nu este un fișier obișnuit"
-#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s este deținut de uid-ul %u, ar trebui să fie %u"
-#: plugins/sudoers/sudoers.c:1147 toke.l:1252
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "%s poate fi scris de oricine"
-#: plugins/sudoers/sudoers.c:1151 toke.l:1255
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, c-format
msgid "%s is owned by gid %u, should be %u"
msgstr "%s este deținut de gid-ul %u, ar trebui să fie %u"
-#: plugins/sudoers/sudoers.c:1184
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "doar root poate utiliza „-c %sâ€"
-#: plugins/sudoers/sudoers.c:1203
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr "clasă de autentificare necunoscută %s"
-#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "nu se poate rezolva gazda %s"
@@ -3498,17 +3579,17 @@ msgstr "terminare ilegală a expresiei, cu „!â€"
msgid "unknown search type %d"
msgstr "tip de căutare necunoscută %d"
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, c-format
msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n"
msgstr "utilizare: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n"
-#: plugins/sudoers/sudoreplay.c:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, c-format
msgid "usage: %s [-h] [-d dir] -l [search expression]\n"
msgstr "utilizare: %s [-h] [-d dir] -l [expresie de căutare]\n"
-#: plugins/sudoers/sudoreplay.c:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -3517,7 +3598,7 @@ msgstr ""
"%s - redă jurnalele de sesiune «sudo»\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3573,127 +3654,122 @@ msgstr ""
"\n"
"Comanda nu se potrivește"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%s poate fi scris de membrii grupului"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, c-format
msgid "unable to truncate time stamp file to %lld bytes"
msgstr "nu se poate trunchia fișierul marcajelor de timp în %lld octeți"
-#: plugins/sudoers/timestamp.c:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "se vor ignora marcajele de timp pe viitor"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, c-format
msgid "time stamp too far in the future: %20.20s"
msgstr "datarea este prea departe în viitor: %20.20s"
-#: plugins/sudoers/timestamp.c:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "nu se poate bloca fișierul marcajelor de timp %s"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, c-format
-msgid "lecture status path too long: %s/%s"
-msgstr "calea fișierului de stare al instrucțiunilor de utilizare, este prea lungă: %s/%s"
-
#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "«sudoedit» nu ar trebui să fie specificat cu o cale"
-#: plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:254
msgid "the -x option will be removed in a future release"
msgstr "opțiunea „-x†va fi eliminată într-o lansare viitoare"
-#: plugins/sudoers/visudo.c:251
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "luați în considerare utilizarea utilitarului «cvtsudoers» în schimb"
-#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "apăsați „enter†pentru a edita %s: "
-#: plugins/sudoers/visudo.c:321
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr "conținutul sesiunii de editare rămase în %s"
-#: plugins/sudoers/visudo.c:397
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "editorul specificat (%s) nu există"
-#: plugins/sudoers/visudo.c:399
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "nu s-a găsit niciun editor (cale editor = %s)"
-#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "nu se poate stabili starea lui %s"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "eroare de scriere"
-#: plugins/sudoers/visudo.c:559
+#: plugins/sudoers/visudo.c:565
#, c-format
msgid "unable to stat temporary file (%s), %s unchanged"
msgstr "nu se poate stabili starea fișierului temporar (%s), %s neschimbat"
-#: plugins/sudoers/visudo.c:566
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr "fișier temporar de lungime zero (%s), %s neschimbat"
-#: plugins/sudoers/visudo.c:572
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "editorul (%s) a eșuat, %s neschimbat"
-#: plugins/sudoers/visudo.c:594
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s neschimbat"
-#: plugins/sudoers/visudo.c:639
+#: plugins/sudoers/visudo.c:645
#, c-format
msgid "unable to re-open temporary file (%s), %s unchanged."
msgstr "nu se poate redeschide fișierul temporar (%s), %s neschimbat."
-#: plugins/sudoers/visudo.c:652
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "nu se poate analiza fișierul temporar (%s), eroare necunoscută"
-#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, c-format
msgid "unable to set (uid, gid) of %s to (%u, %u)"
msgstr "nu se poate stabili (uid, gid) de %s la (%u, %u)"
-#: plugins/sudoers/visudo.c:803
+#: plugins/sudoers/visudo.c:809
#, c-format
msgid "%s and %s not on the same file system, using mv to rename"
msgstr "%s și %s nu sunt pe același sistem de fișiere, se utilizează «mv» pentru a redenumi"
-#: plugins/sudoers/visudo.c:814
+#: plugins/sudoers/visudo.c:820
#, c-format
msgid "command failed: '%s %s %s', %s unchanged"
msgstr "comanda a eÈ™uat: „%s %s %sâ€, %s neschimbat"
-#: plugins/sudoers/visudo.c:821
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "eroare la redenumirea %s, %s neschimbat"
-#: plugins/sudoers/visudo.c:841
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "Acum ce? "
-#: plugins/sudoers/visudo.c:855
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3705,41 +3781,41 @@ msgstr ""
" (x) - ieÈ™i fără a salva modificările în fiÈ™ierul „sudoersâ€\n"
" (Q) - ieși și salvează modificările în fișierul „sudoers†(PERICOL!)\n"
-#: plugins/sudoers/visudo.c:901
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "nu se poate rula %s"
-#: plugins/sudoers/visudo.c:932
+#: plugins/sudoers/visudo.c:938
#, c-format
msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
msgstr "%s: proprietarul greșit (uid, gid) ar trebui să fie (%u, %u)n\n"
-#: plugins/sudoers/visudo.c:943
+#: plugins/sudoers/visudo.c:949
#, c-format
msgid "%s: bad permissions, should be mode 0%o\n"
msgstr "%s: permisiuni proaste, ar trebui să fie modul 0%o\n"
-#: plugins/sudoers/visudo.c:991 plugins/sudoers/visudo.c:998
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: analizat, OK\n"
-#: plugins/sudoers/visudo.c:1017
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%s ocupat, încercați din nou mai târziu"
-#: plugins/sudoers/visudo.c:1021
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "Editați oricum? [y/N]"
-#: plugins/sudoers/visudo.c:1117
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "Avertisment: %s:%d:%d: neutilizat %s „%sâ€"
-#: plugins/sudoers/visudo.c:1229
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3748,13 +3824,14 @@ msgstr ""
"%s - editează în siguranță fiÈ™ierul „sudoersâ€\n"
"\n"
-#: plugins/sudoers/visudo.c:1231
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"
@@ -3764,6 +3841,7 @@ msgstr ""
" -c, --check modul doar verifică\n"
" -f, --file=sudoers specifică locaÈ›ia fiÈ™ierului „sudoersâ€\n"
" -h, --help afișează mesajul de ajutor și iese\n"
+" -I, --no-includes nu editează fiÈ™ierele „includeâ€\n"
" -q, --quiet mesaje de eroare de sintaxă mai puțin detaliate\n"
" -s, --strict verificare strictă de sintaxă\n"
" -V, --version afișează informațiile de versiune și iese\n"
@@ -3800,6 +3878,12 @@ msgstr "întrerupere de linie neașteptată în șir"
msgid "too many levels of includes"
msgstr "prea multe niveluri de includeri"
+#~ msgid "%s is group writable"
+#~ msgstr "%s poate fi scris de membrii grupului"
+
+#~ msgid "lecture status path too long: %s/%s"
+#~ msgstr "calea fișierului de stare al instrucțiunilor de utilizare, este prea lungă: %s/%s"
+
#~ msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
#~ msgstr "Avertisment: %s:%d:%d ciclu în %s „%sâ€"
diff --git a/plugins/sudoers/po/sr.mo b/plugins/sudoers/po/sr.mo
index 28bc87297..65570cd5d 100644
--- a/plugins/sudoers/po/sr.mo
+++ b/plugins/sudoers/po/sr.mo
Binary files differ
diff --git a/plugins/sudoers/po/sr.po b/plugins/sudoers/po/sr.po
index c0776774b..4ea3ec329 100644
--- a/plugins/sudoers/po/sr.po
+++ b/plugins/sudoers/po/sr.po
@@ -1,12 +1,13 @@
# Serbian translation for sudoers.
# This file is put in the public domain.
# МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>, 2014–2022.
+#
msgid ""
msgstr ""
-"Project-Id-Version: sudoers-1.9.10b1\n"
+"Project-Id-Version: sudoers-1.9.11b1\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-02-11 18:33-0700\n"
-"PO-Revision-Date: 2022-02-15 21:30+0200\n"
+"POT-Creation-Date: 2022-05-27 08:39-0600\n"
+"PO-Revision-Date: 2022-08-22 21:33+0200\n"
"Last-Translator: МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <(nothing)>\n"
"Language: sr\n"
@@ -16,7 +17,7 @@ msgstr ""
"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 gram.y:1198
+#: confstr.sh:1 gram.y:1218
msgid "syntax error"
msgstr "грешка ÑинтакÑе"
@@ -40,17 +41,17 @@ msgstr "*** информације БЕЗБЕДÐОСТИ за %h ***"
msgid "Sorry, try again."
msgstr "Извините, покушајте поново."
-#: gram.y:233 gram.y:300 gram.y:309 gram.y:318 gram.y:328 gram.y:338
-#: gram.y:362 gram.y:389 gram.y:398 gram.y:406 gram.y:415 gram.y:424
-#: gram.y:498 gram.y:508 gram.y:520 gram.y:564 gram.y:573 gram.y:582
-#: gram.y:591 gram.y:718 gram.y:726 gram.y:737 gram.y:749 gram.y:768
-#: gram.y:923 gram.y:928 gram.y:936 gram.y:950 gram.y:956 gram.y:1078
-#: gram.y:1087 gram.y:1095 gram.y:1104 gram.y:1113 gram.y:1142 gram.y:1151
-#: gram.y:1159 gram.y:1252 gram.y:1382 gram.y:1748 gram.y:1798
+#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341
+#: gram.y:365 gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427
+#: gram.y:501 gram.y:511 gram.y:523 gram.y:571 gram.y:580 gram.y:589
+#: gram.y:598 gram.y:730 gram.y:738 gram.y:749 gram.y:761 gram.y:780
+#: gram.y:943 gram.y:948 gram.y:956 gram.y:970 gram.y:976 gram.y:1098
+#: gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133 gram.y:1162 gram.y:1171
+#: gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769 gram.y:1816
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
-#: lib/eventlog/eventlog.c:804 lib/eventlog/eventlog.c:881
-#: lib/eventlog/eventlog.c:1176 lib/iolog/iolog_filter.c:142
-#: lib/iolog/iolog_filter.c:204 lib/iolog/iolog_filter.c:233
+#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
+#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
+#: lib/iolog/iolog_filter.c:202 lib/iolog/iolog_filter.c:233
#: lib/iolog/iolog_json.c:150 lib/iolog/iolog_json.c:382
#: lib/iolog/iolog_json.c:412 lib/iolog/iolog_json.c:555
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
@@ -66,39 +67,39 @@ msgstr "Извините, покушајте поново."
#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1011 logsrvd/logsrvd.c:1073
+#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:425
-#: logsrvd/logsrvd_journal.c:427 logsrvd/logsrvd_local.c:174
+#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
+#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:843
+#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:118
-#: plugins/sudoers/auth/kerb5.c:146 plugins/sudoers/auth/pam.c:687
+#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
+#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:134 plugins/sudoers/cvtsudoers.c:131
+#: plugins/sudoers/check_aliases.c:168 plugins/sudoers/cvtsudoers.c:131
#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:758
-#: plugins/sudoers/cvtsudoers.c:873 plugins/sudoers/cvtsudoers.c:881
-#: plugins/sudoers/cvtsudoers.c:1376 plugins/sudoers/cvtsudoers.c:1380
-#: plugins/sudoers/cvtsudoers.c:1482 plugins/sudoers/cvtsudoers_csv.c:183
-#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
-#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
-#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
-#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
-#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
-#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:469
-#: plugins/sudoers/cvtsudoers_ldif.c:477 plugins/sudoers/cvtsudoers_ldif.c:624
+#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:862
+#: plugins/sudoers/cvtsudoers.c:870 plugins/sudoers/cvtsudoers.c:1365
+#: plugins/sudoers/cvtsudoers.c:1369 plugins/sudoers/cvtsudoers.c:1471
+#: plugins/sudoers/cvtsudoers_csv.c:183 plugins/sudoers/cvtsudoers_csv.c:246
+#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
+#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
+#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:376
+#: plugins/sudoers/cvtsudoers_ldif.c:430 plugins/sudoers/cvtsudoers_ldif.c:438
+#: plugins/sudoers/cvtsudoers_ldif.c:449 plugins/sudoers/cvtsudoers_ldif.c:456
+#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:481
+#: plugins/sudoers/cvtsudoers_ldif.c:489 plugins/sudoers/cvtsudoers_ldif.c:636
#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
@@ -107,23 +108,21 @@ msgstr "Извините, покушајте поново."
#: plugins/sudoers/cvtsudoers_merge.c:553
#: plugins/sudoers/cvtsudoers_merge.c:564
#: plugins/sudoers/cvtsudoers_merge.c:633
-#: plugins/sudoers/cvtsudoers_merge.c:1150
-#: plugins/sudoers/cvtsudoers_merge.c:1223 plugins/sudoers/defaults.c:468
-#: plugins/sudoers/defaults.c:690 plugins/sudoers/defaults.c:1051
-#: plugins/sudoers/defaults.c:1243 plugins/sudoers/editor.c:190
+#: plugins/sudoers/cvtsudoers_merge.c:1158
+#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
+#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
+#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
-#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:264
-#: plugins/sudoers/iolog.c:664 plugins/sudoers/iolog.c:690
-#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:433
-#: plugins/sudoers/ldap.c:443 plugins/sudoers/ldap.c:448
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:464
-#: plugins/sudoers/ldap.c:760 plugins/sudoers/ldap.c:924
-#: plugins/sudoers/ldap.c:1340 plugins/sudoers/ldap.c:1766
-#: plugins/sudoers/ldap.c:1803 plugins/sudoers/ldap.c:1884
-#: plugins/sudoers/ldap.c:2019 plugins/sudoers/ldap.c:2120
-#: plugins/sudoers/ldap.c:2136 plugins/sudoers/ldap_conf.c:218
+#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
+#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
+#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
+#: plugins/sudoers/ldap.c:755 plugins/sudoers/ldap.c:919
+#: plugins/sudoers/ldap.c:1335 plugins/sudoers/ldap.c:1761
+#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
+#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
+#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
@@ -131,120 +130,120 @@ msgstr "Извините, покушајте поново."
#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:390 plugins/sudoers/log_client.c:703
-#: plugins/sudoers/log_client.c:724 plugins/sudoers/log_client.c:1444
-#: plugins/sudoers/log_client.c:1662 plugins/sudoers/log_client.c:1989
-#: plugins/sudoers/log_client.c:2045 plugins/sudoers/logging.c:104
-#: plugins/sudoers/logging.c:185 plugins/sudoers/logging.c:469
-#: plugins/sudoers/logging.c:489 plugins/sudoers/logging.c:628
-#: plugins/sudoers/match_command.c:324 plugins/sudoers/match_command.c:567
-#: plugins/sudoers/match_command.c:616 plugins/sudoers/match_command.c:688
-#: plugins/sudoers/match_command.c:736 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:201 plugins/sudoers/parse.c:218
-#: plugins/sudoers/parse.c:250 plugins/sudoers/parse.c:267
-#: plugins/sudoers/parse.c:290 plugins/sudoers/parse.c:301
-#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
-#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
-#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
-#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
-#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
-#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
-#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:597
-#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
-#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
-#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
-#: plugins/sudoers/policy.c:570 plugins/sudoers/policy.c:952
-#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
-#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
-#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
-#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
-#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
-#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
-#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
-#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
-#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
-#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:111
-#: plugins/sudoers/stubs.c:119 plugins/sudoers/sudoers.c:335
-#: plugins/sudoers/sudoers.c:361 plugins/sudoers/sudoers.c:429
-#: plugins/sudoers/sudoers.c:438 plugins/sudoers/sudoers.c:479
-#: plugins/sudoers/sudoers.c:842 plugins/sudoers/sudoers.c:980
-#: plugins/sudoers/sudoers.c:1039 plugins/sudoers/sudoers.c:1305
-#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
-#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
-#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
-#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
-#: plugins/sudoers/testsudoers.c:580 plugins/sudoers/timestamp.c:424
-#: plugins/sudoers/timestamp.c:468 plugins/sudoers/timestamp.c:980
-#: plugins/sudoers/timestamp.c:1118 plugins/sudoers/toke_util.c:78
-#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
-#: plugins/sudoers/toke_util.c:161 plugins/sudoers/toke_util.c:200
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
-#: plugins/sudoers/visudo.c:344 plugins/sudoers/visudo.c:350
-#: plugins/sudoers/visudo.c:456 plugins/sudoers/visudo.c:632
-#: plugins/sudoers/visudo.c:962 plugins/sudoers/visudo.c:1035 toke.l:1015
-#: toke.l:1147 toke.l:1218
+#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
+#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
+#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
+#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
+#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
+#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
+#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
+#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
+#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
+#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
+#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
+#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
+#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
+#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
+#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
+#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
+#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
+#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
+#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
+#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
+#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
+#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
+#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
+#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
+#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
+#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
+#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
+#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
+#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
+#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
+#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
+#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
+#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
+#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
+#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
+#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
+#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
+#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
+#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
+#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
+#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
+#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
+#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
+#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
+#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
+#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
+#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "не могу да доделим меморију"
-#: gram.y:615
+#: gram.y:622
msgid "a digest requires a path name"
msgstr "зборник захтева назив путање"
-#: gram.y:637
+#: gram.y:644
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "вредноÑÑ‚ за „CWD“ мора почети Ñа /, ~, или *"
-#: gram.y:643
+#: gram.y:650
msgid "\"CWD\" path too long"
msgstr "„CWD“ путања је предуга"
-#: gram.y:653
+#: gram.y:660
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "вредноÑÑ‚ за „CHROOT“ мора почети Ñа /, ~, или *"
-#: gram.y:659
+#: gram.y:666
msgid "\"CHROOT\" path too long"
msgstr "„CHROOT“ путања је предуга"
-#: gram.y:788
+#: gram.y:801
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "грешка ÑинтакÑе, резервиÑана реч „%s“ је коришћена као назив алијаÑа"
-#: gram.y:811
+#: gram.y:824
msgid "invalid notbefore value"
msgstr "неиÑправна вредноÑÑ‚ не-пре"
-#: gram.y:820
+#: gram.y:833
msgid "invalid notafter value"
msgstr "неиÑправна вредноÑÑ‚ не-поÑле"
-#: gram.y:830 plugins/sudoers/policy.c:353
+#: gram.y:843 plugins/sudoers/policy.c:376
msgid "timeout value too large"
msgstr "вредноÑÑ‚ временÑког иÑтека је превелика"
-#: gram.y:832 plugins/sudoers/policy.c:355
+#: gram.y:845 plugins/sudoers/policy.c:378
msgid "invalid timeout value"
msgstr "неиÑправна вредноÑÑ‚ временÑког ограничења"
-#: gram.y:946 plugins/sudoers/sudoers.c:998
+#: gram.y:966 plugins/sudoers/sudoers.c:1014
msgid "command too long"
msgstr "наредба је предуга"
-#: gram.y:1200
+#: gram.y:1220 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1275
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1250
+#: gram.y:1270
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "ПÑеудоним „%s“ је већ одређен"
-#: gram.y:1748 gram.y:1798 lib/eventlog/eventlog.c:309
-#: lib/eventlog/eventlog.c:804 lib/eventlog/eventlog.c:877
-#: lib/eventlog/eventlog.c:880 lib/eventlog/eventlog.c:1176
-#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:204
+#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
+#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
+#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
#: lib/iolog/iolog_filter.c:232 lib/iolog/iolog_json.c:150
#: lib/iolog/iolog_json.c:381 lib/iolog/iolog_json.c:412
#: lib/iolog/iolog_json.c:555 lib/iolog/iolog_legacy.c:100
@@ -264,37 +263,37 @@ msgstr "ПÑеудоним „%s“ је већ одређен"
#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1084 logsrvd/logsrvd.c:1400 logsrvd/logsrvd.c:1406
+#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:293 logsrvd/tls_init.c:314
-#: logsrvd/tls_init.c:324 plugins/sudoers/audit.c:116
+#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
+#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:134
+#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
#: plugins/sudoers/cvtsudoers.c:191 plugins/sudoers/cvtsudoers.c:202
#: plugins/sudoers/cvtsudoers.c:332 plugins/sudoers/cvtsudoers.c:536
#: plugins/sudoers/cvtsudoers.c:669 plugins/sudoers/cvtsudoers.c:687
-#: plugins/sudoers/cvtsudoers.c:758 plugins/sudoers/cvtsudoers.c:873
-#: plugins/sudoers/cvtsudoers.c:880 plugins/sudoers/cvtsudoers.c:1376
-#: plugins/sudoers/cvtsudoers.c:1380 plugins/sudoers/cvtsudoers.c:1482
-#: plugins/sudoers/cvtsudoers_csv.c:182 plugins/sudoers/cvtsudoers_csv.c:245
-#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150
-#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234
-#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:375
-#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:437
-#: plugins/sudoers/cvtsudoers_ldif.c:448 plugins/sudoers/cvtsudoers_ldif.c:455
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:476
-#: plugins/sudoers/cvtsudoers_ldif.c:623 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:869
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:182
+#: plugins/sudoers/cvtsudoers_csv.c:245 plugins/sudoers/cvtsudoers_json.c:75
+#: plugins/sudoers/cvtsudoers_ldif.c:150 plugins/sudoers/cvtsudoers_ldif.c:193
+#: plugins/sudoers/cvtsudoers_ldif.c:234 plugins/sudoers/cvtsudoers_ldif.c:299
+#: plugins/sudoers/cvtsudoers_ldif.c:375 plugins/sudoers/cvtsudoers_ldif.c:429
+#: plugins/sudoers/cvtsudoers_ldif.c:437 plugins/sudoers/cvtsudoers_ldif.c:448
+#: plugins/sudoers/cvtsudoers_ldif.c:455 plugins/sudoers/cvtsudoers_ldif.c:467
+#: plugins/sudoers/cvtsudoers_ldif.c:480 plugins/sudoers/cvtsudoers_ldif.c:488
+#: plugins/sudoers/cvtsudoers_ldif.c:635 plugins/sudoers/cvtsudoers_merge.c:47
#: plugins/sudoers/cvtsudoers_merge.c:51
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
@@ -305,23 +304,21 @@ msgstr "ПÑеудоним „%s“ је већ одређен"
#: plugins/sudoers/cvtsudoers_merge.c:564
#: plugins/sudoers/cvtsudoers_merge.c:630
#: plugins/sudoers/cvtsudoers_merge.c:633
-#: plugins/sudoers/cvtsudoers_merge.c:1149
-#: plugins/sudoers/cvtsudoers_merge.c:1223 plugins/sudoers/defaults.c:468
-#: plugins/sudoers/defaults.c:690 plugins/sudoers/defaults.c:1051
-#: plugins/sudoers/defaults.c:1243 plugins/sudoers/editor.c:190
+#: plugins/sudoers/cvtsudoers_merge.c:1157
+#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
+#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
+#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
-#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:264
-#: plugins/sudoers/iolog.c:664 plugins/sudoers/iolog.c:690
-#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:433
-#: plugins/sudoers/ldap.c:443 plugins/sudoers/ldap.c:448
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:464
-#: plugins/sudoers/ldap.c:760 plugins/sudoers/ldap.c:924
-#: plugins/sudoers/ldap.c:1340 plugins/sudoers/ldap.c:1766
-#: plugins/sudoers/ldap.c:1803 plugins/sudoers/ldap.c:1884
-#: plugins/sudoers/ldap.c:2019 plugins/sudoers/ldap.c:2120
-#: plugins/sudoers/ldap.c:2136 plugins/sudoers/ldap_conf.c:218
+#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
+#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
+#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
+#: plugins/sudoers/ldap.c:755 plugins/sudoers/ldap.c:919
+#: plugins/sudoers/ldap.c:1335 plugins/sudoers/ldap.c:1761
+#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
+#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
+#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
@@ -329,69 +326,70 @@ msgstr "ПÑеудоним „%s“ је већ одређен"
#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:221 plugins/sudoers/log_client.c:242
-#: plugins/sudoers/log_client.c:255 plugins/sudoers/log_client.c:390
-#: plugins/sudoers/log_client.c:703 plugins/sudoers/log_client.c:724
-#: plugins/sudoers/log_client.c:1444 plugins/sudoers/log_client.c:1662
-#: plugins/sudoers/log_client.c:1989 plugins/sudoers/log_client.c:2045
-#: plugins/sudoers/logging.c:104 plugins/sudoers/logging.c:184
-#: plugins/sudoers/logging.c:185 plugins/sudoers/logging.c:468
-#: plugins/sudoers/logging.c:488 plugins/sudoers/logging.c:628
-#: plugins/sudoers/match_command.c:323 plugins/sudoers/match_command.c:566
-#: plugins/sudoers/match_command.c:615 plugins/sudoers/match_command.c:688
-#: plugins/sudoers/match_command.c:735 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:200 plugins/sudoers/parse.c:217
-#: plugins/sudoers/parse.c:249 plugins/sudoers/parse.c:266
-#: plugins/sudoers/parse.c:289 plugins/sudoers/parse.c:300
-#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
-#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
-#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
-#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
-#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
-#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
-#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:597
-#: plugins/sudoers/parse_ldif.c:626 plugins/sudoers/parse_ldif.c:651
-#: plugins/sudoers/parse_ldif.c:709 plugins/sudoers/parse_ldif.c:726
-#: plugins/sudoers/parse_ldif.c:754 plugins/sudoers/parse_ldif.c:761
-#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:161
-#: plugins/sudoers/policy.c:170 plugins/sudoers/policy.c:197
-#: plugins/sudoers/policy.c:338 plugins/sudoers/policy.c:353
-#: plugins/sudoers/policy.c:355 plugins/sudoers/policy.c:391
-#: plugins/sudoers/policy.c:400 plugins/sudoers/policy.c:448
-#: plugins/sudoers/policy.c:458 plugins/sudoers/policy.c:467
-#: plugins/sudoers/policy.c:476 plugins/sudoers/policy.c:570
-#: plugins/sudoers/policy.c:952 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/set_perms.c:363 plugins/sudoers/set_perms.c:706
-#: plugins/sudoers/set_perms.c:1073 plugins/sudoers/set_perms.c:1380
-#: plugins/sudoers/set_perms.c:1549 plugins/sudoers/sssd.c:144
-#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
-#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
-#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
-#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:111
-#: plugins/sudoers/stubs.c:119 plugins/sudoers/sudoers.c:335
-#: plugins/sudoers/sudoers.c:361 plugins/sudoers/sudoers.c:429
-#: plugins/sudoers/sudoers.c:438 plugins/sudoers/sudoers.c:479
-#: plugins/sudoers/sudoers.c:842 plugins/sudoers/sudoers.c:980
-#: plugins/sudoers/sudoers.c:1039 plugins/sudoers/sudoers.c:1305
-#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
-#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
-#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
-#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
-#: plugins/sudoers/testsudoers.c:580 plugins/sudoers/timestamp.c:424
-#: plugins/sudoers/timestamp.c:468 plugins/sudoers/timestamp.c:980
-#: plugins/sudoers/timestamp.c:1118 plugins/sudoers/toke_util.c:78
-#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
-#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
-#: plugins/sudoers/visudo.c:344 plugins/sudoers/visudo.c:350
-#: plugins/sudoers/visudo.c:456 plugins/sudoers/visudo.c:632
-#: plugins/sudoers/visudo.c:962 plugins/sudoers/visudo.c:1035 toke.l:1015
-#: toke.l:1147 toke.l:1210 toke.l:1218
+#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
+#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
+#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
+#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
+#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
+#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
+#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
+#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
+#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
+#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
+#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
+#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
+#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
+#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
+#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
+#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
+#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
+#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
+#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
+#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
+#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
+#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
+#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
+#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
+#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
+#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
+#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
+#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
+#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
+#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
+#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/set_perms.c:363
+#: plugins/sudoers/set_perms.c:706 plugins/sudoers/set_perms.c:1073
+#: plugins/sudoers/set_perms.c:1380 plugins/sudoers/set_perms.c:1549
+#: plugins/sudoers/sssd.c:144 plugins/sudoers/sssd.c:185
+#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
+#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
+#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
+#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
+#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
+#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
+#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
+#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
+#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
+#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
+#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
+#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
+#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
+#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
+#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
+#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
+#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
+#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
+#: toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
@@ -400,16 +398,18 @@ msgstr "%s: %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:580 plugins/sudoers/env.c:326
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
-#: plugins/sudoers/ldap.c:531 plugins/sudoers/ldap.c:764
-#: plugins/sudoers/ldap.c:1137 plugins/sudoers/ldap_conf.c:222
+#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
+#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/policy.c:740
-#: plugins/sudoers/policy.c:751 plugins/sudoers/prompt.c:168
-#: plugins/sudoers/serialize_list.c:62 plugins/sudoers/serialize_list.c:71
-#: plugins/sudoers/strvec_join.c:62 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/toke_util.c:213 toke.l:979 toke.l:1181
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
+#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
+#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
+#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
+#: toke.l:987 toke.l:1189
#, c-format
msgid "internal error, %s overflow"
msgstr "унутрашња грешка, прекорачење „%s“"
@@ -424,31 +424,31 @@ msgstr "не могу да удвоÑтручим Ñтандардни улаз:
msgid "unable to execute %s: %m"
msgstr "не могу да извршим „%s“: %m"
-#: lib/eventlog/eventlog.c:456 plugins/sudoers/auth/aix_auth.c:198
+#: lib/eventlog/eventlog.c:463 plugins/sudoers/auth/aix_auth.c:198
msgid "unable to fork"
msgstr "не могу да иÑцепим"
-#: lib/eventlog/eventlog.c:464 lib/eventlog/eventlog.c:518
+#: lib/eventlog/eventlog.c:473 lib/eventlog/eventlog.c:538
#, c-format
msgid "unable to fork: %m"
msgstr "не могу да иÑцепим: %m"
-#: lib/eventlog/eventlog.c:508
+#: lib/eventlog/eventlog.c:528
#, c-format
msgid "unable to open pipe: %m"
msgstr "не могу да отворим Ñпојку: %m"
-#: lib/eventlog/eventlog.c:1007
+#: lib/eventlog/eventlog.c:1030
#, c-format
msgid "%8s : %s"
msgstr "%8s : %s"
-#: lib/eventlog/eventlog.c:1036
+#: lib/eventlog/eventlog.c:1059
#, c-format
msgid "%8s : (command continued) %s"
msgstr "%8s : (наредба је наÑтављена) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1296
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -564,13 +564,13 @@ msgid "%s exists but is not a directory (0%o)"
msgstr "%s поÑтоји али није директоријум (0%o)"
#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:807 plugins/sudoers/timestamp.c:205
+#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
#, c-format
msgid "unable to mkdir %s"
msgstr "не могу да направим директоријум „%s“"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:731
-#: plugins/sudoers/visudo.c:765 plugins/sudoers/visudo.c:771
+#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
+#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "не могу да променим режим „%s“ на 0%o"
@@ -585,8 +585,8 @@ msgstr "грешка читања датотеке времениÑања: %s"
msgid "invalid timing file line: %s"
msgstr "неиÑправан ред датотеке времениÑања: %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:804
-#: plugins/sudoers/policy.c:550
+#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
+#: plugins/sudoers/policy.c:573
msgid "unable to generate UUID"
msgstr "не могу да Ñтворим УУИБ"
@@ -645,56 +645,56 @@ msgstr "грешка затварања опиÑника датотеке У/И
msgid "error flushing iofd %d: %s"
msgstr "грешка иÑипања опиÑника датотеке У/И %d: %s"
-#: logsrvd/iolog_writer.c:777
+#: logsrvd/iolog_writer.c:780
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "неиÑправан У/И дневник „%s“: „%s“ је упутно али није приÑутно"
-#: logsrvd/iolog_writer.c:789 logsrvd/logsrvd_journal.c:377
+#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s: не могу да нађем тачку наÑтавка [%lld, %ld]"
-#: logsrvd/iolog_writer.c:811 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:245
-#: plugins/sudoers/check.c:273 plugins/sudoers/cvtsudoers.c:730
-#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1442
-#: plugins/sudoers/cvtsudoers_csv.c:681 plugins/sudoers/cvtsudoers_json.c:885
-#: plugins/sudoers/cvtsudoers_ldif.c:697 plugins/sudoers/sudoers.c:1092
+#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
+#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
+#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
+#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:949
+#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
#, c-format
msgid "unable to open %s"
msgstr "не могу да отворим „%s“"
-#: logsrvd/iolog_writer.c:823 logsrvd/logsrv_util.c:100
+#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "не могу да отворим „%s/%s“"
-#: logsrvd/iolog_writer.c:836
+#: logsrvd/iolog_writer.c:839
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "не могу да умножим „%s/%s“ у „%s/%s“: %s"
-#: logsrvd/iolog_writer.c:865 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
#, c-format
msgid "unable to rename %s to %s"
msgstr "не могу да преименујем „%s“ у „%s“"
-#: logsrvd/logsrv_util.c:139 logsrvd/logsrv_util.c:168
+#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s: не могу да нађем тачку наÑтавка [%lld, %ld]"
-#: logsrvd/logsrv_util.c:151
+#: logsrvd/logsrv_util.c:154
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "недоÑтаје У/И датотека дневника „%s/%s“"
-#: logsrvd/logsrv_util.c:158
+#: logsrvd/logsrv_util.c:161
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: не могу да премотам унапред „%zu“"
@@ -703,32 +703,32 @@ msgstr "%s/%s: не могу да премотам унапред „%zu“"
msgid "unable to connect to relay"
msgstr "не могу да Ñе повежем Ñа преноÑником"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:835
+#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
#, c-format
msgid "server message too large: %zu"
msgstr "порука Ñервера је превелика: %zu"
#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1010
-#: logsrvd/logsrvd.c:1134 logsrvd/logsrvd.c:1307 logsrvd/logsrvd.c:1325
-#: logsrvd/logsrvd.c:1423 logsrvd/logsrvd.c:1546 logsrvd/logsrvd.c:1730
-#: logsrvd/logsrvd_journal.c:489 logsrvd/logsrvd_local.c:197
+#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
+#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
+#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
+#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1121
+#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:209 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1027 plugins/sudoers/iolog.c:1160
-#: plugins/sudoers/iolog.c:1258 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
-#: plugins/sudoers/log_client.c:395 plugins/sudoers/log_client.c:599
-#: plugins/sudoers/log_client.c:606 plugins/sudoers/log_client.c:1131
-#: plugins/sudoers/log_client.c:1413 plugins/sudoers/log_client.c:1454
-#: plugins/sudoers/log_client.c:1462 plugins/sudoers/log_client.c:1618
-#: plugins/sudoers/log_client.c:1734 plugins/sudoers/log_client.c:2053
-#: plugins/sudoers/log_client.c:2061 plugins/sudoers/logging.c:142
-#: plugins/sudoers/logging.c:199 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
+#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
+#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
+#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
+#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
+#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
+#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
+#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
+#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
+#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -773,6 +773,13 @@ msgstr "%s: неочекивана У/И међумеморија"
msgid "protocol error"
msgstr "грешка протокола"
+#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
+#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
+#: plugins/sudoers/log_client.c:1618
+#, c-format
+msgid "unable to unpack %s size %zu"
+msgstr "не могу да отпакујем „%s“ величине %zu"
+
#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
#, c-format
@@ -788,110 +795,110 @@ msgstr "непозната врÑта „Поруке_клијента“"
msgid "timed out writing to client %s"
msgstr "иÑтекло је време пиÑања на клијенту „%s“"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:907 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
#, c-format
msgid "missing write buffer for client %s"
msgstr "недоÑтаје међумеморија пиÑања за клијента „%s“"
-#: logsrvd/logsrvd.c:981
+#: logsrvd/logsrvd.c:982
#, c-format
msgid "timed out reading from client %s"
msgstr "иÑтекло је време читања Ñа клијента „%s“"
-#: logsrvd/logsrvd.c:1022 logsrvd/logsrvd_relay.c:771
+#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "крај датотеке из „%s“ без одговарајућег ТЛС гашења"
-#: logsrvd/logsrvd.c:1065 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:709
+#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
+#: plugins/sudoers/log_client.c:716
#, c-format
msgid "client message too large: %zu"
msgstr "порука клијента је превелика: %zu"
-#: logsrvd/logsrvd.c:1066 logsrvd/logsrvd_journal.c:246
+#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
#: logsrvd/logsrvd_journal.c:247
msgid "client message too large"
msgstr "порука клијента је превелика"
-#: logsrvd/logsrvd.c:1084 logsrvd/logsrvd.c:1085
+#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
msgid "invalid ClientMessage"
msgstr "неиÑправна „Порука клијента“"
-#: logsrvd/logsrvd.c:1386
+#: logsrvd/logsrvd.c:1389
msgid "unable to get remote IP addr"
msgstr "не могу да добавим удаљену ИП адреÑу"
-#: logsrvd/logsrvd.c:1415 logsrvd/tls_client.c:196
-#: plugins/sudoers/log_client.c:270
+#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
+#: plugins/sudoers/log_client.c:276
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "Ðе могу да прикачим податке кориÑника ÑÑл објекту: %s"
-#: logsrvd/logsrvd.c:1596 logsrvd/logsrvd.c:1948
+#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
msgid "unable to setup listen socket"
msgstr "не могу да подеÑим прикључницу оÑлушкивања"
-#: logsrvd/logsrvd.c:1713
+#: logsrvd/logsrvd.c:1718
#, c-format
msgid "unexpected signal %d"
msgstr "неочекивани Ñигнал %d"
-#: logsrvd/logsrvd.c:1850
+#: logsrvd/logsrvd.c:1855
msgid "sudo log server"
msgstr "Ñервер Ñудо дневника"
-#: logsrvd/logsrvd.c:1852 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
msgid "Options:"
msgstr "Опције:"
-#: logsrvd/logsrvd.c:1854
+#: logsrvd/logsrvd.c:1859
msgid "path to configuration file"
msgstr "путања до датотеке подешавања"
-#: logsrvd/logsrvd.c:1856 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
msgid "display help message and exit"
msgstr "приказује поруку помоћи и излази"
-#: logsrvd/logsrvd.c:1858
+#: logsrvd/logsrvd.c:1863
msgid "do not fork, run in the foreground"
msgstr "не клонира, ради у првом плану"
-#: logsrvd/logsrvd.c:1860
+#: logsrvd/logsrvd.c:1865
msgid "percent chance connections will drop"
msgstr "проÑенат шанÑи за одбацивање веза"
-#: logsrvd/logsrvd.c:1862 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
msgid "display version information and exit"
msgstr "приказује податке о издању и излази"
-#: logsrvd/logsrvd.c:1912 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Потребно је „Protobuf-C“ издање 1.3 или новије"
-#: logsrvd/logsrvd.c:1928
+#: logsrvd/logsrvd.c:1933
#, c-format
msgid "invalid random drop value: %s"
msgstr "неиÑправна вредноÑÑ‚ одбацивања наÑумичноÑти: %s"
-#: logsrvd/logsrvd.c:1931 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:177
+#: plugins/sudoers/visudo.c:180
#, c-format
msgid "%s version %s\n"
msgstr "%s издање %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:335
-#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:120
-#: plugins/sudoers/policy.c:1188 plugins/sudoers/sudoers.c:486
-#: plugins/sudoers/sudoers.c:1347 plugins/sudoers/testsudoers.c:215
+#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
+#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
+#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "непознат кориÑник „%s“"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:145
-#: plugins/sudoers/sudoers.c:491 plugins/sudoers/sudoers.c:1381
+#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
@@ -965,7 +972,7 @@ msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] неиÑправан кључ: %s"
#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:857
+#: plugins/sudoers/logging.c:1035
#, c-format
msgid "unable to open log file %s"
msgstr "не могу да отворим датотеку дневника „%s“"
@@ -978,13 +985,13 @@ msgstr "не могу да покренем ТЛС контекÑÑ‚ Ñервер
msgid "unable to initialize relay TLS context"
msgstr "не могу да покренем ТЛС контекÑÑ‚ преноÑника"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:416
-#: logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
+#: logsrvd/logsrvd_journal.c:416
msgid "unable to create journal file"
msgstr "не могу да направим датотеку дневника"
#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1007
+#: plugins/sudoers/visudo.c:1020
#, c-format
msgid "unable to lock %s"
msgstr "не могу да закључам „%s“"
@@ -997,8 +1004,8 @@ msgstr "не могу да закључам датотеку дневника"
msgid "unable to open journal file"
msgstr "не могу да отворим датотеку дневника"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:452
-#: logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
+#: logsrvd/logsrvd_journal.c:452
msgid "unable to write journal file"
msgstr "не могу да запишем датотеку дневника"
@@ -1016,11 +1023,11 @@ msgstr "неочекивани крај датотеке читајући дат
msgid "error reading journal file"
msgstr "грешка читања датотеке дневника"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:376
+#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
msgid "invalid journal file, unable to restart"
msgstr "неиÑправна датотека дневника, не могу поново да почнем"
-#: logsrvd/logsrvd_journal.c:435
+#: logsrvd/logsrvd_journal.c:430
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "не могу да премотам на [%lld, %ld] у датотеци дневника „%s“"
@@ -1108,7 +1115,7 @@ msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s: неиÑправан поздрав Ñервера, недоÑтаје иб Ñервера"
#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1497
+#: plugins/sudoers/log_client.c:1504
msgid "invalid ServerHello"
msgstr "неиÑправан „Поздрав_Ñервера“"
@@ -1129,34 +1136,34 @@ msgstr "иÑтекло је време читања Ñа преноÑника"
msgid "relay host name does not match certificate"
msgstr "назив домаћина преноÑника не одговара уверењу"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:776
-#: logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
+#: logsrvd/logsrvd_relay.c:784
msgid "error reading from relay"
msgstr "грешка читања Ñа преноÑника"
-#: logsrvd/logsrvd_relay.c:803
+#: logsrvd/logsrvd_relay.c:805
msgid "unable to read from relay"
msgstr "не могу да читам Ñа преноÑника"
-#: logsrvd/logsrvd_relay.c:818 logsrvd/logsrvd_relay.c:936
+#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
msgid "relay server closed connection"
msgstr "Ñервер преноÑника је затворио везу"
-#: logsrvd/logsrvd_relay.c:836
+#: logsrvd/logsrvd_relay.c:838
msgid "server message too large"
msgstr "порука Ñервера је превелика"
-#: logsrvd/logsrvd_relay.c:900
+#: logsrvd/logsrvd_relay.c:902
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "иÑтекло је време пиÑања на преноÑнику „%s“ (%s)"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:904
msgid "timeout writing to relay"
msgstr "иÑтекло је време пиÑања на преноÑнику"
-#: logsrvd/logsrvd_relay.c:955 logsrvd/logsrvd_relay.c:961
-#: logsrvd/logsrvd_relay.c:971
+#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
+#: logsrvd/logsrvd_relay.c:974
msgid "error writing to relay"
msgstr "грешка пиÑања на преноÑнику"
@@ -1212,7 +1219,7 @@ msgstr "прекида Ð¿Ñ€ÐµÐ½Ð¾Ñ Ð½Ð°ÐºÐ¾Ð½ доÑтизања овог врÐ
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "теÑтира анкетни Ñервер шаљући изабрани У/И дневник n пута у паралели"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:441
+#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "не могу да потражим „%s:%s“: %s"
@@ -1226,30 +1233,30 @@ msgstr "не могу да добавим ИП адреÑу Ñервера"
msgid "unable to read %s/%s: %s"
msgstr "не могу да прочитам „%s/%s“: %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:945
-#: plugins/sudoers/iolog.c:1020
+#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
+#: plugins/sudoers/iolog.c:1024
#, c-format
msgid "unexpected I/O event %d"
msgstr "неочекивани У/И догађај „%d“"
#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1146 plugins/sudoers/log_client.c:1423
-#: plugins/sudoers/log_client.c:1491 plugins/sudoers/log_client.c:1530
+#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
+#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: неочекивано Ñтање „%d“"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1576
+#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
#, c-format
msgid "error message received from server: %s"
msgstr "порука грешке је примљена Ñа Ñервера: %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1589
+#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
#, c-format
msgid "abort message received from server: %s"
msgstr "порука прекида је примљена Ñа Ñервера: %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1639
+#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: неочекивана вредноÑÑ‚ врÑте_Ñлова „%d“"
@@ -1258,11 +1265,15 @@ msgstr "%s: неочекивана вредноÑÑ‚ врÑте_Ñлова „%dâ
msgid "timeout reading from server"
msgstr "иÑтекло је време читања Ñа Ñервера"
+#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+msgid "host name does not match certificate"
+msgstr "назив домаћина не одговара уверењу"
+
#: logsrvd/sendlog.c:1368
msgid "premature EOF"
msgstr "прерани крај датотеке"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1800
+#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
#, c-format
msgid "server message too large: %u"
msgstr "порука Ñервера је превелика: %u"
@@ -1294,12 +1305,12 @@ msgstr "протекло време поÑлато Ñерверу [%lld, %ld]"
msgid "commit point received from server [%lld, %ld]"
msgstr "тачка Ñлања примљена Ñа Ñервера [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:304
+#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
msgid "TLS handshake timeout occurred"
msgstr "дошло је до временÑког иÑтека ТЛС руковања"
#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:326 plugins/sudoers/log_client.c:342
+#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
msgid "unable to set event"
msgstr "не могу да подеÑим догађај"
@@ -1308,50 +1319,51 @@ msgstr "не могу да подеÑим догађај"
msgid "TLS connection failed: %s"
msgstr "ТЛС веза није уÑпела: %s"
-#: logsrvd/tls_client.c:190
+#: logsrvd/tls_client.c:191
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "не могу да доделим ÑÑл објекат: %s"
-#: logsrvd/tls_client.c:203
+#: logsrvd/tls_client.c:205
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "Ðе могу да прикачим прикључницу ÑÑл објекту: %s"
-#: logsrvd/tls_client.c:231
+#: logsrvd/tls_client.c:233
msgid "unable to initialize TLS context"
msgstr "не могу да покренем ТЛС контекÑÑ‚"
-#: logsrvd/tls_init.c:127 logsrvd/tls_init.c:135
+#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "не могу да подеÑим шифрарник ТЛС-а 1.2 на „%s“: %s"
-#: logsrvd/tls_init.c:155 logsrvd/tls_init.c:163
+#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "не могу да подеÑим шифрарник ТЛС-а 1.3 на „%s“: %s"
-#: logsrvd/tls_init.c:195 logsrvd/tls_init.c:216
+#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "не могу да подеÑим „diffie-hellman“ параметре: %s"
-#: logsrvd/tls_init.c:272
+#: logsrvd/tls_init.c:277
#, c-format
msgid "unable to create TLS context: %s"
msgstr "Ðе могу да Ñтворим ТЛС контекÑÑ‚: %s"
-#: logsrvd/tls_init.c:278
+#: logsrvd/tls_init.c:284
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "не могу да подеÑим најмање издање протокола на „TLS 1.2“: %s"
#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:979 plugins/sudoers/log_client.c:1028
-#: plugins/sudoers/log_client.c:1077 plugins/sudoers/log_client.c:1203
-#: plugins/sudoers/logging.c:552 plugins/sudoers/logging.c:649
-#: plugins/sudoers/logging.c:811 plugins/sudoers/policy.c:123
+#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
+#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
+#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
+#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
+#: plugins/sudoers/policy.c:123
msgid "unable to get time of day"
msgstr "не могу да добавим време дана"
@@ -1407,47 +1419,47 @@ msgstr ""
"грешка Ñервера потврђивања идентитета:\n"
"%s"
-#: plugins/sudoers/auth/kerb5.c:110
+#: 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:162
+#: plugins/sudoers/auth/kerb5.c:164
#, c-format
msgid "%s: unable to parse '%s': %s"
msgstr "%s: не могу да обрадим „%s“: %s"
-#: plugins/sudoers/auth/kerb5.c:171
+#: plugins/sudoers/auth/kerb5.c:173
#, c-format
msgid "%s: unable to resolve credential cache: %s"
msgstr "%s: не могу да решим оÑтаву пуномоћÑтва: %s"
-#: plugins/sudoers/auth/kerb5.c:220
+#: plugins/sudoers/auth/kerb5.c:222
#, c-format
msgid "%s: unable to allocate options: %s"
msgstr "%s: не могу да доделим опције: %s"
-#: plugins/sudoers/auth/kerb5.c:235
+#: plugins/sudoers/auth/kerb5.c:237
#, c-format
msgid "%s: unable to get credentials: %s"
msgstr "%s: не могу да добавим пуномоћÑтва: %s"
-#: plugins/sudoers/auth/kerb5.c:248
+#: plugins/sudoers/auth/kerb5.c:250
#, c-format
msgid "%s: unable to initialize credential cache: %s"
msgstr "%s: не могу да покренем оÑтаву пуномоћÑтва: %s"
-#: plugins/sudoers/auth/kerb5.c:251
+#: plugins/sudoers/auth/kerb5.c:253
#, c-format
msgid "%s: unable to store credential in cache: %s"
msgstr "%s: не могу да ÑмеÑтим пуномоћÑтва у оÑтаву: %s"
-#: plugins/sudoers/auth/kerb5.c:315
+#: plugins/sudoers/auth/kerb5.c:317
#, c-format
msgid "%s: unable to get host principal: %s"
msgstr "%s: не могу да добавим главника домаћина: %s"
-#: plugins/sudoers/auth/kerb5.c:329
+#: plugins/sudoers/auth/kerb5.c:331
#, c-format
msgid "%s: Cannot verify TGT! Possible attack!: %s"
msgstr "%s: Ðе могу потврдити ТГТ! Могући напад!: %s"
@@ -1488,7 +1500,7 @@ msgstr "Ðалог је иÑтекао или ПÐÐœ подешавањима н
msgid "PAM account management error: %s"
msgstr "грешка управљања ПÐÐœ налогом: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:255
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
#, c-format
msgid "you do not exist in the %s database"
msgstr "ви не поÑтојите у бази подтака „%s“"
@@ -1529,27 +1541,27 @@ msgstr "неиÑправна дужина пропуÑне шифре за беÐ
msgid "unable to initialize SIA session"
msgstr "не могу да покренем СИРÑеÑију"
-#: plugins/sudoers/auth/sudo_auth.c:134
+#: plugins/sudoers/auth/sudo_auth.c:135
msgid "invalid authentication methods"
msgstr "неиÑправни начини потврђивања идентитета"
-#: plugins/sudoers/auth/sudo_auth.c:136
+#: plugins/sudoers/auth/sudo_auth.c:137
msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication."
msgstr "ÐеиÑправни начини потврђивања идентитета Ñу преведени у Ñудоу! Ðе можете мешати ÑамоÑтално и неÑамоÑтално потврђивање идентитета."
-#: plugins/sudoers/auth/sudo_auth.c:257 plugins/sudoers/auth/sudo_auth.c:309
+#: plugins/sudoers/auth/sudo_auth.c:258 plugins/sudoers/auth/sudo_auth.c:310
msgid "no authentication methods"
msgstr "нема начина потврђивања идентитета"
-#: plugins/sudoers/auth/sudo_auth.c:259
+#: plugins/sudoers/auth/sudo_auth.c:260
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:311
+#: plugins/sudoers/auth/sudo_auth.c:312
msgid "Unable to initialize authentication methods."
msgstr "Ðе могу да покренем методе потврђивања идентитета."
-#: plugins/sudoers/auth/sudo_auth.c:482
+#: plugins/sudoers/auth/sudo_auth.c:486
msgid "Authentication methods:"
msgstr "Ðачини потврђивања идентитета:"
@@ -1561,17 +1573,17 @@ msgstr "Ðе могу да утврдим уÑлов прегледа"
msgid "unable to commit audit record"
msgstr "не могу да предам Ñнимак прегледа"
-#: plugins/sudoers/check.c:263
+#: plugins/sudoers/check.c:275
#, c-format
msgid "error reading lecture file %s"
msgstr "грешка читања датотеке обучавања „%s“"
-#: plugins/sudoers/check.c:269
+#: plugins/sudoers/check.c:278
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "занемарујем датотеку обучавања „%s“: није обична датотека"
-#: plugins/sudoers/check.c:282
+#: plugins/sudoers/check.c:291
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1591,32 +1603,27 @@ msgstr ""
" #3) Са великом моћи долази и велика одговорноÑÑ‚.\n"
"\n"
-#: plugins/sudoers/check.c:330 plugins/sudoers/check.c:340
-#: plugins/sudoers/sudoers.c:885 plugins/sudoers/sudoers.c:906
-#: plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
+#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "непознат јиб %u"
-#: plugins/sudoers/check_aliases.c:92
-#, c-format
-msgid "Error: %s:%d:%d: cycle in %s \"%s\""
-msgstr "Грешка: %s:%d:%d: Ñ†Ð¸ÐºÐ»ÑƒÑ Ñƒ „%s“ „%s“"
-
-#: plugins/sudoers/check_aliases.c:93
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
#, c-format
-msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
-msgstr "Упозорење: %s:%d:%d: Ñ†Ð¸ÐºÐ»ÑƒÑ Ñƒ „%s“ „%s“"
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
-#: plugins/sudoers/check_aliases.c:97
+#: plugins/sudoers/check_aliases.c:133
#, c-format
-msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
-msgstr "Грешка: %s:%d:%d: упута за „%s“ „%s“ поÑтоји али није одређена"
+msgid "cycle in %s \"%s\""
+msgstr "Ñ†Ð¸ÐºÐ»ÑƒÑ Ñƒ „%s“ „%s“"
-#: plugins/sudoers/check_aliases.c:98
+#: plugins/sudoers/check_aliases.c:136
#, c-format
-msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
-msgstr "Упозорење: %s:%d:%d: упута за „%s“ „%s“ поÑтоји али није одређена"
+msgid "%s \"%s\" referenced but not defined"
+msgstr "упута за „%s“ „%s“ поÑтоји али није дефиниÑана"
#: plugins/sudoers/cvtsudoers.c:209
#, c-format
@@ -1633,7 +1640,7 @@ msgstr "поредак почетка: %s: %s"
msgid "order padding: %s: %s"
msgstr "попуњавање поретка: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:179
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
#, c-format
msgid "%s grammar version %d\n"
msgstr "%s граматика издање %d\n"
@@ -1653,10 +1660,10 @@ msgstr "неподржан Ð·Ð°Ð¿Ð¸Ñ Ð¸Ð·Ð»Ð°Ð·Ð° „%s“"
msgid "%s: input and output files must be different"
msgstr "%s: улазна датотека треба да Ñе разликује од излазне"
-#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:159
-#: plugins/sudoers/sudoers.c:205 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:261 plugins/sudoers/visudo.c:620
-#: plugins/sudoers/visudo.c:953
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:165
+#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
+#: plugins/sudoers/visudo.c:969
msgid "unable to initialize sudoers default values"
msgstr "не могу да покренем оÑновне вредноÑти ÑудоерÑа"
@@ -1685,28 +1692,18 @@ msgstr "неиÑправна врÑта потиÑкивања: %s"
msgid "invalid filter: %s"
msgstr "неиÑправан филтер: %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:958
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
#, c-format
msgid "failed to parse %s file, unknown error"
msgstr "ниÑам уÑпео да обрадим %s датотеку, непозната грешка"
-#: plugins/sudoers/cvtsudoers.c:762
-#, c-format
-msgid "parse error in %s near line %d\n"
-msgstr "грешка обраде у %s близу реда %d\n"
-
-#: plugins/sudoers/cvtsudoers.c:765
-#, c-format
-msgid "parse error in %s\n"
-msgstr "грешка обраде у %s\n"
-
-#: plugins/sudoers/cvtsudoers.c:1489 plugins/sudoers/sudoreplay.c:1145
+#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
#, c-format
msgid "unable to write to %s"
msgstr "не могу да пишем у „%s“"
-#: plugins/sudoers/cvtsudoers.c:1512
+#: plugins/sudoers/cvtsudoers.c:1501
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1715,7 +1712,7 @@ msgstr ""
"%s – претвара међуÑобно запиÑе датотеке ÑудоерÑа\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1514
+#: plugins/sudoers/cvtsudoers.c:1503
msgid ""
"\n"
"Options:\n"
@@ -1756,31 +1753,31 @@ msgstr ""
" -V, --version приказује податке о издању и излази"
#: plugins/sudoers/cvtsudoers_csv.c:452 plugins/sudoers/cvtsudoers_csv.c:466
-#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:669
+#: plugins/sudoers/cvtsudoers_json.c:657 plugins/sudoers/cvtsudoers_json.c:672
#: plugins/sudoers/cvtsudoers_ldif.c:347 plugins/sudoers/cvtsudoers_ldif.c:360
-#: plugins/sudoers/ldap.c:515
+#: plugins/sudoers/ldap.c:510
msgid "unable to get GMT time"
msgstr "не могу да добавим ГМТ време"
#: plugins/sudoers/cvtsudoers_csv.c:457 plugins/sudoers/cvtsudoers_csv.c:471
-#: plugins/sudoers/cvtsudoers_json.c:659 plugins/sudoers/cvtsudoers_json.c:674
+#: plugins/sudoers/cvtsudoers_json.c:662 plugins/sudoers/cvtsudoers_json.c:677
#: plugins/sudoers/cvtsudoers_ldif.c:352 plugins/sudoers/cvtsudoers_ldif.c:365
-#: plugins/sudoers/ldap.c:523
+#: plugins/sudoers/ldap.c:518
msgid "unable to format timestamp"
msgstr "не могу да обликујем временÑку ознаку"
#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:515
-#: plugins/sudoers/cvtsudoers_json.c:725 plugins/sudoers/defaults.c:190
+#: plugins/sudoers/cvtsudoers_json.c:728
#, c-format
msgid "%s:%d:%d: unknown defaults entry \"%s\""
msgstr "%s:%d:%d: непознат ÑƒÐ½Ð¾Ñ Ð¾ÑновноÑти „%s“"
-#: plugins/sudoers/cvtsudoers_ldif.c:649
+#: plugins/sudoers/cvtsudoers_ldif.c:661
#, c-format
msgid "too many sudoers entries, maximum %u"
msgstr "превише уноÑа ÑудоерÑа, највише %u"
-#: plugins/sudoers/cvtsudoers_ldif.c:692
+#: plugins/sudoers/cvtsudoers_ldif.c:704
msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified."
msgstr "променљива „SUDOERS_BASE“ окружења није поÑтављена и „-b“ опција није наведена."
@@ -1825,780 +1822,751 @@ msgstr "%s:%d:%d: не могу да учиним оÑновноÑти „%s“
msgid "%s:%d:%d: removing Defaults \"%s\" overridden by subsequent entries"
msgstr "%s:%d:%d: уклањам оÑновноÑти „%s“ препиÑане Ñледећим уноÑима"
-#: plugins/sudoers/cvtsudoers_merge.c:1080
+#: plugins/sudoers/cvtsudoers_merge.c:1088
#, c-format
msgid "%s:%d:%d: merging userspec into %s:%d:%d"
msgstr "%s:%d:%d: Ñтапам кориÑничку Ñпецификацију у „%s:%d:%d“"
-#: plugins/sudoers/cvtsudoers_merge.c:1174
+#: plugins/sudoers/cvtsudoers_merge.c:1182
#, c-format
msgid "%s:%d:%d: removing userspec overridden by subsequent entries"
msgstr "%s:%d:%d: уклањам кориÑничку ÑпецифичноÑÑ‚ препиÑану Ñледећим уноÑима"
-#: plugins/sudoers/def_data.c:50
+#: plugins/sudoers/def_data.c:56
#, c-format
msgid "Syslog facility if syslog is being used for logging: %s"
msgstr "Помоћник ÑиÑдневника ако је ÑиÑдневник коришћен за пријављивање: %s"
-#: plugins/sudoers/def_data.c:54
+#: plugins/sudoers/def_data.c:60
#, c-format
msgid "Syslog priority to use when user authenticates successfully: %s"
msgstr "Приоритет ÑиÑтемÑког дневника за коришћење када кориÑник уÑпешно потврди идентитет: %s"
-#: plugins/sudoers/def_data.c:58
+#: plugins/sudoers/def_data.c:64
#, c-format
msgid "Syslog priority to use when user authenticates unsuccessfully: %s"
msgstr "Приоритет ÑиÑтемÑког дневника за коришћење када кориÑник неуÑпешно потврди идентитет: %s"
-#: plugins/sudoers/def_data.c:62
+#: plugins/sudoers/def_data.c:68
msgid "Put OTP prompt on its own line"
msgstr "ПоÑтавља ОТП упит на Ñвом реду"
-#: plugins/sudoers/def_data.c:66
+#: plugins/sudoers/def_data.c:72
msgid "Ignore '.' in $PATH"
msgstr "Занемарује . у $ПУТÐЊИ"
-#: plugins/sudoers/def_data.c:70
+#: plugins/sudoers/def_data.c:76
msgid "Always send mail when sudo is run"
msgstr "Увек шаље пошту када је Ñудо покренут"
-#: plugins/sudoers/def_data.c:74
+#: plugins/sudoers/def_data.c:80
msgid "Send mail if user authentication fails"
msgstr "Пошаљи поруку ако потврђивање идентитета кориÑника не уÑпе"
-#: plugins/sudoers/def_data.c:78
+#: plugins/sudoers/def_data.c:84
msgid "Send mail if the user is not in sudoers"
msgstr "Пошаљи поруку ако кориÑник није у ÑудоерÑу"
-#: plugins/sudoers/def_data.c:82
+#: plugins/sudoers/def_data.c:88
msgid "Send mail if the user is not in sudoers for this host"
msgstr "Пошаљи поруку ако кориÑник није у ÑудоерÑу за овог домаћина"
-#: plugins/sudoers/def_data.c:86
+#: plugins/sudoers/def_data.c:92
msgid "Send mail if the user is not allowed to run a command"
msgstr "Пошаљи поруку ако кориÑнику није дозвољено да покрене наредбу"
-#: plugins/sudoers/def_data.c:90
+#: plugins/sudoers/def_data.c:96
msgid "Send mail if the user tries to run a command"
msgstr "Пошаљи поруку ако кориÑник покуша да покрене наредбу"
-#: plugins/sudoers/def_data.c:94
+#: plugins/sudoers/def_data.c:100
msgid "Use a separate timestamp for each user/tty combo"
msgstr "КориÑти одвојене временÑке ознаке за Ñваку комбинацију кориÑник/конзола"
-#: plugins/sudoers/def_data.c:98
+#: plugins/sudoers/def_data.c:104
msgid "Lecture user the first time they run sudo"
msgstr "Подучава кориÑника када први пут покрену Ñудо"
-#: plugins/sudoers/def_data.c:102
+#: plugins/sudoers/def_data.c:108
#, c-format
msgid "File containing the sudo lecture: %s"
msgstr "Датотека Ñадржи Ñудо обучавања: %s"
-#: plugins/sudoers/def_data.c:106
+#: plugins/sudoers/def_data.c:112
msgid "Require users to authenticate by default"
msgstr "Захтева да кориÑници потврде идентитет по оÑнови"
-#: plugins/sudoers/def_data.c:110
+#: plugins/sudoers/def_data.c:116
msgid "Root may run sudo"
msgstr "ÐдминиÑтратор може да покрене Ñудо"
-#: plugins/sudoers/def_data.c:114
+#: plugins/sudoers/def_data.c:120
msgid "Log the hostname in the (non-syslog) log file"
msgstr "Бележи назив домаћина у (не-ÑиÑдневник) датотеци дневника"
-#: plugins/sudoers/def_data.c:118
+#: plugins/sudoers/def_data.c:124
msgid "Log the year in the (non-syslog) log file"
msgstr "Бележи годину у (не-ÑиÑдневник) датотеци дневника"
-#: plugins/sudoers/def_data.c:122
+#: plugins/sudoers/def_data.c:128
msgid "If sudo is invoked with no arguments, start a shell"
msgstr "Ðко је Ñудо призван без аргумената, покреће шкољку"
-#: plugins/sudoers/def_data.c:126
+#: plugins/sudoers/def_data.c:132
msgid "Set $HOME to the target user when starting a shell with -s"
msgstr "Подешава $HOME на крајњег кориÑника када покреће шкољку Ñа „-s“"
-#: plugins/sudoers/def_data.c:130
+#: plugins/sudoers/def_data.c:136
msgid "Always set $HOME to the target user's home directory"
msgstr "Увек подешава $HOME на циљни лични директоријум кориÑника"
-#: plugins/sudoers/def_data.c:134
+#: plugins/sudoers/def_data.c:140
msgid "Allow some information gathering to give useful error messages"
msgstr "Дозвољава прикупљање неких података да би дао кориÑне поруке грешака"
-#: plugins/sudoers/def_data.c:138
+#: plugins/sudoers/def_data.c:144
msgid "Require fully-qualified hostnames in the sudoers file"
msgstr "Захтева потпуно одређене називе домаћина у датотеци ÑудоерÑа"
-#: plugins/sudoers/def_data.c:142
+#: plugins/sudoers/def_data.c:148
msgid "Insult the user when they enter an incorrect password"
msgstr "Вређа кориÑника када унеÑе нетачну лозинку"
-#: plugins/sudoers/def_data.c:146
+#: plugins/sudoers/def_data.c:152
msgid "Only allow the user to run sudo if they have a tty"
msgstr "Дозвољава кориÑнику да покрене Ñудо Ñамо ако има конзолу"
-#: plugins/sudoers/def_data.c:150
+#: plugins/sudoers/def_data.c:156
msgid "Visudo will honor the EDITOR environment variable"
msgstr "ВиÑудо ће поштовати променљиву окружења УРЕЂИВÐЧÐ"
-#: plugins/sudoers/def_data.c:154
+#: plugins/sudoers/def_data.c:160
msgid "Prompt for root's password, not the users's"
msgstr "Тражи админиÑтраторову лозинку, а не кориÑника"
-#: plugins/sudoers/def_data.c:158
+#: plugins/sudoers/def_data.c:164
msgid "Prompt for the runas_default user's password, not the users's"
msgstr "Тражи кориÑникову лозинку покреникао_оÑновни, а не кориÑника"
-#: plugins/sudoers/def_data.c:162
+#: plugins/sudoers/def_data.c:168
msgid "Prompt for the target user's password, not the users's"
msgstr "Тражи кориÑникову лозинку мете, а не кориÑника"
-#: plugins/sudoers/def_data.c:166
+#: plugins/sudoers/def_data.c:172
msgid "Apply defaults in the target user's login class if there is one"
msgstr "Примењује оÑновноÑти у циљни кориÑнички разред пријављивања ако поÑтоји"
-#: plugins/sudoers/def_data.c:170
+#: plugins/sudoers/def_data.c:176
msgid "Set the LOGNAME and USER environment variables"
msgstr "Подешава променљиве окружења ÐÐЗИВДÐЕВÐИКРи КОРИСÐИК"
-#: plugins/sudoers/def_data.c:174
+#: plugins/sudoers/def_data.c:180
msgid "Only set the effective uid to the target user, not the real uid"
msgstr "Подешава Ñамо ефективни јиб на крајњег кориÑника, а не Ñтваран јиб"
-#: plugins/sudoers/def_data.c:178
+#: plugins/sudoers/def_data.c:184
msgid "Don't initialize the group vector to that of the target user"
msgstr "Ðе покреће вектор групе ка оном крајњег кориÑника"
-#: plugins/sudoers/def_data.c:182
+#: plugins/sudoers/def_data.c:188
#, c-format
msgid "Length at which to wrap log file lines (0 for no wrap): %u"
msgstr "Дужина за преламање редова у датотеци дневника (0 — без преламања): %u"
-#: plugins/sudoers/def_data.c:186
+#: plugins/sudoers/def_data.c:192
#, c-format
msgid "Authentication timestamp timeout: %.1f minutes"
msgstr "Време иÑтека временÑке ознаке потврђивања идентитета: %.1f минута"
-#: plugins/sudoers/def_data.c:190
+#: plugins/sudoers/def_data.c:196
#, c-format
msgid "Password prompt timeout: %.1f minutes"
msgstr "Време иÑтека упита лозинке: %.1f минута"
-#: plugins/sudoers/def_data.c:194
+#: plugins/sudoers/def_data.c:200
#, c-format
msgid "Number of tries to enter a password: %u"
msgstr "Број покушаја за уношење лозинке: %u"
-#: plugins/sudoers/def_data.c:198
+#: plugins/sudoers/def_data.c:204
#, c-format
msgid "Umask to use or 0777 to use user's: 0%o"
msgstr "УмаÑка за коришћење или 0777 за коришћење кориÑника: 0%o"
-#: plugins/sudoers/def_data.c:202
+#: plugins/sudoers/def_data.c:208
#, c-format
msgid "Path to log file: %s"
msgstr "Путања до датотеке дневника: %s"
-#: plugins/sudoers/def_data.c:206
+#: plugins/sudoers/def_data.c:212
#, c-format
msgid "Path to mail program: %s"
msgstr "Путања до програма поште: %s"
-#: plugins/sudoers/def_data.c:210
+#: plugins/sudoers/def_data.c:216
#, c-format
msgid "Flags for mail program: %s"
msgstr "Опције за програм поште: %s"
-#: plugins/sudoers/def_data.c:214
+#: plugins/sudoers/def_data.c:220
#, c-format
msgid "Address to send mail to: %s"
msgstr "ÐдреÑа на коју поÑлати поруку: %s"
-#: plugins/sudoers/def_data.c:218
+#: plugins/sudoers/def_data.c:224
#, c-format
msgid "Address to send mail from: %s"
msgstr "ÐдреÑа Ñа које поÑлати поруку: %s"
-#: plugins/sudoers/def_data.c:222
+#: plugins/sudoers/def_data.c:228
#, c-format
msgid "Subject line for mail messages: %s"
msgstr "Ред теме за поруке поште: %s"
-#: plugins/sudoers/def_data.c:226
+#: plugins/sudoers/def_data.c:232
#, c-format
msgid "Incorrect password message: %s"
msgstr "Порука нетачне лозинке: %s"
-#: plugins/sudoers/def_data.c:230
+#: plugins/sudoers/def_data.c:236
#, c-format
msgid "Path to lecture status dir: %s"
msgstr "Путања до директоријума Ñтања обучавања: %s"
-#: plugins/sudoers/def_data.c:234
+#: plugins/sudoers/def_data.c:240
#, c-format
msgid "Path to authentication timestamp dir: %s"
msgstr "Путања до директоријума временÑке ознаке потврђивања идентитета: %s"
-#: plugins/sudoers/def_data.c:238
+#: plugins/sudoers/def_data.c:244
#, c-format
msgid "Owner of the authentication timestamp dir: %s"
msgstr "ВлаÑник директоријума временÑке ознаке потврђивања идентитета: %s"
-#: plugins/sudoers/def_data.c:242
+#: plugins/sudoers/def_data.c:248
#, c-format
msgid "Users in this group are exempt from password and PATH requirements: %s"
msgstr "КориÑницима у овој групи Ñе не захтева лозинка и ПУТÐЊÐ: %s"
-#: plugins/sudoers/def_data.c:246
+#: plugins/sudoers/def_data.c:252
#, c-format
msgid "Default password prompt: %s"
msgstr "ОÑновни упит лозинке: %s"
-#: plugins/sudoers/def_data.c:250
+#: plugins/sudoers/def_data.c:256
msgid "If set, passprompt will override system prompt in all cases."
msgstr "Ðко је подешено, упит лозинке ће препиÑати ÑиÑтемÑки упит у Ñвим Ñлучајевима."
-#: plugins/sudoers/def_data.c:254
+#: plugins/sudoers/def_data.c:260
#, c-format
msgid "Default user to run commands as: %s"
msgstr "ОÑновни кориÑник за покретање наредби као: %s"
-#: plugins/sudoers/def_data.c:258
+#: plugins/sudoers/def_data.c:264
#, c-format
msgid "Value to override user's $PATH with: %s"
msgstr "ВредноÑÑ‚ за препиÑивање кориÑничке $ПУТÐЊЕ Ñа: %s"
-#: plugins/sudoers/def_data.c:262
+#: plugins/sudoers/def_data.c:268
#, c-format
msgid "Path to the editor for use by visudo: %s"
msgstr "Путања до уређивача кога ће да кориÑти виÑудо: %s"
-#: plugins/sudoers/def_data.c:266
+#: plugins/sudoers/def_data.c:272
#, c-format
msgid "When to require a password for 'list' pseudocommand: %s"
msgstr "Када да затражи лозинку за пÑеудонаредбу „list“: %s"
-#: plugins/sudoers/def_data.c:270
+#: plugins/sudoers/def_data.c:276
#, c-format
msgid "When to require a password for 'verify' pseudocommand: %s"
msgstr "Када да затражи лозинку за пÑеудонаредбу „verify“: %s"
-#: plugins/sudoers/def_data.c:274
+#: plugins/sudoers/def_data.c:280
msgid "Preload the sudo_noexec library which replaces the exec functions"
msgstr "Унапред учитава „sudo_noexec“ библиотеку која мења функцију извршавања"
-#: plugins/sudoers/def_data.c:278
+#: plugins/sudoers/def_data.c:284
msgid "If LDAP directory is up, do we ignore local sudoers file"
msgstr "Ðко је ЛДÐП директоријум изнет, да ли занемарујемо меÑну датотеку ÑудоерÑа"
-#: plugins/sudoers/def_data.c:282
+#: plugins/sudoers/def_data.c:288
#, c-format
msgid "File descriptors >= %d will be closed before executing a command"
msgstr "ОпиÑници датотека >= %d ће бити затворени пре извршавања наредбе"
-#: plugins/sudoers/def_data.c:286
+#: plugins/sudoers/def_data.c:292
msgid "If set, users may override the value of \"closefrom\" with the -C option"
msgstr "Ðко је подешено, кориÑници могу да препишу вредноÑÑ‚ „closefrom“ Ñа опцијом „-C“"
-#: plugins/sudoers/def_data.c:290
+#: plugins/sudoers/def_data.c:296
msgid "Allow users to set arbitrary environment variables"
msgstr "Дозвољава кориÑницима да подеÑе произвољне променљиве окружења"
-#: plugins/sudoers/def_data.c:294
+#: plugins/sudoers/def_data.c:300
msgid "Reset the environment to a default set of variables"
msgstr "Враћа окружење на оÑновни Ñкуп променљивих"
-#: plugins/sudoers/def_data.c:298
+#: plugins/sudoers/def_data.c:304
msgid "Environment variables to check for safety:"
msgstr "Променљиве окружења за проверу иÑправноÑти:"
-#: plugins/sudoers/def_data.c:302
+#: plugins/sudoers/def_data.c:308
msgid "Environment variables to remove:"
msgstr "Променљиве окружења за уклањање:"
-#: plugins/sudoers/def_data.c:306
+#: plugins/sudoers/def_data.c:312
msgid "Environment variables to preserve:"
msgstr "Променљиве окружења за очување:"
-#: plugins/sudoers/def_data.c:310
+#: plugins/sudoers/def_data.c:316
#, c-format
msgid "SELinux role to use in the new security context: %s"
msgstr "Ð¡Ð•Ð›Ð¸Ð½ÑƒÐºÑ ÑƒÐ»Ð¾Ð³Ð° за употребу у новом контекÑту безбедноÑти: %s"
-#: plugins/sudoers/def_data.c:314
+#: plugins/sudoers/def_data.c:320
#, c-format
msgid "SELinux type to use in the new security context: %s"
msgstr "Ð¡Ð•Ð›Ð¸Ð½ÑƒÐºÑ Ð²Ñ€Ñта за употребу у новом контекÑту безбедноÑти: %s"
-#: plugins/sudoers/def_data.c:318
+#: plugins/sudoers/def_data.c:324
#, c-format
msgid "Path to the sudo-specific environment file: %s"
msgstr "Путања до Ñудо-поÑебне датотеке окружења: %s"
-#: plugins/sudoers/def_data.c:322
+#: plugins/sudoers/def_data.c:328
#, c-format
msgid "Path to the restricted sudo-specific environment file: %s"
msgstr "Путања до ограничене Ñудо-поÑебне датотеке окружења: %s"
-#: plugins/sudoers/def_data.c:326
+#: plugins/sudoers/def_data.c:332
#, c-format
msgid "Locale to use while parsing sudoers: %s"
msgstr "Језк за коришћење при обради ÑудоерÑа: %s"
-#: plugins/sudoers/def_data.c:330
+#: plugins/sudoers/def_data.c:336
msgid "Allow sudo to prompt for a password even if it would be visible"
msgstr "Дозвољава да Ñудо тражи лозинку чак и ако би била видљива"
-#: plugins/sudoers/def_data.c:334
+#: plugins/sudoers/def_data.c:340
msgid "Provide visual feedback at the password prompt when there is user input"
msgstr "Обезбеђује видну повратну поруку при тражењу лозинке када поÑтоји ÑƒÐ½Ð¾Ñ ÐºÐ¾Ñ€Ð¸Ñника"
-#: plugins/sudoers/def_data.c:338
+#: plugins/sudoers/def_data.c:344
msgid "Use faster globbing that is less accurate but does not access the filesystem"
msgstr "КориÑти брже упоређивање које је мање тачно али не приÑтупа ÑиÑтему датотека"
-#: plugins/sudoers/def_data.c:342
+#: plugins/sudoers/def_data.c:348
msgid "The umask specified in sudoers will override the user's, even if it is more permissive"
msgstr "УмаÑка наведена у ÑудоерÑима ће препиÑати кориÑникову, чак и ако има већа овлашћења"
-#: plugins/sudoers/def_data.c:346
+#: plugins/sudoers/def_data.c:352
msgid "Log user's input for the command being run"
msgstr "Бележи кориÑников улаз за покренуту наредбу"
-#: plugins/sudoers/def_data.c:350
+#: plugins/sudoers/def_data.c:356
msgid "Log the output of the command being run"
msgstr "Бележи излаз покренуте наредбе"
-#: plugins/sudoers/def_data.c:354
+#: plugins/sudoers/def_data.c:360
msgid "Compress I/O logs using zlib"
msgstr "Пакује У/И дневнике кориÑтећи злиб"
-#: plugins/sudoers/def_data.c:358
+#: plugins/sudoers/def_data.c:364
msgid "Always run commands in a pseudo-tty"
msgstr "Увек покреће наредбе у привидној конзоли"
-#: plugins/sudoers/def_data.c:362
+#: plugins/sudoers/def_data.c:368
#, c-format
msgid "Plugin for non-Unix group support: %s"
msgstr "Прикључак за подршку не-ÐˆÑƒÐ½Ð¸ÐºÑ Ð³Ñ€ÑƒÐ¿Ðµ: %s"
-#: plugins/sudoers/def_data.c:366
+#: plugins/sudoers/def_data.c:372
#, c-format
msgid "Directory in which to store input/output logs: %s"
msgstr "Директоријум за Ñмештај улазних/излазних дневника: %s"
-#: plugins/sudoers/def_data.c:370
+#: plugins/sudoers/def_data.c:376
#, c-format
msgid "File in which to store the input/output log: %s"
msgstr "Датотека за Ñмештај улазно/излазног дневника: %s"
-#: plugins/sudoers/def_data.c:374
+#: plugins/sudoers/def_data.c:380
msgid "Add an entry to the utmp/utmpx file when allocating a pty"
msgstr "Додаје ÑƒÐ½Ð¾Ñ Ñƒ датотеку „utmp/utmpx“ када додељује „pty“"
-#: plugins/sudoers/def_data.c:378
+#: plugins/sudoers/def_data.c:384
msgid "Set the user in utmp to the runas user, not the invoking user"
msgstr "Подешава кориÑника у „utmp“-у на кориÑника покрени-као, не призивајући кориÑника"
-#: plugins/sudoers/def_data.c:382
+#: plugins/sudoers/def_data.c:388
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "Скуп допуштених повлаÑтица: %s"
-#: plugins/sudoers/def_data.c:386
+#: plugins/sudoers/def_data.c:392
#, c-format
msgid "Set of limit privileges: %s"
msgstr "Скуп повлаÑтица ограничења: %s"
-#: plugins/sudoers/def_data.c:390
+#: plugins/sudoers/def_data.c:396
msgid "Run commands on a pty in the background"
msgstr "Покреће наредбе у позадини на назовитерминалу"
-#: plugins/sudoers/def_data.c:394
+#: plugins/sudoers/def_data.c:400
#, c-format
msgid "PAM service name to use: %s"
msgstr "Ðазив ПÐÐœ уÑлуге за коришћење: %s"
-#: plugins/sudoers/def_data.c:398
+#: plugins/sudoers/def_data.c:404
#, c-format
msgid "PAM service name to use for login shells: %s"
msgstr "Ðазив ПÐÐœ уÑлуге за шкољке пријављивања: %s"
-#: plugins/sudoers/def_data.c:402
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "Ðазив ПÐÐœ уÑлуге за коришћење када Ñудо ради Ñа опцијом „-A“: %s"
-#: plugins/sudoers/def_data.c:406
+#: plugins/sudoers/def_data.c:412
msgid "Attempt to establish PAM credentials for the target user"
msgstr "Покушава да уÑпоÑтави ПÐÐœ пуномоћÑтва за циљног кориÑника"
-#: plugins/sudoers/def_data.c:410
+#: plugins/sudoers/def_data.c:416
msgid "Create a new PAM session for the command to run in"
msgstr "Прави нову ПÐÐœ ÑеÑију за покретање наредбе"
-#: plugins/sudoers/def_data.c:414
+#: plugins/sudoers/def_data.c:420
msgid "Perform PAM account validation management"
msgstr "Обавља управљање провером ПÐÐœ налога"
-#: plugins/sudoers/def_data.c:418
+#: plugins/sudoers/def_data.c:424
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "Ðајвећи број низа У/И дневника: %s"
-#: plugins/sudoers/def_data.c:422
+#: plugins/sudoers/def_data.c:428
msgid "Enable sudoers netgroup support"
msgstr "Укључује подршку нетгрупе ÑудоерÑа"
-#: plugins/sudoers/def_data.c:426
+#: plugins/sudoers/def_data.c:432
msgid "Check parent directories for writability when editing files with sudoedit"
msgstr "Проверава родитељÑки директоријум за упиÑивошћу када уређује датотеке Ñа „sudoedit“"
-#: plugins/sudoers/def_data.c:430
+#: plugins/sudoers/def_data.c:436
msgid "Follow symbolic links when editing files with sudoedit"
msgstr "Прати Ñимболичке везе када уређује датотеке Ñа „sudoedit“"
-#: plugins/sudoers/def_data.c:434
+#: plugins/sudoers/def_data.c:440
msgid "Query the group plugin for unknown system groups"
msgstr "Пропитује прикључак групе за непознатим групама ÑиÑтема"
-#: plugins/sudoers/def_data.c:438
+#: plugins/sudoers/def_data.c:444
msgid "Match netgroups based on the entire tuple: user, host and domain"
msgstr "Упоређује мрежне групе на оÑнову читавог Ñлога: кориÑник, домаћин и домен"
-#: plugins/sudoers/def_data.c:442
+#: plugins/sudoers/def_data.c:448
msgid "Allow commands to be run even if sudo cannot write to the audit log"
msgstr "Допушта покретање наредби чак и ако Ñудо не може да пише у дневник прегледа"
-#: plugins/sudoers/def_data.c:446
+#: plugins/sudoers/def_data.c:452
msgid "Allow commands to be run even if sudo cannot write to the I/O log"
msgstr "Допушта покретање наредби чак и ако Ñудо не може да пише у дневник У/И"
-#: plugins/sudoers/def_data.c:450
+#: plugins/sudoers/def_data.c:456
msgid "Allow commands to be run even if sudo cannot write to the log file"
msgstr "Допушта покретање наредби чак и ако Ñудо не може да пише у датотеку дневника"
-#: plugins/sudoers/def_data.c:454
+#: plugins/sudoers/def_data.c:460
msgid "Resolve groups in sudoers and match on the group ID, not the name"
msgstr "Решава групе у ÑудоерÑима и упоређује ИД групе, а не назив"
-#: plugins/sudoers/def_data.c:458
+#: plugins/sudoers/def_data.c:464
#, c-format
msgid "Log entries larger than this value will be split into multiple syslog messages: %u"
msgstr "УноÑи дневника већи од ове вредноÑти биће подељени на више порука ÑиÑтемÑког дневника: %u"
-#: plugins/sudoers/def_data.c:462
+#: plugins/sudoers/def_data.c:468
#, c-format
msgid "User that will own the I/O log files: %s"
msgstr "КориÑник који ће поÑедовати датотеке дневника У/И: %s"
-#: plugins/sudoers/def_data.c:466
+#: plugins/sudoers/def_data.c:472
#, c-format
msgid "Group that will own the I/O log files: %s"
msgstr "Група која ће поÑедовати датотеке дневника У/И: %s"
-#: plugins/sudoers/def_data.c:470
+#: plugins/sudoers/def_data.c:476
#, c-format
msgid "File mode to use for the I/O log files: 0%o"
msgstr "Режим датотеке за коришћење за датотеке дневника У/И: 0%o"
-#: plugins/sudoers/def_data.c:474
+#: plugins/sudoers/def_data.c:480
#, c-format
msgid "Execute commands by file descriptor instead of by path: %s"
msgstr "Извршава наредбе опиÑником датотеке умеÑто путањом: %s"
-#: plugins/sudoers/def_data.c:478
+#: plugins/sudoers/def_data.c:484
msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
msgstr "Занемарује непознате уноÑе оÑновноÑти у ÑудоерÑу умеÑто да даје упозорење"
-#: plugins/sudoers/def_data.c:482
+#: plugins/sudoers/def_data.c:488
#, c-format
msgid "Time in seconds after which the command will be terminated: %u"
msgstr "Време у Ñекундама након ког ће наредба бити окончана: %u"
-#: plugins/sudoers/def_data.c:486
+#: plugins/sudoers/def_data.c:492
msgid "Allow the user to specify a timeout on the command line"
msgstr "Допушта кориÑнику да наведе време на линији наредби"
-#: plugins/sudoers/def_data.c:490
+#: plugins/sudoers/def_data.c:496
msgid "Flush I/O log data to disk immediately instead of buffering it"
msgstr "Пребацује У/И податке дневника на диÑк одмах умеÑто да га Ñмешта у међумеморију"
-#: plugins/sudoers/def_data.c:494
+#: plugins/sudoers/def_data.c:500
msgid "Include the process ID when logging via syslog"
msgstr "Укључује ИБ процеÑа приликом пријављивања путем дневника ÑиÑтема"
-#: plugins/sudoers/def_data.c:498
+#: plugins/sudoers/def_data.c:504
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "Ð’Ñ€Ñта временÑке ознаке потврђивања идентитета: %s"
-#: plugins/sudoers/def_data.c:502
+#: plugins/sudoers/def_data.c:508
#, c-format
msgid "Authentication failure message: %s"
msgstr "Потврђивање идентитета није уÑпело: %s"
-#: plugins/sudoers/def_data.c:506
+#: plugins/sudoers/def_data.c:512
msgid "Ignore case when matching user names"
msgstr "Занемарује величину Ñлова приликом поклапања назива кориÑника"
-#: plugins/sudoers/def_data.c:510
+#: plugins/sudoers/def_data.c:516
msgid "Ignore case when matching group names"
msgstr "Занемарује величину Ñлова приликом поклапања назива групе"
-#: plugins/sudoers/def_data.c:514
+#: plugins/sudoers/def_data.c:520
msgid "Log when a command is allowed by sudoers"
msgstr "Пише дневник када ÑудоерÑи дозвољавају наредбу"
-#: plugins/sudoers/def_data.c:518
+#: plugins/sudoers/def_data.c:524
msgid "Log when a command is denied by sudoers"
msgstr "Пише дневник када ÑудоерÑи не дозвољавају наредбу"
-#: plugins/sudoers/def_data.c:522
+#: plugins/sudoers/def_data.c:528
msgid "Sudo log server(s) to connect to with optional port"
msgstr "Судо Ñервер(и) дневника за повезивање Ñа изборним прикључником"
-#: plugins/sudoers/def_data.c:526
+#: plugins/sudoers/def_data.c:532
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Време иÑтека Ñудо Ñервера дневника у Ñекундама: %u"
-#: plugins/sudoers/def_data.c:530
+#: plugins/sudoers/def_data.c:536
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "Укључује „SO_KEEPALIVE“ опцију прикључнице Ñа повезаном прикључницом Ñа Ñервером дневника"
-#: plugins/sudoers/def_data.c:534
+#: plugins/sudoers/def_data.c:540
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "Путања до датотеке групних издавача уверења Ñервера иÑпитивања: %s"
-#: plugins/sudoers/def_data.c:538
+#: plugins/sudoers/def_data.c:544
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "Путања до датотеке уверења ÑудоерÑа: %s"
-#: plugins/sudoers/def_data.c:542
+#: plugins/sudoers/def_data.c:548
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "Путања до датотеке датотеке личног кључа ÑудоерÑа: %s"
-#: plugins/sudoers/def_data.c:546
+#: plugins/sudoers/def_data.c:552
msgid "Verify that the log server's certificate is valid"
msgstr "Потврђује да је иÑправно уверење дневника Ñервера"
-#: plugins/sudoers/def_data.c:550
+#: plugins/sudoers/def_data.c:556
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "Допушта коришћење непознатог „runas“ кориÑника и/или ИБ-а групе"
-#: plugins/sudoers/def_data.c:554
+#: plugins/sudoers/def_data.c:560
msgid "Only permit running commands as a user with a valid shell"
msgstr "Допушта покретање наредби као кориÑник Ñамо Ñа иÑправном шкољком"
-#: plugins/sudoers/def_data.c:558
+#: plugins/sudoers/def_data.c:564
msgid "Set the pam remote user to the user running sudo"
msgstr "ПоÑтавља пам удаљеног кориÑника на кориÑника покретача Ñудо-а"
-#: plugins/sudoers/def_data.c:562
+#: plugins/sudoers/def_data.c:568
msgid "Set the pam remote host to the local host name"
msgstr "ПоÑтавља пам удаљеног домаћина на назив локалног домаћина"
-#: plugins/sudoers/def_data.c:566
+#: plugins/sudoers/def_data.c:572
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "Радни директоријум за прелазак пре извршавања наредбе: %s"
-#: plugins/sudoers/def_data.c:570
+#: plugins/sudoers/def_data.c:576
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "Корени директоријум за прелазак пре извршавања наредбе: %s"
-#: plugins/sudoers/def_data.c:574
+#: plugins/sudoers/def_data.c:580
#, c-format
msgid "The format of logs to produce: %s"
msgstr "Формат резултирајућих дневника: %s"
-#: plugins/sudoers/def_data.c:578
+#: plugins/sudoers/def_data.c:584
msgid "Enable SELinux RBAC support"
msgstr "Укључује Ð¡Ð•Ð›Ð¸Ð½ÑƒÐºÑ Ð Ð‘ÐЦ подршку"
-#: plugins/sudoers/def_data.c:582
+#: plugins/sudoers/def_data.c:588
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "Путања до датотеке која је Ñтворена приликом првог покретања Ñудоа: %s"
-#: plugins/sudoers/def_data.c:586
+#: plugins/sudoers/def_data.c:592
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "ПреÑреће будуће наредбе и примењује „sudoers“ ограничења на њима"
-#: plugins/sudoers/def_data.c:590
+#: plugins/sudoers/def_data.c:596
msgid "Log sub-commands run by the original command"
msgstr "Бележи поднаредбе које покрене изворна наредба"
-#: plugins/sudoers/def_data.c:594
+#: plugins/sudoers/def_data.c:600
msgid "Log the exit status of commands"
msgstr "Бележи Ñтање излаза наредбе"
-#: plugins/sudoers/def_data.c:598
+#: plugins/sudoers/def_data.c:604
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "Ðаредне наредбе у преÑретнутој ÑеÑији морају бити аутентификоване"
-#: plugins/sudoers/def_data.c:602
+#: plugins/sudoers/def_data.c:608
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "Омогућава преÑретнутој наредби да покрене поÑтавку „setuid“ или „setgid“ програма"
-#: plugins/sudoers/def_data.c:606
+#: plugins/sudoers/def_data.c:612
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "Ðајвећа величина до које може да нараÑте адреÑни проÑтор процеÑа (у бајтовима): %s"
-#: plugins/sudoers/def_data.c:610
+#: plugins/sudoers/def_data.c:616
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "Ðајвећа величина избачаја датотеке језгра која Ñе може направити (у бајтовима): %s"
-#: plugins/sudoers/def_data.c:614
+#: plugins/sudoers/def_data.c:620
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "Ðајвећа количина времена процеÑора које Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¼Ð¾Ð¶Ðµ да кориÑти (у Ñекундама): %s"
-#: plugins/sudoers/def_data.c:618
+#: plugins/sudoers/def_data.c:624
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "Ðајвећа величина Ñегмента података за Ð¿Ñ€Ð¾Ñ†ÐµÑ (у бајтовима): %s"
-#: plugins/sudoers/def_data.c:622
+#: plugins/sudoers/def_data.c:628
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "Ðајвећа величина датотеке коју Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¼Ð¾Ð¶Ðµ да направи (у бајтовима): %s"
-#: plugins/sudoers/def_data.c:626
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "Ðајвећи број закључавања која Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¼Ð¾Ð¶Ðµ да уÑпоÑтави: %s"
-#: plugins/sudoers/def_data.c:630
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "Ðајвећа величина коју Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¼Ð¾Ð¶Ðµ да закључа у меморији (у бајтовима): %s"
-#: plugins/sudoers/def_data.c:634
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "Ðајвећи број датотека које Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¼Ð¾Ð¶Ðµ да отвори: %s"
-#: plugins/sudoers/def_data.c:638
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "Ðајвећи број процеÑа које кориÑник може да покрене иÑтовремено: %s"
-#: plugins/sudoers/def_data.c:642
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "Ðајвећа величина до које може да нараÑте резидентна величина Ñкупа процеÑа (у бајтовима): %s"
-#: plugins/sudoers/def_data.c:646
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "Ðајвећа величина до које може да нараÑте Ñпремник процеÑа (у бајтовима): %s"
-#: plugins/sudoers/def_data.c:650
+#: plugins/sudoers/def_data.c:656
msgid "Attempt authentication even when in non-interactive mode"
msgstr "Покушава потврђивање идентитета чак и када није у не-међудејÑтвеном режиму"
-#: plugins/sudoers/def_data.c:654
+#: plugins/sudoers/def_data.c:660
msgid "Store plaintext passwords in I/O log input"
msgstr "Смешта обично-текÑтуалне лозинке у У/И улаз дневника"
-#: plugins/sudoers/def_data.c:658
+#: plugins/sudoers/def_data.c:664
msgid "List of regular expressions to use when matching a password prompt"
msgstr "СпиÑак регуларних израза за коришћење приликом поређења упита лозинке"
-#: plugins/sudoers/defaults.c:193
-#, c-format
-msgid "%s: unknown defaults entry \"%s\""
-msgstr "%s: непознат ÑƒÐ½Ð¾Ñ Ð¾ÑновноÑти „%s“"
-
-#: plugins/sudoers/defaults.c:242
-#, c-format
-msgid "%s:%d:%d: no value specified for \"%s\""
-msgstr "%s:%d:%d: није наведена вредноÑÑ‚ за „%s“"
-
-#: plugins/sudoers/defaults.c:245
-#, c-format
-msgid "%s: no value specified for \"%s\""
-msgstr "%s: није наведена вредноÑÑ‚ за „%s“"
-
-#: plugins/sudoers/defaults.c:258
-#, c-format
-msgid "%s:%d:%d: invalid operator \"%c=\" for \"%s\""
-msgstr "%s:%d:%d: неиÑправан оператор „%c=“ за „%s“"
-
-#: plugins/sudoers/defaults.c:261
-#, c-format
-msgid "%s: invalid operator \"%c=\" for \"%s\""
-msgstr "%s: неиÑправан оператор „%c=“ за „%s“"
-
-#: plugins/sudoers/defaults.c:297
+#: plugins/sudoers/def_data.c:668
#, c-format
-msgid "%s:%d:%d: option \"%s\" does not take a value"
-msgstr "%s:%d:%d: опција „%s“ не узима вредноÑÑ‚"
+msgid "The mechanism used by the intercept and log_subcmds options: %s"
+msgstr "Механизам који кориÑте опције „intercept“ и „log_subcmds“: %s"
-#: plugins/sudoers/defaults.c:300
+#: plugins/sudoers/def_data.c:672
#, c-format
-msgid "%s: option \"%s\" does not take a value"
-msgstr "%s: опција „%s“ не узима вредноÑÑ‚"
+msgid "AppArmor profile to use in the new security context: %s"
+msgstr "ÐпÐрмор профил за коришћење у новом контекÑту безбедноÑти: %s"
-#: plugins/sudoers/defaults.c:328
+#: plugins/sudoers/defaults.c:191
#, c-format
-msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s:%d:%d: неиÑправна врÑта оÑновноÑти 0x%x за опцију „%s“"
+msgid "unknown defaults entry \"%s\""
+msgstr "непознат ÑƒÐ½Ð¾Ñ Ð¾ÑновноÑти „%s“"
-#: plugins/sudoers/defaults.c:331
+#: plugins/sudoers/defaults.c:234
#, c-format
-msgid "%s: invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s: неиÑправна врÑта оÑновноÑти 0x%x за опцију „%s“"
+msgid "no value specified for \"%s\""
+msgstr "није наведена вредноÑÑ‚ за „%s“"
-#: plugins/sudoers/defaults.c:341
+#: plugins/sudoers/defaults.c:243
#, c-format
-msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
-msgstr "%s:%d:%d: вредноÑÑ‚ „%s“ је неиÑправна за опцију „%s“"
+msgid "invalid operator \"%c=\" for \"%s\""
+msgstr "неиÑправан оператор „%c=“ за „%s“"
-#: plugins/sudoers/defaults.c:344
+#: plugins/sudoers/defaults.c:275
#, c-format
-msgid "%s: value \"%s\" is invalid for option \"%s\""
-msgstr "%s: вредноÑÑ‚ „%s“ је неиÑправна за опцију „%s“"
+msgid "option \"%s\" does not take a value"
+msgstr "опција „%s“ не узима вредноÑÑ‚"
-#: plugins/sudoers/defaults.c:1161
+#: plugins/sudoers/defaults.c:299
#, c-format
-msgid "%s:%d:%d: path name for \"%s\" too long"
-msgstr "%s:%d:%d: назив путање за „%s“ је предуг"
+msgid "invalid Defaults type 0x%x for option \"%s\""
+msgstr "неиÑправна врÑта оÑновноÑти 0x%x за опцију „%s“"
-#: plugins/sudoers/defaults.c:1164
+#: plugins/sudoers/defaults.c:306
#, c-format
-msgid "%s: path name for \"%s\" too long"
-msgstr "%s: назив путање за „%s“ је предуг"
+msgid "value \"%s\" is invalid for option \"%s\""
+msgstr "вредноÑÑ‚ „%s“ је неиÑправна за опцију „%s“"
-#: plugins/sudoers/defaults.c:1175
+#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
+#: plugins/sudoers/policy.c:216
#, c-format
-msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
-msgstr "%s:%d:%d: вредноÑÑ‚ за „%s“ мора да почиње Ñа /, ~ или *"
-
-#: plugins/sudoers/defaults.c:1179
-#, c-format
-msgid "%s: values for \"%s\" must start with a '/', '~', or '*'"
-msgstr "%s: вредноÑÑ‚ за „%s“ мора да почиње Ñа /, ~ или *"
+msgid "path name for \"%s\" too long"
+msgstr "назив путање за „%s“ је предуг"
-#: plugins/sudoers/defaults.c:1190
+#: plugins/sudoers/defaults.c:1133
#, c-format
-msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
-msgstr "%s:%d:%d: вредноÑÑ‚ за „%s“ мора да почиње Ñа /"
+msgid "values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "вредноÑÑ‚ за „%s“ мора да почиње Ñа /, ~ или *"
-#: plugins/sudoers/defaults.c:1194
+#: plugins/sudoers/defaults.c:1140
#, c-format
-msgid "%s: values for \"%s\" must start with a '/'"
-msgstr "%s: вредноÑÑ‚ за „%s“ мора да почиње /"
+msgid "values for \"%s\" must start with a '/'"
+msgstr "вредноÑÑ‚ за „%s“ мора да почне /"
#: plugins/sudoers/env.c:412
msgid "sudo_putenv: corrupted envp, length mismatch"
@@ -2613,16 +2581,6 @@ msgstr "не могу поново да изградим окружење"
msgid "sorry, you are not allowed to set the following environment variables: %s"
msgstr "извините, није вам дозвољено да подеÑите Ñледеће променљиве окружења: %s"
-#: plugins/sudoers/file.c:108
-#, c-format
-msgid "parse error in %s near line %d"
-msgstr "грешка обраде у %s близу реда %d"
-
-#: plugins/sudoers/file.c:111
-#, c-format
-msgid "parse error in %s"
-msgstr "грешка обраде у %s"
-
#: plugins/sudoers/filedigest.c:49
#, c-format
msgid "unsupported digest type %d for %s"
@@ -2672,37 +2630,37 @@ msgstr "не могу да обрадим мрежну маÑку „%s“"
msgid "Local IP address and netmask pairs:\n"
msgstr "МеÑна ИП адреÑа и парови мрежне маÑке:\n"
-#: plugins/sudoers/iolog.c:681
+#: plugins/sudoers/iolog.c:685
msgid "unable to update sequence file"
msgstr "не могу да оÑвежим датотеку низа"
-#: plugins/sudoers/iolog.c:715 plugins/sudoers/iolog.c:903
-#: plugins/sudoers/iolog.c:1065 plugins/sudoers/iolog.c:1072
-#: plugins/sudoers/iolog.c:1193 plugins/sudoers/iolog.c:1200
-#: plugins/sudoers/iolog.c:1299 plugins/sudoers/iolog.c:1306
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
+#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
+#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
+#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "не могу да пишем у датотеку дневника У/И: %s"
-#: plugins/sudoers/iolog.c:723
+#: plugins/sudoers/iolog.c:727
#, c-format
msgid "unable to create %s/%s"
msgstr "не могу да направим „%s/%s“"
-#: plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:955
#, c-format
msgid "%s: internal error, I/O log file for event %d not open"
msgstr "%s: унутрашња грешка, датотека У/И дневника за догађај %d није отворена"
-#: plugins/sudoers/iolog.c:1050 plugins/sudoers/iolog.c:1178
-#: plugins/sudoers/iolog.c:1283 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:510
-#: plugins/sudoers/visudo.c:516
+#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1182
+#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
+#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
+#: plugins/sudoers/visudo.c:552
msgid "unable to read the clock"
msgstr "не могу да прочитам Ñат"
-#: plugins/sudoers/iolog.c:1275 plugins/sudoers/log_client.c:1221
-#: plugins/sudoers/log_client.c:1231 plugins/sudoers/log_client.c:1235
+#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
+#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: унутрашња грешка, неиÑправан Ñигнал %d"
@@ -2721,16 +2679,16 @@ msgstr "не могу да покренем ССЛ уверење и бп кљу
msgid "you must set TLS_CERT in %s to use SSL"
msgstr "морате да подеÑите „TLS_CERT“ у „%s“ да кориÑтите ССЛ"
-#: plugins/sudoers/ldap.c:1717
+#: plugins/sudoers/ldap.c:1712
#, c-format
msgid "unable to initialize LDAP: %s"
msgstr "не могу да покренем ЛДÐП: %s"
-#: plugins/sudoers/ldap.c:1754
+#: plugins/sudoers/ldap.c:1749
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:1891 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:747
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "неиÑправна оÑобина „sudoOrder“: %s"
@@ -2770,8 +2728,8 @@ msgstr "не могу да отворим ÑиÑтем прегледа"
msgid "unable to send audit message"
msgstr "не могу да пошаљем поруку прегледа"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:400
-#: plugins/sudoers/log_client.c:1468 plugins/sudoers/log_client.c:2069
+#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
+#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
msgid "error in event loop"
msgstr "грешка у петљи догађаја"
@@ -2780,101 +2738,101 @@ msgstr "грешка у петљи догађаја"
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "Стварање новог „SSL_CTX“ објекта није уÑпело: %s"
-#: plugins/sudoers/log_client.c:223
+#: plugins/sudoers/log_client.c:225
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "не могу да учитам комплет ауторитета уверења „%s“"
-#: plugins/sudoers/log_client.c:243
+#: plugins/sudoers/log_client.c:247
#, c-format
msgid "unable to load certificate %s"
msgstr "не могу да учитам уверење „%s“"
-#: plugins/sudoers/log_client.c:256
+#: plugins/sudoers/log_client.c:261
#, c-format
msgid "unable to load private key %s"
msgstr "не могу да учитам лични кључ „%s“"
-#: plugins/sudoers/log_client.c:265
+#: plugins/sudoers/log_client.c:270
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "Ðе могу да доделим ÑÑл објекат: %s"
-#: plugins/sudoers/log_client.c:353 plugins/sudoers/log_client.c:358
+#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "ТЛС повезивање Ñа „%s:%s“ није уÑпело: %s"
-#: plugins/sudoers/log_client.c:531
+#: plugins/sudoers/log_client.c:538
msgid "TLS initialization was unsuccessful"
msgstr "ТЛС покретање беше безуÑпешно"
-#: plugins/sudoers/log_client.c:541
+#: plugins/sudoers/log_client.c:548
msgid "TLS handshake was unsuccessful"
msgstr "ТЛС руковање беше безуÑпешно"
-#: plugins/sudoers/log_client.c:1239
+#: plugins/sudoers/log_client.c:1246
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: унутрашња грешка, неиÑправно излазно Ñтање %d"
-#: plugins/sudoers/log_client.c:1608
-msgid "unable to unpack ServerMessage"
-msgstr "не могу да отпакујем „Поруку_Ñервера“"
-
-#: plugins/sudoers/log_client.c:1763 plugins/sudoers/log_client.c:1787
+#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
msgid "lost connection to log server"
msgstr "изгубих везу Ñа Ñервером дневника"
-#: plugins/sudoers/log_client.c:1864
+#: plugins/sudoers/log_client.c:1876
msgid "missing write buffer"
msgstr "недоÑтаје међумеморија пиÑања"
-#: plugins/sudoers/log_client.c:2010
+#: plugins/sudoers/log_client.c:2024
msgid "unable to connect to log server"
msgstr "не могу да Ñе повежем на Ñервер дневника"
-#: plugins/sudoers/logging.c:288
+#: plugins/sudoers/logging.c:298
msgid "user NOT in sudoers"
msgstr "кориÑник ÐИЈЕ у ÑудоерÑу"
-#: plugins/sudoers/logging.c:290
+#: plugins/sudoers/logging.c:300
msgid "user NOT authorized on host"
msgstr "кориÑник ÐИЈЕ овлашћен на домаћину"
-#: plugins/sudoers/logging.c:292
+#: plugins/sudoers/logging.c:302
msgid "command not allowed"
msgstr "наредба није допуштена"
-#: plugins/sudoers/logging.c:313
+#: plugins/sudoers/logging.c:323
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr "„%s“ није у датотеци ÑудоерÑа.\n"
-#: plugins/sudoers/logging.c:316
+#: plugins/sudoers/logging.c:326
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "КориÑнику „%s“ није допуштено да покрене Ñудо на „%s“.\n"
-#: plugins/sudoers/logging.c:319
+#: plugins/sudoers/logging.c:329
#, c-format
msgid "Sorry, user %s may not run sudo on %s.\n"
msgstr "Извините, кориÑник %s не може покренути Ñудо на %s.\n"
-#: plugins/sudoers/logging.c:322
+#: plugins/sudoers/logging.c:332
#, 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:359 plugins/sudoers/sudoers.c:629
-#: plugins/sudoers/sudoers.c:631 plugins/sudoers/sudoers.c:633
-#: plugins/sudoers/sudoers.c:635 plugins/sudoers/sudoers.c:785
-#: plugins/sudoers/sudoers.c:787
+#: plugins/sudoers/logging.c:342
+msgid "This incident has been reported to the administrator.\n"
+msgstr "Овај инцидент је пријављен админиÑтратору.\n"
+
+#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
+#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
+#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
+#: plugins/sudoers/sudoers.c:801
#, c-format
msgid "%s: command not found"
msgstr "%s: нема такве наредбе"
-#: plugins/sudoers/logging.c:361 plugins/sudoers/sudoers.c:625
+#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2883,7 +2841,7 @@ msgstr ""
"занемарујем „%s“ пронађено у „.“\n"
"КориÑтите „sudo ./%s“ ако је то „%s“ које желите да покренете."
-#: plugins/sudoers/logging.c:380
+#: plugins/sudoers/logging.c:395
#, c-format
msgid "%u incorrect password attempt"
msgid_plural "%u incorrect password attempts"
@@ -2891,33 +2849,39 @@ msgstr[0] "%u покушај нетачне лозинке"
msgstr[1] "%u покушаја нетачне лозинке"
msgstr[2] "%u покушаја нетачне лозинке"
-#: plugins/sudoers/logging.c:436
+#: plugins/sudoers/logging.c:485
msgid "authentication failure"
msgstr "потврђивање идентитета није уÑпело"
-#: plugins/sudoers/logging.c:476 plugins/sudoers/logging.c:496
+#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
msgid "a password is required"
msgstr "потребна је лозинка"
-#: plugins/sudoers/logging.c:890
+#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+msgid "problem parsing sudoers"
+msgstr "проблем обраде ÑудоерÑа"
+
+#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#, c-format
+msgid "%s:%d:%d: %s"
+msgstr "%s:%d:%d: %s"
+
+#: plugins/sudoers/logging.c:1068
#, c-format
msgid "unable to write log file: %s"
msgstr "не могу да запишем датотеку дневника: %s"
-#: plugins/sudoers/match_digest.c:129
+#: plugins/sudoers/match_digest.c:112
+#, c-format
+msgid "digest for %s (%s) bad length %zu, expected %zu"
+msgstr "приказ за „%s“ (%s) је лоше дужине %zu, очекивах %zu"
+
+#: plugins/sudoers/match_digest.c:131
#, c-format
msgid "digest for %s (%s) is not in %s form"
msgstr "приказ за %s (%s) није у %s облику"
-#: plugins/sudoers/parse.c:233
-msgid "SELinux RBAC is not supported when intercept mode is enabled"
-msgstr "„SELinux RBAC“ није подржано када је укључен режим преÑретања"
-
-#: plugins/sudoers/parse.c:238
-msgid "SELinux RBAC is not supported when the log_subcmds flag is enabled"
-msgstr "„SELinux RBAC“ није подржано када је укључена заÑтавица „log_subcmds“"
-
-#: plugins/sudoers/parse.c:549
+#: plugins/sudoers/parse.c:585
#, c-format
msgid ""
"\n"
@@ -2926,7 +2890,7 @@ msgstr ""
"\n"
"ЛДÐП улога: %s\n"
-#: plugins/sudoers/parse.c:552
+#: plugins/sudoers/parse.c:588
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2934,38 +2898,38 @@ msgstr ""
"\n"
"Ð£Ð½Ð¾Ñ ÑудоерÑа:\n"
-#: plugins/sudoers/parse.c:554
+#: plugins/sudoers/parse.c:590
msgid " RunAsUsers: "
msgstr " „Покрени-као“ кориÑници: "
-#: plugins/sudoers/parse.c:569
+#: plugins/sudoers/parse.c:605
msgid " RunAsGroups: "
msgstr " „Покрени-као“ групе: "
-#: plugins/sudoers/parse.c:579
+#: plugins/sudoers/parse.c:615
msgid " Options: "
msgstr " Опције: "
-#: plugins/sudoers/parse.c:643
+#: plugins/sudoers/parse.c:679
msgid " Commands:\n"
msgstr " Ðаредбе:\n"
-#: plugins/sudoers/parse.c:834
+#: plugins/sudoers/parse.c:870
#, c-format
msgid "Matching Defaults entries for %s on %s:\n"
msgstr "Упоређује уноÑе оÑновноÑти за „%s“ на %s:\n"
-#: plugins/sudoers/parse.c:852
+#: plugins/sudoers/parse.c:888
#, c-format
msgid "Runas and Command-specific defaults for %s:\n"
msgstr "Покрени-као и Ðаредбено-поÑебне оÑновноÑти за „%s“:\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:906
#, c-format
msgid "User %s may run the following commands on %s:\n"
msgstr "КориÑник „%s“ може да покреће Ñледеће наредбе на %s:\n"
-#: plugins/sudoers/parse.c:885
+#: plugins/sudoers/parse.c:921
#, c-format
msgid "User %s is not allowed to run sudo on %s.\n"
msgstr "КориÑник „%s“ нема права да покрене Ñудо над „%s“.\n"
@@ -2985,64 +2949,59 @@ msgstr "неиÑправна оÑобина „LDIF“: %s"
msgid "invalid %.*s set by sudo front-end"
msgstr "Ñудо челник је поÑтавио неиÑправну „%.*s“"
-#: plugins/sudoers/policy.c:206 plugins/sudoers/policy.c:215
-#, c-format
-msgid "path name for \"%s\" too long"
-msgstr "назив путање за „%s“ је предуг"
-
-#: plugins/sudoers/policy.c:328 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:351 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "не могу да обрадим ÑпиÑак адреÑа мреже"
-#: plugins/sudoers/policy.c:485
+#: plugins/sudoers/policy.c:508
msgid "user name not set by sudo front-end"
msgstr "Ñудо челник није поÑтавио име кориÑника"
-#: plugins/sudoers/policy.c:489
+#: plugins/sudoers/policy.c:512
msgid "user-ID not set by sudo front-end"
msgstr "Ñудо челник није поÑтавио ИБ кориÑника"
-#: plugins/sudoers/policy.c:493
+#: plugins/sudoers/policy.c:516
msgid "group-ID not set by sudo front-end"
msgstr "Ñудо челник није поÑтавио ИБ групе"
-#: plugins/sudoers/policy.c:497
+#: plugins/sudoers/policy.c:520
msgid "host name not set by sudo front-end"
msgstr "Ñудо челник није поÑтавио назив домаћина"
-#: plugins/sudoers/policy.c:670
+#: plugins/sudoers/policy.c:706
#, c-format
msgid "invalid working directory: %s"
msgstr "неиÑправан радни директоријум: %s"
-#: plugins/sudoers/policy.c:846
+#: plugins/sudoers/policy.c:886
#, c-format
msgid "invalid chroot directory: %s"
msgstr "неиÑправан „chroot“ директоријум: %s"
-#: plugins/sudoers/policy.c:1025 plugins/sudoers/visudo.c:243
-#: plugins/sudoers/visudo.c:880
+#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
+#: plugins/sudoers/visudo.c:896
#, c-format
msgid "unable to execute %s"
msgstr "не могу да извршим „%s“"
-#: plugins/sudoers/policy.c:1095 plugins/sudoers/policy.c:1132
-#: plugins/sudoers/policy.c:1154 plugins/sudoers/policy.c:1180
+#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
+#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: неиÑправне заÑтавице од Ñудо челника: 0×%x"
-#: plugins/sudoers/policy.c:1211
+#: plugins/sudoers/policy.c:1262
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "Издање %s прикључка политике ÑудоерÑа\n"
-#: plugins/sudoers/policy.c:1213
+#: plugins/sudoers/policy.c:1264
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "Граматика датотеке ÑудоерÑа издање %d\n"
-#: plugins/sudoers/policy.c:1217
+#: plugins/sudoers/policy.c:1268
#, c-format
msgid ""
"\n"
@@ -3051,27 +3010,27 @@ msgstr ""
"\n"
"Путања ÑудоерÑа: %s\n"
-#: plugins/sudoers/policy.c:1220
+#: plugins/sudoers/policy.c:1271
#, c-format
msgid "nsswitch path: %s\n"
msgstr "путања нÑ-прекидача: %s\n"
-#: plugins/sudoers/policy.c:1222
+#: plugins/sudoers/policy.c:1273
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "путања лдап.подешавања: %s\n"
-#: plugins/sudoers/policy.c:1223
+#: plugins/sudoers/policy.c:1274
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "путања лдап.тајне: %s\n"
-#: plugins/sudoers/policy.c:1256
+#: plugins/sudoers/policy.c:1307
#, c-format
msgid "unable to register hook of type %d (version %d.%d)"
msgstr "немогу да региÑтрујем прикачку врÑте „%d“ (издање %d.%d)"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1325
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "немогу да поништим региÑтровање прикачке врÑте „%d“ (издање %d.%d)"
@@ -3210,149 +3169,148 @@ msgstr "не могу да покренем ССС извор. Да ли је С
msgid "unable to find symbol \"%s\" in %s"
msgstr "не могу да нађем Ñимбол „%s“ у „%s“"
-#: plugins/sudoers/sudoers.c:166 plugins/sudoers/sudoers.c:174
-#: plugins/sudoers/sudoers.c:228 plugins/sudoers/sudoers.c:249
-#: plugins/sudoers/sudoers.c:1049
-msgid "problem with defaults entries"
-msgstr "неприлике Ñа оÑновним уноÑима"
+#: plugins/sudoers/sudoers.c:258
+#, c-format
+msgid "unable to get defaults from %s"
+msgstr "не могу да добавим оÑновноÑти за „%s“"
-#: plugins/sudoers/sudoers.c:253
+#: plugins/sudoers/sudoers.c:265
msgid "no valid sudoers sources found, quitting"
msgstr "ниÑам пронашао иÑправне изворе ÑудоерÑа, прекидам"
-#: plugins/sudoers/sudoers.c:327
+#: plugins/sudoers/sudoers.c:341
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "кориÑнику није дозвољено да промени корени директоријум у „%s“"
-#: plugins/sudoers/sudoers.c:329
+#: plugins/sudoers/sudoers.c:343
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "није вам допуштено да кориÑтите опцију „-R“ Ñа „%s“"
-#: plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:368
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "кориÑнику није дозвољено да промени директоријум у „%s“"
-#: plugins/sudoers/sudoers.c:355
+#: plugins/sudoers/sudoers.c:369
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "није вам допуштено да кориÑтите опцију „-D“ Ñа „%s“"
-#: plugins/sudoers/sudoers.c:382
+#: plugins/sudoers/sudoers.c:396
msgid "no command specified"
msgstr "није наведена наредба"
-#: plugins/sudoers/sudoers.c:407
+#: plugins/sudoers/sudoers.c:421
msgid "sudoers specifies that root is not allowed to sudo"
msgstr "ÑудоерÑи наводе да админиÑтратор није дозвољен у Ñудоу"
-#: plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:471
msgid "user not allowed to override closefrom limit"
msgstr "кориÑнику није дозвољено да препише „closefrom“ ограничење"
-#: plugins/sudoers/sudoers.c:458
+#: plugins/sudoers/sudoers.c:472
msgid "you are not permitted to use the -C option"
msgstr "није вам допуштено да кориÑтите опцију „-C“"
-#: plugins/sudoers/sudoers.c:518
+#: plugins/sudoers/sudoers.c:532
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr "влаÑник временÑке ознаке (%s): нема таквог кориÑника"
-#: plugins/sudoers/sudoers.c:533
+#: plugins/sudoers/sudoers.c:547
msgid "no tty"
msgstr "нема конзоле"
-#: plugins/sudoers/sudoers.c:534
+#: plugins/sudoers/sudoers.c:548
msgid "sorry, you must have a tty to run sudo"
msgstr "извините, морате имати конзолу да покренете Ñудо"
-#: plugins/sudoers/sudoers.c:541
+#: plugins/sudoers/sudoers.c:555
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "неиÑправна шкољка за кориÑника „%s“: %s"
-#: plugins/sudoers/sudoers.c:624
+#: plugins/sudoers/sudoers.c:638
msgid "command in current directory"
msgstr "наредба у текућем директоријуму"
-#: plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/sudoers.c:653
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "„cd“ је уграђена наредба шкољке, не може бити покренута директно."
-#: plugins/sudoers/sudoers.c:641
+#: plugins/sudoers/sudoers.c:655
msgid "the -s option may be used to run a privileged shell."
msgstr "опција „-s“ Ñе може кориÑтити за покретање привилеговане шкољке."
-#: plugins/sudoers/sudoers.c:643
+#: plugins/sudoers/sudoers.c:657
msgid "the -D option may be used to run a command in a specific directory."
msgstr "опција „-D“ Ñе може кориÑтити за покретање наредбе у Ñпецифичном директоријуму."
-#: plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:666
msgid "user not allowed to set a command timeout"
msgstr "кориÑнику није дозвољено да подеÑи време иÑтека наредбе"
-#: plugins/sudoers/sudoers.c:654
+#: plugins/sudoers/sudoers.c:668
msgid "sorry, you are not allowed set a command timeout"
msgstr "извините, није вам дозвољено да подеÑите време иÑтека наредбе"
-#: plugins/sudoers/sudoers.c:662
+#: plugins/sudoers/sudoers.c:676
msgid "user not allowed to preserve the environment"
msgstr "кориÑнику није дозвољено да Ñачува окружење"
-#: plugins/sudoers/sudoers.c:664
+#: plugins/sudoers/sudoers.c:678
msgid "sorry, you are not allowed to preserve the environment"
msgstr "извините, није вам дозвољено да Ñачувате окружење"
-#: plugins/sudoers/sudoers.c:1037
+#: plugins/sudoers/sudoers.c:1053
msgid "sudoedit doesn't need to be run via sudo"
msgstr "„sudoedit“ не треба да Ñе покреће путем „sudo“-а"
-#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "не могу да прочитам „%s“"
-#: plugins/sudoers/sudoers.c:1121 plugins/sudoers/visudo.c:449
-#: plugins/sudoers/visudo.c:748
+#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
+#: plugins/sudoers/visudo.c:764
#, c-format
msgid "unable to stat %s"
msgstr "не могу да добијем податке о „%s“"
-#: plugins/sudoers/sudoers.c:1125 plugins/sudoers/visudo.c:1045
+#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
#, c-format
msgid "%s is not a regular file"
msgstr "„%s“ није обична датотека"
-#: plugins/sudoers/sudoers.c:1129 plugins/sudoers/timestamp.c:252 toke.l:1239
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s је у влаÑништву уиб-а %u, а треба бити %u"
-#: plugins/sudoers/sudoers.c:1133 toke.l:1244
+#: plugins/sudoers/sudoers.c:1147 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "Сви могу да пишу у „%s“"
-#: plugins/sudoers/sudoers.c:1137 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 toke.l:1255
#, c-format
msgid "%s is owned by gid %u, should be %u"
msgstr "%s је у влаÑништву уиб-а %u, а треба бити %u"
-#: plugins/sudoers/sudoers.c:1170
+#: plugins/sudoers/sudoers.c:1184
#, c-format
msgid "only root can use \"-c %s\""
msgstr "Ñамо админиÑтратор може да кориÑти „-c %s“"
-#: plugins/sudoers/sudoers.c:1189
+#: plugins/sudoers/sudoers.c:1203
#, c-format
msgid "unknown login class %s"
msgstr "непознат разред пријављивања „%s“"
-#: plugins/sudoers/sudoers.c:1275 plugins/sudoers/sudoers.c:1290
+#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
#, c-format
msgid "unable to resolve host %s"
msgstr "не могу да решим домаћина „%s“"
@@ -3558,99 +3516,94 @@ msgstr "путања Ñтања обучавања је предуга: %s/%s"
msgid "sudoedit should not be specified with a path"
msgstr "„sudoedit“ не треба да Ñе наводи Ñа путањом"
-#: plugins/sudoers/visudo.c:238
+#: plugins/sudoers/visudo.c:249
msgid "the -x option will be removed in a future release"
msgstr "опција „-x“ биће уклоњена у наредном издању"
-#: plugins/sudoers/visudo.c:240
+#: plugins/sudoers/visudo.c:251
msgid "please consider using the cvtsudoers utility instead"
msgstr "размотрите коришћење помагала „cvtsudoers“"
-#: plugins/sudoers/visudo.c:292 plugins/sudoers/visudo.c:676
+#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
#, c-format
msgid "press return to edit %s: "
msgstr "притиÑните „унеÑи“ да уредите „%s“: "
-#: plugins/sudoers/visudo.c:307
+#: plugins/sudoers/visudo.c:321
#, c-format
msgid "contents of edit session left in %s"
msgstr "Ñадржај ÑеÑије уређивања је оÑтао у „%s“"
-#: plugins/sudoers/visudo.c:361
+#: plugins/sudoers/visudo.c:397
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "наведени уређивач (%s) не поÑтоји"
-#: plugins/sudoers/visudo.c:363
+#: plugins/sudoers/visudo.c:399
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "ниÑам пронашао уређивача (путања уређивача = %s)"
-#: plugins/sudoers/visudo.c:469 plugins/sudoers/visudo.c:477
+#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
msgid "write error"
msgstr "грешка пиÑања"
-#: plugins/sudoers/visudo.c:523
+#: plugins/sudoers/visudo.c:559
#, c-format
msgid "unable to stat temporary file (%s), %s unchanged"
msgstr "не могу да добавим податке привремене датотеке (%s), %s је неизмењено"
-#: plugins/sudoers/visudo.c:530
+#: plugins/sudoers/visudo.c:566
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr "привремена датотека нулте дужине (%s), %s је неизмењено"
-#: plugins/sudoers/visudo.c:536
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "уређивач (%s) није уÑпео, %s је неизмењено"
-#: plugins/sudoers/visudo.c:558
+#: plugins/sudoers/visudo.c:594
#, c-format
msgid "%s unchanged"
msgstr "„%s“ је неизмењено"
-#: plugins/sudoers/visudo.c:615
+#: plugins/sudoers/visudo.c:639
#, c-format
msgid "unable to re-open temporary file (%s), %s unchanged."
msgstr "не могу поново да отворим привремену датотеку (%s), %s је неизмењено."
-#: plugins/sudoers/visudo.c:627
+#: plugins/sudoers/visudo.c:652
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "не могу да обрадим привремену датотеку (%s), непозната грешка"
-#: plugins/sudoers/visudo.c:665
-#, c-format
-msgid "internal error, unable to find %s in list!"
-msgstr "унутрашња грешка, не могу да пронађем „%s“ на ÑпиÑку!"
-
-#: plugins/sudoers/visudo.c:722 plugins/sudoers/visudo.c:752
-#: plugins/sudoers/visudo.c:759
+#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
+#: plugins/sudoers/visudo.c:775
#, c-format
msgid "unable to set (uid, gid) of %s to (%u, %u)"
msgstr "не могу да подеÑим (јиб, гиб) за %s на (%u, %u)"
-#: plugins/sudoers/visudo.c:787
+#: plugins/sudoers/visudo.c:803
#, c-format
msgid "%s and %s not on the same file system, using mv to rename"
msgstr "„%s“ и „%s“ ниÑу на иÑтом ÑиÑтему датотека, кориÑтим „mv“ за преименовање"
-#: plugins/sudoers/visudo.c:798
+#: plugins/sudoers/visudo.c:814
#, c-format
msgid "command failed: '%s %s %s', %s unchanged"
msgstr "наредба није уÑпела: „%s %s %s“, %s је неизмењено"
-#: plugins/sudoers/visudo.c:805
+#: plugins/sudoers/visudo.c:821
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "грешка преименовања „%s“, %s је неизмењено"
-#: plugins/sudoers/visudo.c:825
+#: plugins/sudoers/visudo.c:841
msgid "What now? "
msgstr "Шта Ñада? "
-#: plugins/sudoers/visudo.c:839
+#: plugins/sudoers/visudo.c:855
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3662,41 +3615,41 @@ msgstr ""
" x — излази без чувања измена у датотеци ÑудоерÑа\n"
" Q — прекида и чува измене у датотеци ÑудоерÑа (ОПÐСÐО!)\n"
-#: plugins/sudoers/visudo.c:885
+#: plugins/sudoers/visudo.c:901
#, c-format
msgid "unable to run %s"
msgstr "не могу да покренем %s"
-#: plugins/sudoers/visudo.c:916
+#: plugins/sudoers/visudo.c:932
#, c-format
msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
msgstr "%s: погрешан влаÑник (јиб, гиб) треба бити (%u, %u)\n"
-#: plugins/sudoers/visudo.c:927
+#: plugins/sudoers/visudo.c:943
#, c-format
msgid "%s: bad permissions, should be mode 0%o\n"
msgstr "%s: лоша овлашћења, требају бити у режиму 0%o\n"
-#: plugins/sudoers/visudo.c:978 plugins/sudoers/visudo.c:985
+#: plugins/sudoers/visudo.c:991 plugins/sudoers/visudo.c:998
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: уÑпешно је обрађено\n"
-#: plugins/sudoers/visudo.c:1004
+#: plugins/sudoers/visudo.c:1017
#, c-format
msgid "%s busy, try again later"
msgstr "„%s“ је заузет, покушајте каÑније"
-#: plugins/sudoers/visudo.c:1008
+#: plugins/sudoers/visudo.c:1021
msgid "Edit anyway? [y/N]"
msgstr "Да ипак уреим? [д/Ð]"
-#: plugins/sudoers/visudo.c:1104
+#: plugins/sudoers/visudo.c:1117
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "Упозорење: %s:%d:%d: некоришћено „%s“ „%s“"
-#: plugins/sudoers/visudo.c:1220
+#: plugins/sudoers/visudo.c:1229
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3705,7 +3658,7 @@ msgstr ""
"%s — безбедно уређује датотеку ÑудоерÑа\n"
"\n"
-#: plugins/sudoers/visudo.c:1222
+#: plugins/sudoers/visudo.c:1231
msgid ""
"\n"
"Options:\n"
@@ -3749,14 +3702,77 @@ msgstr "неиÑправан наÑтавак реда"
msgid "invalid IPv6 address"
msgstr "неиÑправна ИПв6 адреÑа"
-#: toke.l:860
+#: toke.l:868
msgid "unexpected line break in string"
msgstr "неочекивани прекид реда у ниÑци"
-#: toke.l:1210
+#: toke.l:1218
msgid "too many levels of includes"
msgstr "превише нивоа укључивања"
+#~ msgid "Error: %s:%d:%d: cycle in %s \"%s\""
+#~ msgstr "Грешка: %s:%d:%d: Ñ†Ð¸ÐºÐ»ÑƒÑ Ñƒ „%s“ „%s“"
+
+#~ msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
+#~ msgstr "Упозорење: %s:%d:%d: Ñ†Ð¸ÐºÐ»ÑƒÑ Ñƒ „%s“ „%s“"
+
+#~ msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
+#~ msgstr "Упозорење: %s:%d:%d: упута за „%s“ „%s“ поÑтоји али није одређена"
+
+#~ msgid "parse error in %s near line %d\n"
+#~ msgstr "грешка обраде у %s близу реда %d\n"
+
+#~ msgid "parse error in %s\n"
+#~ msgstr "грешка обраде у %s\n"
+
+#~ msgid "%s: unknown defaults entry \"%s\""
+#~ msgstr "%s: непознат ÑƒÐ½Ð¾Ñ Ð¾ÑновноÑти „%s“"
+
+#~ msgid "%s:%d:%d: no value specified for \"%s\""
+#~ msgstr "%s:%d:%d: није наведена вредноÑÑ‚ за „%s“"
+
+#~ msgid "%s:%d:%d: invalid operator \"%c=\" for \"%s\""
+#~ msgstr "%s:%d:%d: неиÑправан оператор „%c=“ за „%s“"
+
+#~ msgid "%s:%d:%d: option \"%s\" does not take a value"
+#~ msgstr "%s:%d:%d: опција „%s“ не узима вредноÑÑ‚"
+
+#~ msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
+#~ msgstr "%s:%d:%d: неиÑправна врÑта оÑновноÑти 0x%x за опцију „%s“"
+
+#~ msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
+#~ msgstr "%s:%d:%d: вредноÑÑ‚ „%s“ је неиÑправна за опцију „%s“"
+
+#~ msgid "%s:%d:%d: path name for \"%s\" too long"
+#~ msgstr "%s:%d:%d: назив путање за „%s“ је предуг"
+
+#~ msgid "%s: path name for \"%s\" too long"
+#~ msgstr "%s: назив путање за „%s“ је предуг"
+
+#~ msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
+#~ msgstr "%s:%d:%d: вредноÑÑ‚ за „%s“ мора да почиње Ñа /, ~ или *"
+
+#~ msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
+#~ msgstr "%s:%d:%d: вредноÑÑ‚ за „%s“ мора да почиње Ñа /"
+
+#~ msgid "parse error in %s near line %d"
+#~ msgstr "грешка обраде у %s близу реда %d"
+
+#~ msgid "parse error in %s"
+#~ msgstr "грешка обраде у %s"
+
+#~ msgid "SELinux RBAC is not supported when intercept mode is enabled"
+#~ msgstr "„SELinux RBAC“ није подржано када је укључен режим преÑретања"
+
+#~ msgid "SELinux RBAC is not supported when the log_subcmds flag is enabled"
+#~ msgstr "„SELinux RBAC“ није подржано када је укључена заÑтавица „log_subcmds“"
+
+#~ msgid "problem with defaults entries"
+#~ msgstr "неприлике Ñа оÑновним уноÑима"
+
+#~ msgid "internal error, unable to find %s in list!"
+#~ msgstr "унутрашња грешка, не могу да пронађем „%s“ на ÑпиÑку!"
+
#~ msgid "%s is not in the sudoers file. This incident will be reported.\n"
#~ msgstr "„%s“ Ñе не налази у датотеци ÑудоерÑа. О овом инциденту ће бити поднет извештај.\n"
@@ -3769,9 +3785,6 @@ msgstr "превише нивоа укључивања"
#~ msgid "unable to read diffie-hellman parameters: %s"
#~ msgstr "не могу да читам „diffie-hellman“ параметре: %s"
-#~ msgid "unknown defaults entry \"%s\""
-#~ msgstr "непознат ÑƒÐ½Ð¾Ñ Ð¾ÑновноÑти „%s“"
-
#~ msgid "%s:%d unknown key: %s"
#~ msgstr "„%s:%d“ непознат кључ: %s"
@@ -3924,9 +3937,6 @@ msgstr "превише нивоа укључивања"
#~ "\n"
#~ "СССД улога: ÐЕПОЗÐÐТО\n"
-#~ msgid "Warning: cycle in %s `%s'"
-#~ msgstr "Упозорење: Ñ†Ð¸ÐºÐ»ÑƒÑ Ñƒ „%s“ „%s“"
-
#~ msgid "Warning: unused %s `%s'"
#~ msgstr "Упозорење: некоришћено „%s“ „%s“"
diff --git a/plugins/sudoers/po/sudoers.pot b/plugins/sudoers/po/sudoers.pot
index ad07ede53..964702913 100644
--- a/plugins/sudoers/po/sudoers.pot
+++ b/plugins/sudoers/po/sudoers.pot
@@ -5,9 +5,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11\n"
+"Project-Id-Version: sudo 1.9.12\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: confstr.sh:1 gram.y:1218
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr ""
@@ -41,13 +41,13 @@ msgstr ""
msgid "Sorry, try again."
msgstr ""
-#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341 gram.y:365
-#: gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427 gram.y:501 gram.y:511
-#: gram.y:523 gram.y:571 gram.y:580 gram.y:589 gram.y:598 gram.y:730 gram.y:738
-#: gram.y:749 gram.y:761 gram.y:780 gram.y:943 gram.y:948 gram.y:956 gram.y:970
-#: gram.y:976 gram.y:1098 gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133
-#: gram.y:1162 gram.y:1171 gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769
-#: gram.y:1816 lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342 gram.y:366
+#: gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428 gram.y:502 gram.y:512
+#: gram.y:524 gram.y:572 gram.y:581 gram.y:590 gram.y:599 gram.y:731 gram.y:739
+#: gram.y:750 gram.y:762 gram.y:781 gram.y:944 gram.y:949 gram.y:957 gram.y:971
+#: gram.y:977 gram.y:1099 gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134
+#: gram.y:1163 gram.y:1172 gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777
+#: gram.y:1827 lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
#: lib/iolog/iolog_filter.c:202 lib/iolog/iolog_filter.c:233
@@ -56,30 +56,43 @@ msgstr ""
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:650
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1743
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:213
+#: logsrvd/logsrvd_journal.c:214 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_journal.c:432
+#: logsrvd/logsrvd_local.c:215 logsrvd/logsrvd_local.c:216
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:279
+#: logsrvd/logsrvd_local.c:417 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:467 logsrvd/logsrvd_local.c:472
+#: logsrvd/logsrvd_local.c:473 logsrvd/logsrvd_queue.c:159
+#: logsrvd/logsrvd_queue.c:189 logsrvd/logsrvd_queue.c:266
+#: logsrvd/logsrvd_relay.c:444 logsrvd/logsrvd_relay.c:743
+#: logsrvd/logsrvd_relay.c:850 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1801 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
@@ -109,11 +122,11 @@ msgstr ""
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1158
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -122,124 +135,125 @@ msgstr ""
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
-#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
-#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
-#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
-#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
-#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
-#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
-#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
-#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
-#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
-#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
-#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
-#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
-#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
-#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
-#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
-#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
-#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
-#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
-#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
+#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr ""
-#: gram.y:622
+#: gram.y:623
msgid "a digest requires a path name"
msgstr ""
-#: gram.y:644
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr ""
-#: gram.y:650
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr ""
-#: gram.y:660
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr ""
-#: gram.y:666
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr ""
-#: gram.y:801
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr ""
-#: gram.y:824
+#: gram.y:825
msgid "invalid notbefore value"
msgstr ""
-#: gram.y:833
+#: gram.y:834
msgid "invalid notafter value"
msgstr ""
-#: gram.y:843 plugins/sudoers/policy.c:376
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr ""
-#: gram.y:845 plugins/sudoers/policy.c:378
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr ""
-#: gram.y:966 plugins/sudoers/sudoers.c:1014
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr ""
-#: gram.y:1220 plugins/sudoers/check_aliases.c:96
-#: plugins/sudoers/defaults.c:1275
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr ""
-#: gram.y:1270
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr ""
-#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
@@ -249,33 +263,48 @@ msgstr ""
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
-#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
@@ -304,11 +333,11 @@ msgstr ""
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1157
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -317,46 +346,47 @@ msgstr ""
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
-#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
-#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
-#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
-#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
-#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
-#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
-#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
-#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
-#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
-#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
-#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
-#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
-#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
-#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
-#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
-#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
-#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
-#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
-#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
-#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -369,25 +399,25 @@ msgstr ""
#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
-#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
-#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
-#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
-#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
-#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
-#: toke.l:1226
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr ""
@@ -396,14 +426,14 @@ msgstr ""
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
-#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
-#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213 toke.l:987
@@ -446,7 +476,7 @@ msgstr ""
msgid "%8s : (command continued) %s"
msgstr ""
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -561,14 +591,14 @@ msgstr ""
msgid "%s exists but is not a directory (0%o)"
msgstr ""
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr ""
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
-#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr ""
@@ -583,150 +613,156 @@ msgstr ""
msgid "invalid timing file line: %s"
msgstr ""
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
-#: plugins/sudoers/policy.c:573
-msgid "unable to generate UUID"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
msgstr ""
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr ""
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr ""
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr ""
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr ""
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr ""
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr ""
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr ""
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr ""
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr ""
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr ""
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr ""
-#: logsrvd/iolog_writer.c:780
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr ""
-#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr ""
-#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
-#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
-#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
-#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr ""
-#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr ""
-#: logsrvd/iolog_writer.c:839
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr ""
-#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr ""
-#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr ""
-#: logsrvd/logsrv_util.c:154
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr ""
-#: logsrvd/logsrv_util.c:161
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr ""
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr ""
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr ""
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
-#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
-#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
-#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
-#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
-#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
-#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
-#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
-#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
-#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
-#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
-#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -735,633 +771,658 @@ msgstr ""
msgid "unable to add event to queue"
msgstr ""
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr ""
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr ""
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr ""
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr ""
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr ""
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr ""
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr ""
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr ""
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr ""
-#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
-#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
-#: plugins/sudoers/log_client.c:1618
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr ""
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr ""
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr ""
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
#, c-format
msgid "unable to unpack %s size %zu"
msgstr ""
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr ""
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr ""
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr ""
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr ""
-#: logsrvd/logsrvd.c:982
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr ""
-#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr ""
-#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:716
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr ""
-#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr ""
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr ""
-#: logsrvd/logsrvd.c:1389
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr ""
-#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
-#: plugins/sudoers/log_client.c:276
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr ""
-#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr ""
-#: logsrvd/logsrvd.c:1718
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr ""
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr ""
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr ""
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr ""
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr ""
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr ""
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr ""
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr ""
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr ""
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr ""
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:180
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr ""
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
-#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
-#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
-#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr ""
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr ""
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:1035
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr ""
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr ""
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
-#: logsrvd/logsrvd_journal.c:416
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr ""
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1020
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr ""
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr ""
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr ""
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
-#: logsrvd/logsrvd_journal.c:452
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr ""
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr ""
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr ""
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr ""
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr ""
-#: logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr ""
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr ""
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr ""
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr ""
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr ""
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr ""
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr ""
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr ""
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr ""
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr ""
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr ""
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr ""
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr ""
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr ""
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr ""
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr ""
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr ""
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr ""
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr ""
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr ""
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr ""
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1504
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr ""
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr ""
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr ""
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr ""
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr ""
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
-#: logsrvd/logsrvd_relay.c:784
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr ""
-#: logsrvd/logsrvd_relay.c:805
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr ""
-#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr ""
-#: logsrvd/logsrvd_relay.c:838
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr ""
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr ""
-#: logsrvd/logsrvd_relay.c:904
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr ""
-#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
-#: logsrvd/logsrvd_relay.c:974
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr ""
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr ""
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr ""
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr ""
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr ""
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr ""
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr ""
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr ""
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr ""
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr ""
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr ""
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr ""
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr ""
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr ""
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr ""
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr ""
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr ""
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
-#: plugins/sudoers/iolog.c:1024
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr ""
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
-#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr ""
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr ""
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr ""
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr ""
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr ""
-#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
msgid "host name does not match certificate"
msgstr ""
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr ""
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr ""
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr ""
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr ""
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr ""
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr ""
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr ""
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr ""
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr ""
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr ""
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr ""
-#: logsrvd/tls_client.c:191
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr ""
-#: logsrvd/tls_client.c:205
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr ""
-#: logsrvd/tls_client.c:233
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr ""
-#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr ""
-#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr ""
-#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr ""
-#: logsrvd/tls_init.c:277
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr ""
-#: logsrvd/tls_init.c:284
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr ""
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
-#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
-#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
-#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
-#: plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr ""
@@ -1498,7 +1559,7 @@ msgstr ""
msgid "PAM account management error: %s"
msgstr ""
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr ""
@@ -1575,17 +1636,17 @@ msgstr ""
msgid "unable to commit audit record"
msgstr ""
-#: plugins/sudoers/check.c:275
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr ""
-#: plugins/sudoers/check.c:278
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr ""
-#: plugins/sudoers/check.c:291
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1597,14 +1658,14 @@ msgid ""
"\n"
msgstr ""
-#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
-#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr ""
-#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
msgid "%s: %s\n"
msgstr ""
@@ -1634,7 +1695,7 @@ msgstr ""
msgid "order padding: %s: %s"
msgstr ""
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr ""
@@ -1654,14 +1715,14 @@ msgstr ""
msgid "%s: input and output files must be different"
msgstr ""
-#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:165
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
-#: plugins/sudoers/visudo.c:969
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr ""
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr ""
@@ -1686,25 +1747,25 @@ msgstr ""
msgid "invalid filter: %s"
msgstr ""
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, c-format
msgid "failed to parse %s file, unknown error"
msgstr ""
#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr ""
-#: plugins/sudoers/cvtsudoers.c:1501
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
"\n"
msgstr ""
-#: plugins/sudoers/cvtsudoers.c:1503
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -2145,369 +2206,393 @@ msgid "Log user's input for the command being run"
msgstr ""
#: plugins/sudoers/def_data.c:356
-msgid "Log the output of the command being run"
+msgid "Log the command's standard input if not connected to a terminal"
msgstr ""
#: plugins/sudoers/def_data.c:360
-msgid "Compress I/O logs using zlib"
+msgid "Log the user's terminal input for the command being run"
msgstr ""
#: plugins/sudoers/def_data.c:364
-msgid "Always run commands in a pseudo-tty"
+msgid "Log the output of the command being run"
msgstr ""
#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr ""
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr ""
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr ""
+
+#: plugins/sudoers/def_data.c:380
+msgid "Compress I/O logs using zlib"
+msgstr ""
+
+#: plugins/sudoers/def_data.c:384
+msgid "Always run commands in a pseudo-tty"
+msgstr ""
+
+#: plugins/sudoers/def_data.c:388
#, c-format
msgid "Plugin for non-Unix group support: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:372
+#: plugins/sudoers/def_data.c:392
#, c-format
msgid "Directory in which to store input/output logs: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:376
+#: plugins/sudoers/def_data.c:396
#, c-format
msgid "File in which to store the input/output log: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:380
+#: plugins/sudoers/def_data.c:400
msgid "Add an entry to the utmp/utmpx file when allocating a pty"
msgstr ""
-#: plugins/sudoers/def_data.c:384
+#: plugins/sudoers/def_data.c:404
msgid "Set the user in utmp to the runas user, not the invoking user"
msgstr ""
-#: plugins/sudoers/def_data.c:388
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr ""
-#: plugins/sudoers/def_data.c:400
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:424
#, c-format
msgid "PAM service name to use for login shells: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:408
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:432
msgid "Attempt to establish PAM credentials for the target user"
msgstr ""
-#: plugins/sudoers/def_data.c:416
+#: plugins/sudoers/def_data.c:436
msgid "Create a new PAM session for the command to run in"
msgstr ""
-#: plugins/sudoers/def_data.c:420
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr ""
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr ""
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:452
msgid ""
"Check parent directories for writability when editing files with sudoedit"
msgstr ""
-#: plugins/sudoers/def_data.c:436
+#: plugins/sudoers/def_data.c:456
msgid "Follow symbolic links when editing files with sudoedit"
msgstr ""
-#: plugins/sudoers/def_data.c:440
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr ""
-#: plugins/sudoers/def_data.c:444
+#: plugins/sudoers/def_data.c:464
msgid "Match netgroups based on the entire tuple: user, host and domain"
msgstr ""
-#: plugins/sudoers/def_data.c:448
+#: plugins/sudoers/def_data.c:468
msgid "Allow commands to be run even if sudo cannot write to the audit log"
msgstr ""
-#: plugins/sudoers/def_data.c:452
+#: plugins/sudoers/def_data.c:472
msgid "Allow commands to be run even if sudo cannot write to the I/O log"
msgstr ""
-#: plugins/sudoers/def_data.c:456
+#: plugins/sudoers/def_data.c:476
msgid "Allow commands to be run even if sudo cannot write to the log file"
msgstr ""
-#: plugins/sudoers/def_data.c:460
+#: plugins/sudoers/def_data.c:480
msgid "Resolve groups in sudoers and match on the group ID, not the name"
msgstr ""
-#: plugins/sudoers/def_data.c:464
+#: plugins/sudoers/def_data.c:484
#, c-format
msgid ""
"Log entries larger than this value will be split into multiple syslog "
"messages: %u"
msgstr ""
-#: plugins/sudoers/def_data.c:468
+#: plugins/sudoers/def_data.c:488
#, c-format
msgid "User that will own the I/O log files: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:472
+#: plugins/sudoers/def_data.c:492
#, c-format
msgid "Group that will own the I/O log files: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:476
+#: plugins/sudoers/def_data.c:496
#, c-format
msgid "File mode to use for the I/O log files: 0%o"
msgstr ""
-#: plugins/sudoers/def_data.c:480
+#: plugins/sudoers/def_data.c:500
#, c-format
msgid "Execute commands by file descriptor instead of by path: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:484
+#: plugins/sudoers/def_data.c:504
msgid ""
"Ignore unknown Defaults entries in sudoers instead of producing a warning"
msgstr ""
-#: plugins/sudoers/def_data.c:488
+#: plugins/sudoers/def_data.c:508
#, c-format
msgid "Time in seconds after which the command will be terminated: %u"
msgstr ""
-#: plugins/sudoers/def_data.c:492
+#: plugins/sudoers/def_data.c:512
msgid "Allow the user to specify a timeout on the command line"
msgstr ""
-#: plugins/sudoers/def_data.c:496
+#: plugins/sudoers/def_data.c:516
msgid "Flush I/O log data to disk immediately instead of buffering it"
msgstr ""
-#: plugins/sudoers/def_data.c:500
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr ""
-#: plugins/sudoers/def_data.c:504
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:508
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr ""
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr ""
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr ""
-#: plugins/sudoers/def_data.c:524
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr ""
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr ""
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr ""
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:556
msgid ""
"Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr ""
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr ""
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr ""
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr ""
-#: plugins/sudoers/def_data.c:564
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr ""
-#: plugins/sudoers/def_data.c:568
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr ""
-#: plugins/sudoers/def_data.c:572
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:576
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:580
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:584
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr ""
-#: plugins/sudoers/def_data.c:588
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:592
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr ""
-#: plugins/sudoers/def_data.c:596
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr ""
-#: plugins/sudoers/def_data.c:600
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr ""
-#: plugins/sudoers/def_data.c:604
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr ""
-#: plugins/sudoers/def_data.c:608
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr ""
-#: plugins/sudoers/def_data.c:612
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid ""
"The maximum size to which the process's address space may grow (in bytes): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:616
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:620
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid ""
"The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:624
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:628
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:632
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:636
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:640
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:644
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid ""
"The maximum number of processes that the user may run simultaneously: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:648
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid ""
"The maximum size to which the process's resident set size may grow (in "
"bytes): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:652
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr ""
-#: plugins/sudoers/def_data.c:656
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr ""
-#: plugins/sudoers/def_data.c:660
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr ""
-#: plugins/sudoers/def_data.c:664
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr ""
-#: plugins/sudoers/def_data.c:668
+#: plugins/sudoers/def_data.c:688
#, c-format
msgid "The mechanism used by the intercept and log_subcmds options: %s"
msgstr ""
-#: plugins/sudoers/def_data.c:672
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr ""
+
+#: plugins/sudoers/def_data.c:696
#, c-format
msgid "AppArmor profile to use in the new security context: %s"
msgstr ""
@@ -2542,31 +2627,31 @@ msgstr ""
msgid "value \"%s\" is invalid for option \"%s\""
msgstr ""
-#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
-#: plugins/sudoers/policy.c:216
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
msgid "path name for \"%s\" too long"
msgstr ""
-#: plugins/sudoers/defaults.c:1133
+#: plugins/sudoers/defaults.c:1134
#, c-format
msgid "values for \"%s\" must start with a '/', '~', or '*'"
msgstr ""
-#: plugins/sudoers/defaults.c:1140
+#: plugins/sudoers/defaults.c:1141
#, c-format
msgid "values for \"%s\" must start with a '/'"
msgstr ""
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr ""
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr ""
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, c-format
msgid ""
"sorry, you are not allowed to set the following environment variables: %s"
@@ -2582,27 +2667,27 @@ msgstr ""
msgid "%s: read error"
msgstr ""
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr ""
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, c-format
msgid "%s must only be writable by owner"
msgstr ""
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr ""
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, c-format
msgid "unable to find symbol \"group_plugin\" in %s"
msgstr ""
-#: plugins/sudoers/group_plugin.c:107
+#: plugins/sudoers/group_plugin.c:202
#, c-format
msgid "%s: incompatible group plugin major version %d, expected %d"
msgstr ""
@@ -2625,10 +2710,10 @@ msgstr ""
msgid "unable to update sequence file"
msgstr ""
-#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
-#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
-#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
-#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr ""
@@ -2638,25 +2723,25 @@ msgstr ""
msgid "unable to create %s/%s"
msgstr ""
-#: plugins/sudoers/iolog.c:955
+#: plugins/sudoers/iolog.c:957
#, c-format
msgid "%s: internal error, I/O log file for event %d not open"
msgstr ""
-#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1182
-#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
-#: plugins/sudoers/visudo.c:552
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr ""
-#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
-#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr ""
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr ""
@@ -2681,7 +2766,7 @@ msgid ""
"ldap_start_tls_s_np()"
msgstr ""
-#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr ""
@@ -2691,12 +2776,12 @@ msgstr ""
msgid "%s: port too large"
msgstr ""
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr ""
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr ""
@@ -2721,142 +2806,142 @@ msgstr ""
msgid "unable to send audit message"
msgstr ""
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
-#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr ""
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr ""
-#: plugins/sudoers/log_client.c:225
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr ""
-#: plugins/sudoers/log_client.c:247
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr ""
-#: plugins/sudoers/log_client.c:261
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr ""
-#: plugins/sudoers/log_client.c:270
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr ""
-#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr ""
-#: plugins/sudoers/log_client.c:538
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr ""
-#: plugins/sudoers/log_client.c:548
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr ""
-#: plugins/sudoers/log_client.c:1246
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr ""
-#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr ""
-#: plugins/sudoers/log_client.c:1876
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr ""
-#: plugins/sudoers/log_client.c:2024
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr ""
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr ""
-#: plugins/sudoers/logging.c:300
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr ""
-#: plugins/sudoers/logging.c:302
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr ""
-#: plugins/sudoers/logging.c:323
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr ""
-#: plugins/sudoers/logging.c:326
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr ""
-#: plugins/sudoers/logging.c:329
+#: plugins/sudoers/logging.c:321
#, c-format
msgid "Sorry, user %s may not run sudo on %s.\n"
msgstr ""
-#: plugins/sudoers/logging.c:332
+#: plugins/sudoers/logging.c:324
#, 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:342
+#: plugins/sudoers/logging.c:334
msgid "This incident has been reported to the administrator.\n"
msgstr ""
-#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
-#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
-#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
-#: plugins/sudoers/sudoers.c:801
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr ""
-#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, 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:395
+#: plugins/sudoers/logging.c:387
#, c-format
msgid "%u incorrect password attempt"
msgid_plural "%u incorrect password attempts"
msgstr[0] ""
msgstr[1] ""
-#: plugins/sudoers/logging.c:485
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr ""
-#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr ""
-#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
msgid "problem parsing sudoers"
msgstr ""
-#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
msgid "%s:%d:%d: %s"
msgstr ""
-#: plugins/sudoers/logging.c:1068
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr ""
@@ -2871,150 +2956,150 @@ msgstr ""
msgid "digest for %s (%s) is not in %s form"
msgstr ""
-#: plugins/sudoers/parse.c:585
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
"LDAP Role: %s\n"
msgstr ""
-#: plugins/sudoers/parse.c:588
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
msgstr ""
-#: plugins/sudoers/parse.c:590
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr ""
-#: plugins/sudoers/parse.c:605
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr ""
-#: plugins/sudoers/parse.c:615
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr ""
-#: plugins/sudoers/parse.c:679
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr ""
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:876
#, c-format
msgid "Matching Defaults entries for %s on %s:\n"
msgstr ""
-#: plugins/sudoers/parse.c:888
+#: plugins/sudoers/parse.c:894
#, c-format
msgid "Runas and Command-specific defaults for %s:\n"
msgstr ""
-#: plugins/sudoers/parse.c:906
+#: plugins/sudoers/parse.c:912
#, c-format
msgid "User %s may run the following commands on %s:\n"
msgstr ""
-#: plugins/sudoers/parse.c:921
+#: plugins/sudoers/parse.c:927
#, c-format
msgid "User %s is not allowed to run sudo on %s.\n"
msgstr ""
-#: plugins/sudoers/parse_ldif.c:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr ""
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr ""
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr ""
-#: plugins/sudoers/policy.c:351 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr ""
-#: plugins/sudoers/policy.c:508
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr ""
-#: plugins/sudoers/policy.c:512
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr ""
-#: plugins/sudoers/policy.c:516
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr ""
-#: plugins/sudoers/policy.c:520
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr ""
-#: plugins/sudoers/policy.c:706
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr ""
-#: plugins/sudoers/policy.c:886
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr ""
-#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr ""
-#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
-#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr ""
-#: plugins/sudoers/policy.c:1262
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr ""
-#: plugins/sudoers/policy.c:1264
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr ""
-#: plugins/sudoers/policy.c:1268
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
"Sudoers path: %s\n"
msgstr ""
-#: plugins/sudoers/policy.c:1271
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr ""
-#: plugins/sudoers/policy.c:1273
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr ""
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr ""
-#: plugins/sudoers/policy.c:1307
+#: plugins/sudoers/policy.c:1337
#, c-format
msgid "unable to register hook of type %d (version %d.%d)"
msgstr ""
-#: plugins/sudoers/policy.c:1325
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr ""
@@ -3153,148 +3238,142 @@ msgstr ""
msgid "unable to find symbol \"%s\" in %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:258
+#: plugins/sudoers/sudoers.c:263
#, c-format
msgid "unable to get defaults from %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:265
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr ""
-#: plugins/sudoers/sudoers.c:341
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:343
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:369
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:396
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr ""
-#: plugins/sudoers/sudoers.c:421
+#: plugins/sudoers/sudoers.c:426
msgid "sudoers specifies that root is not allowed to sudo"
msgstr ""
-#: plugins/sudoers/sudoers.c:471
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr ""
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr ""
-#: plugins/sudoers/sudoers.c:532
+#: plugins/sudoers/sudoers.c:537
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr ""
-#: plugins/sudoers/sudoers.c:547
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr ""
-#: plugins/sudoers/sudoers.c:548
+#: plugins/sudoers/sudoers.c:553
msgid "sorry, you must have a tty to run sudo"
msgstr ""
-#: plugins/sudoers/sudoers.c:555
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:638
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr ""
-#: plugins/sudoers/sudoers.c:653
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr ""
-#: plugins/sudoers/sudoers.c:655
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr ""
-#: plugins/sudoers/sudoers.c:657
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr ""
-#: plugins/sudoers/sudoers.c:666
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr ""
-#: plugins/sudoers/sudoers.c:668
+#: plugins/sudoers/sudoers.c:673
msgid "sorry, you are not allowed set a command timeout"
msgstr ""
-#: plugins/sudoers/sudoers.c:676
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr ""
-#: plugins/sudoers/sudoers.c:678
+#: plugins/sudoers/sudoers.c:683
msgid "sorry, you are not allowed to preserve the environment"
msgstr ""
-#: plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr ""
-#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
-#: plugins/sudoers/visudo.c:764
-#, c-format
-msgid "unable to stat %s"
-msgstr ""
-
-#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr ""
-#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr ""
-#: plugins/sudoers/sudoers.c:1147 toke.l:1252
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr ""
-#: plugins/sudoers/sudoers.c:1151 toke.l:1255
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, c-format
msgid "%s is owned by gid %u, should be %u"
msgstr ""
-#: plugins/sudoers/sudoers.c:1184
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr ""
-#: plugins/sudoers/sudoers.c:1203
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr ""
-#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr ""
@@ -3392,24 +3471,24 @@ msgstr ""
msgid "unknown search type %d"
msgstr ""
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, c-format
msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n"
msgstr ""
-#: plugins/sudoers/sudoreplay.c:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, c-format
msgid "usage: %s [-h] [-d dir] -l [search expression]\n"
msgstr ""
-#: plugins/sudoers/sudoreplay.c:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
"\n"
msgstr ""
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3448,127 +3527,122 @@ msgid ""
"Command unmatched"
msgstr ""
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr ""
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, c-format
msgid "unable to truncate time stamp file to %lld bytes"
msgstr ""
-#: plugins/sudoers/timestamp.c:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr ""
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, c-format
msgid "time stamp too far in the future: %20.20s"
msgstr ""
-#: plugins/sudoers/timestamp.c:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr ""
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, c-format
-msgid "lecture status path too long: %s/%s"
-msgstr ""
-
#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr ""
-#: plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:254
msgid "the -x option will be removed in a future release"
msgstr ""
-#: plugins/sudoers/visudo.c:251
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr ""
-#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr ""
-#: plugins/sudoers/visudo.c:321
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr ""
-#: plugins/sudoers/visudo.c:397
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr ""
-#: plugins/sudoers/visudo.c:399
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr ""
-#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr ""
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr ""
-#: plugins/sudoers/visudo.c:559
+#: plugins/sudoers/visudo.c:565
#, c-format
msgid "unable to stat temporary file (%s), %s unchanged"
msgstr ""
-#: plugins/sudoers/visudo.c:566
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr ""
-#: plugins/sudoers/visudo.c:572
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr ""
-#: plugins/sudoers/visudo.c:594
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr ""
-#: plugins/sudoers/visudo.c:639
+#: plugins/sudoers/visudo.c:645
#, c-format
msgid "unable to re-open temporary file (%s), %s unchanged."
msgstr ""
-#: plugins/sudoers/visudo.c:652
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr ""
-#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, c-format
msgid "unable to set (uid, gid) of %s to (%u, %u)"
msgstr ""
-#: plugins/sudoers/visudo.c:803
+#: plugins/sudoers/visudo.c:809
#, c-format
msgid "%s and %s not on the same file system, using mv to rename"
msgstr ""
-#: plugins/sudoers/visudo.c:814
+#: plugins/sudoers/visudo.c:820
#, c-format
msgid "command failed: '%s %s %s', %s unchanged"
msgstr ""
-#: plugins/sudoers/visudo.c:821
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr ""
-#: plugins/sudoers/visudo.c:841
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr ""
-#: plugins/sudoers/visudo.c:855
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3576,54 +3650,55 @@ msgid ""
" (Q)uit and save changes to sudoers file (DANGER!)\n"
msgstr ""
-#: plugins/sudoers/visudo.c:901
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr ""
-#: plugins/sudoers/visudo.c:932
+#: plugins/sudoers/visudo.c:938
#, c-format
msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
msgstr ""
-#: plugins/sudoers/visudo.c:943
+#: plugins/sudoers/visudo.c:949
#, c-format
msgid "%s: bad permissions, should be mode 0%o\n"
msgstr ""
-#: plugins/sudoers/visudo.c:991 plugins/sudoers/visudo.c:998
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr ""
-#: plugins/sudoers/visudo.c:1017
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr ""
-#: plugins/sudoers/visudo.c:1021
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr ""
-#: plugins/sudoers/visudo.c:1117
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr ""
-#: plugins/sudoers/visudo.c:1229
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
"\n"
msgstr ""
-#: plugins/sudoers/visudo.c:1231
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"
diff --git a/plugins/sudoers/po/sv.mo b/plugins/sudoers/po/sv.mo
index 7269ad75a..c9591dc86 100644
--- a/plugins/sudoers/po/sv.mo
+++ b/plugins/sudoers/po/sv.mo
Binary files differ
diff --git a/plugins/sudoers/po/sv.po b/plugins/sudoers/po/sv.po
index 4bf4f16c8..cbdc47a10 100644
--- a/plugins/sudoers/po/sv.po
+++ b/plugins/sudoers/po/sv.po
@@ -1,27 +1,27 @@
# Swedish translation for sudoers.
-# Copyright © 2012, 2016, 2017, 2018, 2019, 2020, 2021 Free Software Foundation, Inc.
+# Copyright © 2012, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
# This file is put in the public domain.
# Daniel Nylander <po@danielnylander.se>, 2012.
-# Sebastian Rasmussen <sebras@gmail.com>, 2016, 2017, 2018, 2019, 2020, 2021.
+# Sebastian Rasmussen <sebras@gmail.com>, 2016, 2017, 2018, 2019, 2020, 2021, 2022.
# Luna Jernberg <droidbittin@gmail.com>, 2021.
#
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.7b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2021-05-01 16:27-0600\n"
-"PO-Revision-Date: 2021-05-05 21:51+0200\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-11 16:19+0200\n"
"Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\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.4\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 3.1.1\n"
-#: confstr.sh:1 gram.y:1183
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "syntaxfel"
@@ -45,398 +45,521 @@ msgstr "*** SÄKERHETSINFORMATION för %h ***"
msgid "Sorry, try again."
msgstr "Försök igen."
-#: gram.y:233 gram.y:300 gram.y:309 gram.y:318 gram.y:328 gram.y:338
-#: gram.y:362 gram.y:389 gram.y:398 gram.y:406 gram.y:415 gram.y:424
-#: gram.y:496 gram.y:506 gram.y:518 gram.y:562 gram.y:571 gram.y:580
-#: gram.y:589 gram.y:619 gram.y:716 gram.y:724 gram.y:735 gram.y:747
-#: gram.y:766 gram.y:914 gram.y:922 gram.y:932 gram.y:938 gram.y:1060
-#: gram.y:1069 gram.y:1077 gram.y:1086 gram.y:1095 gram.y:1124 gram.y:1133
-#: gram.y:1141 gram.y:1231 gram.y:1343 gram.y:1650 gram.y:1700
-#: lib/eventlog/eventlog.c:260 lib/eventlog/eventlog.c:333
-#: lib/eventlog/eventlog.c:733 lib/eventlog/eventlog.c:797
-#: lib/eventlog/eventlog.c:1053 lib/iolog/iolog_json.c:125
-#: lib/iolog/iolog_json.c:330 lib/iolog/iolog_json.c:360
-#: lib/iolog/iolog_json.c:503 lib/iolog/iolog_legacy.c:100
-#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
-#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
-#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:210
-#: logsrvd/logsrvd.c:1021 logsrvd/logsrvd.c:1089 logsrvd/logsrvd_journal.c:142
-#: logsrvd/logsrvd_journal.c:196 logsrvd/logsrvd_journal.c:248
-#: logsrvd/logsrvd_journal.c:380 logsrvd/logsrvd_relay.c:443
-#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:857
-#: logsrvd/sendlog.c:500 plugins/sudoers/audit.c:115
-#: plugins/sudoers/audit.c:263 plugins/sudoers/auth/bsdauth.c:143
-#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144
-#: plugins/sudoers/auth/pam.c:692 plugins/sudoers/auth/rfc1938.c:111
-#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:95
-#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:160
-#: plugins/sudoers/cvtsudoers.c:177 plugins/sudoers/cvtsudoers.c:188
-#: plugins/sudoers/cvtsudoers.c:300 plugins/sudoers/cvtsudoers.c:428
-#: plugins/sudoers/cvtsudoers.c:561 plugins/sudoers/cvtsudoers.c:578
-#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761
-#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1183
-#: plugins/sudoers/cvtsudoers.c:1187 plugins/sudoers/cvtsudoers.c:1289
-#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
-#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
-#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:371
-#: plugins/sudoers/cvtsudoers_ldif.c:421 plugins/sudoers/cvtsudoers_ldif.c:429
-#: plugins/sudoers/cvtsudoers_ldif.c:440 plugins/sudoers/cvtsudoers_ldif.c:447
-#: plugins/sudoers/cvtsudoers_ldif.c:460 plugins/sudoers/cvtsudoers_ldif.c:468
-#: plugins/sudoers/cvtsudoers_ldif.c:615 plugins/sudoers/defaults.c:638
-#: plugins/sudoers/defaults.c:933 plugins/sudoers/defaults.c:1108
-#: plugins/sudoers/editor.c:187 plugins/sudoers/env.c:262
-#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
-#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:57
-#: plugins/sudoers/group_plugin.c:133 plugins/sudoers/interfaces.c:72
-#: plugins/sudoers/iolog.c:609 plugins/sudoers/iolog.c:626
-#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422
-#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437
-#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453
-#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908
-#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709
-#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827
-#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063
-#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441
-#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553
-#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:678
-#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:326
-#: plugins/sudoers/ldap_util.c:333 plugins/sudoers/ldap_util.c:648
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:105
-#: plugins/sudoers/log_client.c:381 plugins/sudoers/log_client.c:686
-#: plugins/sudoers/log_client.c:704 plugins/sudoers/log_client.c:1413
-#: plugins/sudoers/log_client.c:1626 plugins/sudoers/log_client.c:1950
-#: plugins/sudoers/log_client.c:2007 plugins/sudoers/logging.c:100
-#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:426
-#: plugins/sudoers/logging.c:446 plugins/sudoers/logging.c:527
-#: plugins/sudoers/match_command.c:286 plugins/sudoers/match_command.c:484
-#: plugins/sudoers/match_command.c:533 plugins/sudoers/match_command.c:604
-#: plugins/sudoers/match_command.c:650 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:216
-#: plugins/sudoers/parse.c:236 plugins/sudoers/parse.c:253
-#: plugins/sudoers/parse.c:276 plugins/sudoers/parse.c:287
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
+#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
+#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
+#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
+#: lib/iolog/iolog_filter.c:202 lib/iolog/iolog_filter.c:233
+#: lib/iolog/iolog_json.c:150 lib/iolog/iolog_json.c:382
+#: lib/iolog/iolog_json.c:412 lib/iolog/iolog_json.c:555
+#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
+#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
+#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
+#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
+#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
+#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
+#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
+#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
+#: plugins/sudoers/cvtsudoers_merge.c:353
+#: plugins/sudoers/cvtsudoers_merge.c:399
+#: plugins/sudoers/cvtsudoers_merge.c:446
+#: plugins/sudoers/cvtsudoers_merge.c:467
+#: plugins/sudoers/cvtsudoers_merge.c:553
+#: plugins/sudoers/cvtsudoers_merge.c:564
+#: plugins/sudoers/cvtsudoers_merge.c:633
+#: plugins/sudoers/cvtsudoers_merge.c:1158
+#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
+#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
+#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
+#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
+#: plugins/sudoers/ldap.c:755 plugins/sudoers/ldap.c:919
+#: plugins/sudoers/ldap.c:1335 plugins/sudoers/ldap.c:1761
+#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
+#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
+#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
-#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260
-#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
-#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
-#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
-#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
-#: plugins/sudoers/parse_ldif.c:483 plugins/sudoers/parse_ldif.c:596
-#: plugins/sudoers/parse_ldif.c:626 plugins/sudoers/parse_ldif.c:651
-#: plugins/sudoers/parse_ldif.c:709 plugins/sudoers/parse_ldif.c:726
-#: plugins/sudoers/parse_ldif.c:754 plugins/sudoers/parse_ldif.c:761
-#: plugins/sudoers/policy.c:543 plugins/sudoers/policy.c:890
-#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:195
-#: plugins/sudoers/pwutil.c:266 plugins/sudoers/pwutil.c:344
-#: plugins/sudoers/pwutil.c:518 plugins/sudoers/pwutil.c:583
-#: plugins/sudoers/pwutil.c:655 plugins/sudoers/pwutil.c:853
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:953
-#: plugins/sudoers/pwutil.c:1010 plugins/sudoers/sssd.c:145
-#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470
-#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561
-#: plugins/sudoers/sssd.c:754 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:299 plugins/sudoers/sudoers.c:325
-#: plugins/sudoers/sudoers.c:374 plugins/sudoers/sudoers.c:384
-#: plugins/sudoers/sudoers.c:425 plugins/sudoers/sudoers.c:787
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/sudoers.c:975
-#: plugins/sudoers/sudoers.c:1241 plugins/sudoers/sudoreplay.c:552
-#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
+#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:580
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:77 plugins/sudoers/toke_util.c:105
-#: plugins/sudoers/toke_util.c:130 plugins/sudoers/toke_util.c:155
-#: plugins/sudoers/toke_util.c:193 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:143 plugins/sudoers/visudo.c:321
-#: plugins/sudoers/visudo.c:327 plugins/sudoers/visudo.c:433
-#: plugins/sudoers/visudo.c:609 plugins/sudoers/visudo.c:926
-#: plugins/sudoers/visudo.c:999 toke.l:928 toke.l:1057 toke.l:1117
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
+#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
+#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
+#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "kan inte allokera minne"
-#: gram.y:613
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "en kontrollsumma kräver ett sökvägsnamn"
-#: gram.y:643
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "värden för â€CWD†mÃ¥ste börja med ett â€/â€, â€~†eller â€*â€"
-#: gram.y:655
+#: gram.y:651
+msgid "\"CWD\" path too long"
+msgstr "â€CWDâ€-sökväg för lÃ¥ng"
+
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "värden för â€CHROOT†mÃ¥ste börja med ett â€/â€, â€~†eller â€*â€"
-#: gram.y:786
+#: gram.y:667
+msgid "\"CHROOT\" path too long"
+msgstr "â€CHROOTâ€-sökväg för lÃ¥ng"
+
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "syntaxfel, reserverat ord %s använt som ett aliasnamn"
-#: gram.y:809
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "ogiltigt notbefore-värde"
-#: gram.y:818
+#: gram.y:834
msgid "invalid notafter value"
msgstr "ogiltigt notafter-värde"
-#: gram.y:828 plugins/sudoers/policy.c:339
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "tidsgränsvärde för stort"
-#: gram.y:830 plugins/sudoers/policy.c:341
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "ogiltigt värde för tidsgräns"
-#: gram.y:1185
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
+msgid "command too long"
+msgstr "kommandot för långt"
+
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1229
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "Aliaset â€%s†är redan definierat"
-#: gram.y:1650 gram.y:1700 lib/eventlog/eventlog.c:260
-#: lib/eventlog/eventlog.c:733 lib/eventlog/eventlog.c:795
-#: lib/eventlog/eventlog.c:796 lib/eventlog/eventlog.c:1053
-#: lib/iolog/iolog_json.c:125 lib/iolog/iolog_json.c:329
-#: lib/iolog/iolog_json.c:360 lib/iolog/iolog_json.c:503
-#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
-#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
-#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:210 logsrvd/sendlog.c:500 logsrvd/sendlog.c:1343
-#: logsrvd/sendlog.c:1350 logsrvd/sendlog.c:1545 logsrvd/tls_init.c:221
-#: logsrvd/tls_init.c:242 logsrvd/tls_init.c:252 plugins/sudoers/audit.c:115
-#: plugins/sudoers/audit.c:263 plugins/sudoers/auth/pam.c:505
-#: plugins/sudoers/auth/pam.c:692 plugins/sudoers/auth/rfc1938.c:111
-#: plugins/sudoers/check_aliases.c:95 plugins/sudoers/cvtsudoers.c:119
-#: plugins/sudoers/cvtsudoers.c:159 plugins/sudoers/cvtsudoers.c:176
-#: plugins/sudoers/cvtsudoers.c:187 plugins/sudoers/cvtsudoers.c:299
-#: plugins/sudoers/cvtsudoers.c:427 plugins/sudoers/cvtsudoers.c:560
-#: plugins/sudoers/cvtsudoers.c:577 plugins/sudoers/cvtsudoers.c:646
-#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768
-#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1187
-#: plugins/sudoers/cvtsudoers.c:1289 plugins/sudoers/cvtsudoers_json.c:75
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
+#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
+#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
+#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
+#: lib/iolog/iolog_filter.c:232 lib/iolog/iolog_json.c:150
+#: lib/iolog/iolog_json.c:381 lib/iolog/iolog_json.c:412
+#: lib/iolog/iolog_json.c:555 lib/iolog/iolog_legacy.c:100
+#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
+#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
+#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
+#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
+#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
+#: plugins/sudoers/cvtsudoers.c:191 plugins/sudoers/cvtsudoers.c:202
+#: plugins/sudoers/cvtsudoers.c:332 plugins/sudoers/cvtsudoers.c:536
+#: plugins/sudoers/cvtsudoers.c:669 plugins/sudoers/cvtsudoers.c:687
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:869
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:182
+#: plugins/sudoers/cvtsudoers_csv.c:245 plugins/sudoers/cvtsudoers_json.c:75
#: plugins/sudoers/cvtsudoers_ldif.c:150 plugins/sudoers/cvtsudoers_ldif.c:193
#: plugins/sudoers/cvtsudoers_ldif.c:234 plugins/sudoers/cvtsudoers_ldif.c:299
-#: plugins/sudoers/cvtsudoers_ldif.c:370 plugins/sudoers/cvtsudoers_ldif.c:420
-#: plugins/sudoers/cvtsudoers_ldif.c:428 plugins/sudoers/cvtsudoers_ldif.c:439
-#: plugins/sudoers/cvtsudoers_ldif.c:446 plugins/sudoers/cvtsudoers_ldif.c:459
-#: plugins/sudoers/cvtsudoers_ldif.c:467 plugins/sudoers/cvtsudoers_ldif.c:614
-#: plugins/sudoers/defaults.c:638 plugins/sudoers/defaults.c:933
-#: plugins/sudoers/defaults.c:1108 plugins/sudoers/editor.c:187
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/cvtsudoers_ldif.c:375 plugins/sudoers/cvtsudoers_ldif.c:429
+#: plugins/sudoers/cvtsudoers_ldif.c:437 plugins/sudoers/cvtsudoers_ldif.c:448
+#: plugins/sudoers/cvtsudoers_ldif.c:455 plugins/sudoers/cvtsudoers_ldif.c:467
+#: plugins/sudoers/cvtsudoers_ldif.c:480 plugins/sudoers/cvtsudoers_ldif.c:488
+#: plugins/sudoers/cvtsudoers_ldif.c:635 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:51
+#: plugins/sudoers/cvtsudoers_merge.c:353
+#: plugins/sudoers/cvtsudoers_merge.c:399
+#: plugins/sudoers/cvtsudoers_merge.c:445
+#: plugins/sudoers/cvtsudoers_merge.c:466
+#: plugins/sudoers/cvtsudoers_merge.c:553
+#: plugins/sudoers/cvtsudoers_merge.c:561
+#: plugins/sudoers/cvtsudoers_merge.c:564
+#: plugins/sudoers/cvtsudoers_merge.c:630
+#: plugins/sudoers/cvtsudoers_merge.c:633
+#: plugins/sudoers/cvtsudoers_merge.c:1157
+#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:609
-#: plugins/sudoers/iolog.c:626 plugins/sudoers/ldap.c:184
-#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432
-#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441
-#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744
-#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281
-#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746
-#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962
-#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079
-#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249
-#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337
-#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456
-#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586
-#: plugins/sudoers/ldap_conf.c:677 plugins/sudoers/ldap_conf.c:760
-#: plugins/sudoers/ldap_util.c:325 plugins/sudoers/ldap_util.c:332
-#: plugins/sudoers/ldap_util.c:648 plugins/sudoers/linux_audit.c:86
-#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:214
-#: plugins/sudoers/log_client.c:235 plugins/sudoers/log_client.c:248
-#: plugins/sudoers/log_client.c:381 plugins/sudoers/log_client.c:686
-#: plugins/sudoers/log_client.c:704 plugins/sudoers/log_client.c:1413
-#: plugins/sudoers/log_client.c:1626 plugins/sudoers/log_client.c:1950
-#: plugins/sudoers/log_client.c:2007 plugins/sudoers/logging.c:100
-#: plugins/sudoers/logging.c:165 plugins/sudoers/logging.c:166
-#: plugins/sudoers/logging.c:425 plugins/sudoers/logging.c:445
-#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:285
-#: plugins/sudoers/match_command.c:483 plugins/sudoers/match_command.c:532
-#: plugins/sudoers/match_command.c:604 plugins/sudoers/match_command.c:649
-#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198
-#: plugins/sudoers/parse.c:215 plugins/sudoers/parse.c:235
-#: plugins/sudoers/parse.c:252 plugins/sudoers/parse.c:275
-#: plugins/sudoers/parse.c:286 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264
-#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351
-#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395
-#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411
-#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:483
-#: plugins/sudoers/parse_ldif.c:596 plugins/sudoers/parse_ldif.c:625
-#: plugins/sudoers/parse_ldif.c:650 plugins/sudoers/parse_ldif.c:708
-#: plugins/sudoers/parse_ldif.c:725 plugins/sudoers/parse_ldif.c:753
-#: plugins/sudoers/parse_ldif.c:760 plugins/sudoers/policy.c:149
-#: plugins/sudoers/policy.c:158 plugins/sudoers/policy.c:167
-#: plugins/sudoers/policy.c:193 plugins/sudoers/policy.c:324
-#: plugins/sudoers/policy.c:339 plugins/sudoers/policy.c:341
-#: plugins/sudoers/policy.c:371 plugins/sudoers/policy.c:380
-#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:438
-#: plugins/sudoers/policy.c:447 plugins/sudoers/policy.c:456
-#: plugins/sudoers/policy.c:543 plugins/sudoers/policy.c:890
-#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:195
-#: plugins/sudoers/pwutil.c:266 plugins/sudoers/pwutil.c:344
-#: plugins/sudoers/pwutil.c:518 plugins/sudoers/pwutil.c:583
-#: plugins/sudoers/pwutil.c:655 plugins/sudoers/pwutil.c:853
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:953
-#: plugins/sudoers/pwutil.c:1010 plugins/sudoers/set_perms.c:359
-#: plugins/sudoers/set_perms.c:698 plugins/sudoers/set_perms.c:1061
-#: plugins/sudoers/set_perms.c:1364 plugins/sudoers/set_perms.c:1529
-#: plugins/sudoers/sssd.c:144 plugins/sudoers/sssd.c:407
-#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514
-#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754
-#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:111
-#: plugins/sudoers/stubs.c:119 plugins/sudoers/sudoers.c:299
-#: plugins/sudoers/sudoers.c:325 plugins/sudoers/sudoers.c:374
-#: plugins/sudoers/sudoers.c:384 plugins/sudoers/sudoers.c:425
-#: plugins/sudoers/sudoers.c:787 plugins/sudoers/sudoers.c:922
-#: plugins/sudoers/sudoers.c:975 plugins/sudoers/sudoers.c:1241
-#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555
-#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469
-#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
+#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
+#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
+#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
+#: plugins/sudoers/ldap.c:755 plugins/sudoers/ldap.c:919
+#: plugins/sudoers/ldap.c:1335 plugins/sudoers/ldap.c:1761
+#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
+#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
+#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
+#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/set_perms.c:363
+#: plugins/sudoers/set_perms.c:706 plugins/sudoers/set_perms.c:1073
+#: plugins/sudoers/set_perms.c:1380 plugins/sudoers/set_perms.c:1549
+#: plugins/sudoers/sssd.c:144 plugins/sudoers/sssd.c:185
+#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
+#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
+#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
-#: plugins/sudoers/testsudoers.c:580 plugins/sudoers/timestamp.c:424
-#: plugins/sudoers/timestamp.c:468 plugins/sudoers/timestamp.c:980
-#: plugins/sudoers/timestamp.c:1118 plugins/sudoers/toke_util.c:77
-#: plugins/sudoers/toke_util.c:105 plugins/sudoers/toke_util.c:130
-#: plugins/sudoers/toke_util.c:154 plugins/sudoers/toke_util.c:193
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:143
-#: plugins/sudoers/visudo.c:321 plugins/sudoers/visudo.c:327
-#: plugins/sudoers/visudo.c:433 plugins/sudoers/visudo.c:609
-#: plugins/sudoers/visudo.c:926 plugins/sudoers/visudo.c:999 toke.l:928
-#: toke.l:1057 toke.l:1109 toke.l:1117
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
-#: lib/eventlog/eventlog.c:265 lib/iolog/iolog_json.c:509
-#: lib/iolog/iolog_json.c:512 lib/iolog/iolog_json.c:514
+#: lib/eventlog/eventlog.c:314 lib/iolog/iolog_json.c:562
+#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
+#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:571 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
-#: plugins/sudoers/iolog.c:631 plugins/sudoers/ldap.c:517
-#: plugins/sudoers/ldap.c:748 plugins/sudoers/ldap.c:1081
-#: plugins/sudoers/ldap_conf.c:222 plugins/sudoers/ldap_conf.c:312
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/policy.c:573
-#: plugins/sudoers/policy.c:728 plugins/sudoers/policy.c:738
-#: plugins/sudoers/prompt.c:161 plugins/sudoers/strvec_join.c:62
-#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:206
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
+#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
+#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
+#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
+#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
+#: toke.l:987 toke.l:1189
#, c-format
msgid "internal error, %s overflow"
msgstr "internt fel, %s spill"
-#: lib/eventlog/eventlog.c:324
+#: lib/eventlog/eventlog.c:373
#, c-format
msgid "unable to dup stdin: %m"
msgstr "kan inte duplicera stdin: %m"
-#: lib/eventlog/eventlog.c:366
+#: lib/eventlog/eventlog.c:415
#, c-format
msgid "unable to execute %s: %m"
msgstr "kan inte köra %s: %m"
-#: lib/eventlog/eventlog.c:407 plugins/sudoers/auth/aix_auth.c:198
+#: lib/eventlog/eventlog.c:463 plugins/sudoers/auth/aix_auth.c:198
msgid "unable to fork"
msgstr "kan inte grena process"
-#: lib/eventlog/eventlog.c:415 lib/eventlog/eventlog.c:469
+#: lib/eventlog/eventlog.c:473 lib/eventlog/eventlog.c:538
#, c-format
msgid "unable to fork: %m"
msgstr "kan inte grena process: %m"
-#: lib/eventlog/eventlog.c:459
+#: lib/eventlog/eventlog.c:528
#, c-format
msgid "unable to open pipe: %m"
msgstr "kan inte öppna rör: %m"
-#: lib/eventlog/eventlog.c:882
+#: lib/eventlog/eventlog.c:1030
#, c-format
msgid "%8s : %s"
msgstr "%8s : %s"
-#: lib/eventlog/eventlog.c:911
+#: lib/eventlog/eventlog.c:1059
#, c-format
msgid "%8s : (command continued) %s"
msgstr "%8s : (kommando fortsätter) %s"
-#: lib/iolog/iolog_json.c:115
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
+#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
+#, c-format
+msgid "invalid regular expression \"%s\": %s"
+msgstr "ogiltigt reguljärt uttryck â€%sâ€: %s"
+
+#: lib/iolog/iolog_json.c:140
#, c-format
msgid "expected JSON_STRING, got %d"
msgstr "förväntade JSON_STRING, fick %d"
-#: lib/iolog/iolog_json.c:120
+#: lib/iolog/iolog_json.c:145
msgid "JSON_ARRAY too large"
msgstr "JSON_ARRAY för stor"
-#: lib/iolog/iolog_json.c:352
+#: lib/iolog/iolog_json.c:404
msgid "missing double quote in name"
msgstr "saknar citationstecken i namn"
-#: lib/iolog/iolog_json.c:449
+#: lib/iolog/iolog_json.c:501
msgid "missing JSON_OBJECT"
msgstr "saknar JSON_OBJECT"
-#: lib/iolog/iolog_json.c:453
+#: lib/iolog/iolog_json.c:505
#, c-format
msgid "expected JSON_OBJECT, got %d"
msgstr "förväntade JSON_OBJECT, fick %d"
-#: lib/iolog/iolog_json.c:599
+#: lib/iolog/iolog_json.c:661
#, c-format
msgid "json stack exhausted (max %u frames)"
msgstr "json-stack utarmad (max %u ramar)"
-#: lib/iolog/iolog_json.c:673
+#: lib/iolog/iolog_json.c:735
msgid "objects must consist of name:value pairs"
msgstr "objekt måste bestå av namn:värde-par"
-#: lib/iolog/iolog_json.c:678 lib/iolog/iolog_json.c:709
-#: lib/iolog/iolog_json.c:753 lib/iolog/iolog_json.c:775
-#: lib/iolog/iolog_json.c:797 lib/iolog/iolog_json.c:819
-#: lib/iolog/iolog_json.c:841
+#: lib/iolog/iolog_json.c:740 lib/iolog/iolog_json.c:771
+#: lib/iolog/iolog_json.c:815 lib/iolog/iolog_json.c:837
+#: lib/iolog/iolog_json.c:859 lib/iolog/iolog_json.c:881
+#: lib/iolog/iolog_json.c:903
msgid "missing separator between values"
msgstr "saknar separator mellan värden"
-#: lib/iolog/iolog_json.c:693 lib/iolog/iolog_json.c:867
+#: lib/iolog/iolog_json.c:755 lib/iolog/iolog_json.c:929
msgid "unmatched close brace"
msgstr "omatchad avslutningsklammerparentes"
-#: lib/iolog/iolog_json.c:704
+#: lib/iolog/iolog_json.c:766
msgid "unexpected array"
msgstr "oväntad array"
-#: lib/iolog/iolog_json.c:724 lib/iolog/iolog_json.c:870
+#: lib/iolog/iolog_json.c:786 lib/iolog/iolog_json.c:932
msgid "unmatched close bracket"
msgstr "omatchad avslutningsklammer"
-#: lib/iolog/iolog_json.c:735
+#: lib/iolog/iolog_json.c:797
msgid "unexpected string"
msgstr "oväntad sträng"
-#: lib/iolog/iolog_json.c:746
+#: lib/iolog/iolog_json.c:808
msgid "missing colon after name"
msgstr "saknar kolon efter namn"
-#: lib/iolog/iolog_json.c:767 lib/iolog/iolog_json.c:789
+#: lib/iolog/iolog_json.c:829 lib/iolog/iolog_json.c:851
msgid "unexpected boolean"
msgstr "oväntad boolean"
-#: lib/iolog/iolog_json.c:811
+#: lib/iolog/iolog_json.c:873
msgid "unexpected null"
msgstr "oväntat null"
-#: lib/iolog/iolog_json.c:832
+#: lib/iolog/iolog_json.c:894
msgid "unexpected number"
msgstr "oväntat nummer"
-#: lib/iolog/iolog_json.c:879
+#: lib/iolog/iolog_json.c:941
msgid "parse error"
msgstr "tolkningsfel"
@@ -475,513 +598,794 @@ msgstr "%s: runas-gruppfältet saknas"
msgid "%s exists but is not a directory (0%o)"
msgstr "%s finns men är inte en katalog (0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:72
-#: plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "kan inte skapa katalogen %s"
-#: lib/iolog/iolog_mkdtemp.c:76 plugins/sudoers/visudo.c:726
-#: plugins/sudoers/visudo.c:737
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "kan inte ändra läge för %s till 0%o"
-#: lib/iolog/iolog_timing.c:255
+#: lib/iolog/iolog_timing.c:261
#, c-format
msgid "error reading timing file: %s"
msgstr "fel vid inläsning av tidsmätningsfil: %s"
-#: lib/iolog/iolog_timing.c:262
+#: lib/iolog/iolog_timing.c:268
#, c-format
msgid "invalid timing file line: %s"
msgstr "ogiltig rad i tidsmätningsfil: %s"
-#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106
-#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s: protokollfel: NULL-nyckel"
+
+#: logsrvd/iolog_writer.c:69
+#, c-format
+msgid "%s: protocol error: wrong type for %s"
+msgstr "%s: protokollfel: fel typ för %s"
+
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s: protokollfel: NULL-värde hittat i %s"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "kan inte generera UUID"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
+#, c-format
+msgid "%s: protocol error: %s missing from AcceptMessage"
+msgstr "%s: protokollfel: %s saknas i AcceptMessage"
+
+#: logsrvd/iolog_writer.c:417
+#, c-format
+msgid "%s: unable to format session id"
+msgstr "%s: kan inte formattera sessions-id"
+
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
+#, c-format
+msgid "%s: %s is not set"
+msgstr "%s: %s: är inte satt"
+
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
+#, c-format
+msgid "unable to expand iolog path %s"
+msgstr "kan inte öppna iolog-sökväg %s"
+
+#: logsrvd/iolog_writer.c:563
+#, c-format
+msgid "unable to create iolog path %s"
+msgstr "kan inte skapa iolog-sökväg %s"
+
+#: logsrvd/iolog_writer.c:593
+#, c-format
+msgid "invalid iofd %d"
+msgstr "ogiltig iofd %d"
+
+#: logsrvd/iolog_writer.c:613
+#, c-format
+msgid "error closing iofd %d: %s"
+msgstr "fel vid stängning av iofd %d: %s"
+
+#: logsrvd/iolog_writer.c:633
+#, c-format
+msgid "error flushing iofd %d: %s"
+msgstr "fel vid tömning av iofd %d: %s"
+
+#: logsrvd/iolog_writer.c:751
+#, c-format
+msgid "invalid I/O log %s: %s referenced but not present"
+msgstr "ogiltig I/O-logg %s: %s refererad men inte närvarande"
+
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
+#, c-format
+msgid "%s: unable to find resume point [%lld, %ld]"
+msgstr "%s: kan inte hitta omstartspunkt [%lld, %ld]"
+
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
+#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
+#, c-format
+msgid "unable to open %s"
+msgstr "kan inte öppna %s"
+
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
+#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "kan inte öppna %s/%s"
-#: logsrvd/logsrv_util.c:133
+#: logsrvd/iolog_writer.c:810
+#, c-format
+msgid "unable to copy %s/%s to %s/%s: %s"
+msgstr "kan inte kopiera %s/%s till %s/%s: %s"
+
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
+#, c-format
+msgid "unable to rename %s to %s"
+msgstr "kan inte byta namn på %s till %s"
+
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
+#, c-format
+msgid "%s/%s: unable to find resume point [%lld, %ld]"
+msgstr "%s/%s: kan inte hitta omstartspunkt [%lld, %ld]"
+
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "saknar I/O-loggfil %s/%s"
-#: logsrvd/logsrv_util.c:140
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: kan inte söka framåt %zu"
-#: logsrvd/logsrv_util.c:150
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
+msgid "unable to connect to relay"
+msgstr "kan inte ansluta till relä"
+
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
+#, c-format
+msgid "server message too large: %zu"
+msgstr "servermeddelande för långt: %zu"
+
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
+#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
+#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
+#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
+#: plugins/sudoers/sudoreplay.c:1043 plugins/sudoers/sudoreplay.c:1050
+#: plugins/sudoers/sudoreplay.c:1057 plugins/sudoers/sudoreplay.c:1184
+msgid "unable to add event to queue"
+msgstr "kan inte lägga till händelse till kö"
+
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
-msgid "unable to find resume point [%lld, %ld] in %s/%s"
-msgstr "kan inte hitta omstartspunkt [%lld, %ld] i %s/%s"
+msgid "unexpected state %d for %s"
+msgstr "oväntat tillstånd %d för %s"
-#: logsrvd/logsrvd.c:434 logsrvd/logsrvd.c:473 logsrvd/logsrvd.c:507
-#: logsrvd/logsrvd.c:557 logsrvd/logsrvd.c:632 logsrvd/logsrvd.c:664
-#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:726 logsrvd/logsrvd_relay.c:511
-#: logsrvd/logsrvd_relay.c:544
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "fel i tillståndsmaskin"
-#: logsrvd/logsrvd.c:443
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "ogiltigt AcceptMessage"
-#: logsrvd/logsrvd.c:482
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "ogiltigt RejectMessage"
-#: logsrvd/logsrvd.c:593
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "ogiltigt ExitMessage"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "ogiltigt RestartMessage"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "ogiltigt AlertMessage"
-#: logsrvd/logsrvd.c:638 logsrvd/logsrvd.c:670 logsrvd/logsrvd.c:702
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
+#, c-format
+msgid "%s: unexpected IoBuffer"
+msgstr "%s: oväntad IoBuffer"
+
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "protokollfel"
-#: logsrvd/logsrvd.c:797
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "ogiltig IoBuffer"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "ogiltig ChangeWindowSize"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "ogiltig CommandSuspend"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
+#, c-format
+msgid "unable to unpack %s size %zu"
+msgstr "kan inte packa upp %s storlek %zu"
+
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
+#, c-format
+msgid "unexpected type_case value %d in %s from %s"
+msgstr "oväntat type_case-värde %d i %s från %s"
+
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "okänd ClientMessage-typ"
-#: logsrvd/logsrvd.c:1082 logsrvd/logsrvd_journal.c:238
+#: logsrvd/logsrvd.c:919
+#, c-format
+msgid "timed out writing to client %s"
+msgstr "tidsgräns passerad vid skrivning till klient %s"
+
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
+#, c-format
+msgid "missing write buffer for client %s"
+msgstr "saknar skrivbuffert för klient %s"
+
+#: logsrvd/logsrvd.c:1020
+#, c-format
+msgid "timed out reading from client %s"
+msgstr "tidsgräns passerad vid läsning från klient %s"
+
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
+#, c-format
+msgid "EOF from %s without proper TLS shutdown"
+msgstr "EOF från %s utan korrekt TLS-nedstängning"
+
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
+#, c-format
+msgid "client message too large: %zu"
+msgstr "klientmeddelande för stort: %zu"
+
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "klientmeddelande för stort"
-#: logsrvd/logsrvd.c:1102
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "ogiltigt ClientMessage"
-#: logsrvd/logsrvd.c:1408
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "kan inte hämta fjärr-IP-adress"
-#: logsrvd/logsrvd.c:1436 logsrvd/tls_client.c:203
-#: plugins/sudoers/log_client.c:263
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "Kan inte fästa användardata på ssl-objektet: %s"
-#: logsrvd/logsrvd.c:1444 logsrvd/logsrvd.c:1570 logsrvd/logsrvd.c:1755
-#: logsrvd/sendlog.c:1146 logsrvd/tls_client.c:138 logsrvd/tls_client.c:154
-#: logsrvd/tls_client.c:216 plugins/sudoers/iolog.c:969
-#: plugins/sudoers/iolog.c:1102 plugins/sudoers/iolog.c:1200
-#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324
-#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386
-#: plugins/sudoers/log_client.c:585 plugins/sudoers/log_client.c:592
-#: plugins/sudoers/log_client.c:1109 plugins/sudoers/log_client.c:1382
-#: plugins/sudoers/log_client.c:1423 plugins/sudoers/log_client.c:1431
-#: plugins/sudoers/log_client.c:1582 plugins/sudoers/log_client.c:1698
-#: plugins/sudoers/log_client.c:2015 plugins/sudoers/log_client.c:2023
-#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559
-#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903
-#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008
-#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022
-#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
-#: plugins/sudoers/sudoreplay.c:1163
-msgid "unable to add event to queue"
-msgstr "kan inte lägga till händelse till kö"
-
-#: logsrvd/logsrvd.c:1620 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "det går inte att ställa in lyssningsuttag"
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1756
+#, c-format
+msgid "unexpected signal %d"
+msgstr "oväntad signal %d"
+
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "sudo-loggserver"
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:122
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "Alternativ:"
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "sökväg till konfigurationsfil"
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:124
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "visa hjälpmeddelande och avsluta"
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "grena inte, kör i förgrunden"
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "procents chans att anslutningar slängs"
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:152
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "visa versionsinformation och avsluta"
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1518
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Protobuf-C version 1.3 eller högre krävs"
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "ogiltigt slumpmässigt avbrottsvärde: %s"
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1568
-#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299
-#: plugins/sudoers/visudo.c:175
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
+#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s version %s\n"
-#: logsrvd/logsrvd_conf.c:446
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
+#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/testsudoers.c:382
+#, c-format
+msgid "unknown user %s"
+msgstr "okänd användare %s"
+
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
+#: plugins/sudoers/testsudoers.c:406
+#, c-format
+msgid "unknown group %s"
+msgstr "okänd grupp %s"
+
+#: logsrvd/logsrvd_conf.c:457
+#, c-format
+msgid "unable to parse iolog mode %s"
+msgstr "kan inte tolka iolog-läge %s"
+
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "ogiltigt värde för %s: %s"
+
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "TLS stöds inte"
-#: logsrvd/logsrvd_conf.c:468
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:541 logsrvd/logsrvd_conf.c:876
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s: inte fullständigt kvalificerad sökväg"
-#: logsrvd/logsrvd_conf.c:1035
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
+#, c-format
+msgid "unknown syslog facility %s"
+msgstr "okänd syslog-funktionalitet: %s"
+
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
+#, c-format
+msgid "unknown syslog priority %s"
+msgstr "okänd syslog-prioritet: %s"
+
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s:%d omatchad â€[â€: %s"
-#: logsrvd/logsrvd_conf.c:1046
+#: logsrvd/logsrvd_conf.c:1203
+#, c-format
+msgid "%s:%d garbage after ']': %s"
+msgstr "%s:%d skräp eft â€]â€: %s"
+
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s:%d ogiltigt konfigurationsavsnitt: %s"
-#: logsrvd/logsrvd_conf.c:1054
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s:%d ogiltig konfigurationsrad: %s"
-#: logsrvd/logsrvd_conf.c:1060
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d avsnittsnamn förväntades: %s"
-#: logsrvd/logsrvd_conf.c:1074
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
-msgid "invalid value for %s: %s"
-msgstr "ogiltigt värde för %s: %s"
+msgid "%s:%d [%s] illegal key: %s"
+msgstr "%s:%d [%s] ogiltig nyckel: %s"
-#: logsrvd/logsrvd_conf.c:1082
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
-msgid "%s:%d unknown key: %s"
-msgstr "%s:%d okänd nyckel: %s"
+msgid "unable to open log file %s"
+msgstr "kan inte öppna loggfil %s"
-#: logsrvd/logsrvd_conf.c:1294
-#, c-format
-msgid "unknown syslog facility %s"
-msgstr "okänd syslog-funktionalitet: %s"
-
-#: logsrvd/logsrvd_conf.c:1298 logsrvd/logsrvd_conf.c:1302
-#: logsrvd/logsrvd_conf.c:1306
-#, c-format
-msgid "unknown syslog priority %s"
-msgstr "okänd syslog-prioritet: %s"
-
-#: logsrvd/logsrvd_conf.c:1374
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "kan inte initiera TLS-serverkontext"
-#: logsrvd/logsrvd_conf.c:1394
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "kan inte initiera TLS-reläkontext"
-#: logsrvd/logsrvd_journal.c:126 logsrvd/logsrvd_journal.c:367
-#: logsrvd/logsrvd_journal.c:373
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "kan inte skapa journalfil"
-#: logsrvd/logsrvd_journal.c:134
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
+#, c-format
+msgid "unable to lock %s"
+msgstr "kan inte låsa %s"
+
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "kan inte låsa journalfil"
-#: logsrvd/logsrvd_journal.c:163 logsrvd/logsrvd_journal.c:406
-#: logsrvd/logsrvd_journal.c:411
+#: logsrvd/logsrvd_journal.c:161
+msgid "unable to open journal file"
+msgstr "kan inte öppna journalfil"
+
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "kan inte skriva journalfil"
-#: logsrvd/logsrvd_journal.c:171 logsrvd/logsrvd_journal.c:178
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "kan inte byta namn på journalfil"
-#: logsrvd/logsrvd_journal.c:228 logsrvd/logsrvd_journal.c:258
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "oväntat filslut vid läsning av journalfil"
-#: logsrvd/logsrvd_journal.c:230 logsrvd/logsrvd_journal.c:260
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "fel vid inläsning av journalfil"
-#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:325
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "ogiltig journalfil, kunde inte starta om"
-#: logsrvd/logsrvd_local.c:149
+#: logsrvd/logsrvd_journal.c:440
+#, c-format
+msgid "unable to seek to [%lld, %ld] in journal file %s"
+msgstr "kan inte söka till [%lld, %ld] i journalfil %s"
+
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "oväntat value_case %d i %s från %s"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "fel vid tolkning av AcceptMessage"
-#: logsrvd/logsrvd_local.c:156
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "fel vid skapande av I/O-logg"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "fel vid loggning av acceptanshändelse"
-#: logsrvd/logsrvd_local.c:196
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "fel vid tolkning av RejectMessage"
-#: logsrvd/logsrvd_local.c:202
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "fel vid loggning av avböjningshändelse"
-#: logsrvd/logsrvd_local.c:276
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
+msgid "error logging exit event"
+msgstr "fel vid loggning av avslutningshändelse"
+
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "logg är redan komplett, kan inte startas om"
-#: logsrvd/logsrvd_local.c:307
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "kan inte starta om logg"
-#: logsrvd/logsrvd_local.c:322
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "fel vid tolkning av AlertMessage"
-#: logsrvd/logsrvd_local.c:330
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "fel vid loggning av alarmhändelse"
-#: logsrvd/logsrvd_local.c:397
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
+#, c-format
+msgid "unable to format timing buffer, length %d"
+msgstr "kan inte formatera tidsbuffert, längd %d"
+
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
+#: plugins/sudoers/sudoreplay.c:351
+#, c-format
+msgid "%s/%s: %s"
+msgstr "%s/%s: %s"
+
+#: logsrvd/logsrvd_local.c:618
+msgid "randomly dropping connection"
+msgstr "släpper slumpmässigt anslutningen"
+
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "fel vid skrivning av IoBuffer"
-#: logsrvd/logsrvd_local.c:434
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "fel vid skrivning av ChangeWindowSize"
-#: logsrvd/logsrvd_local.c:474
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "fel vid skrivning av CommandSuspend"
-#: logsrvd/logsrvd_relay.c:434
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "TLS-handskakning med relävärd misslyckades"
-#: logsrvd/logsrvd_relay.c:462
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "kan inte ansluta till relävärd"
-#: logsrvd/logsrvd_relay.c:519 logsrvd/sendlog.c:951
-#: plugins/sudoers/log_client.c:1466
+#: logsrvd/logsrvd_relay.c:518
+#, c-format
+msgid "%s: invalid ServerHello, missing server_id"
+msgstr "%s: ogiltigt ServerHello, saknar server_id"
+
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "ogiltigt ServerHello"
-#: logsrvd/logsrvd_relay.c:677
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "okänd ServerMessage-typ"
-#: logsrvd/logsrvd_relay.c:709
+#: logsrvd/logsrvd_relay.c:708
+#, c-format
+msgid "timed out reading from relay %s (%s)"
+msgstr "tidsgräns passerad vid läsning från relä %s (%s)"
+
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "tidsgräns passerad vid läsning från relä"
-#: logsrvd/logsrvd_relay.c:761
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "relävärdnamnet matchar inte certifikatet"
-#: logsrvd/logsrvd_relay.c:765 logsrvd/logsrvd_relay.c:786
-#: logsrvd/logsrvd_relay.c:794
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "fel vid läsning från relä"
-#: logsrvd/logsrvd_relay.c:817
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "kan inte läsa från relä"
-#: logsrvd/logsrvd_relay.c:831 logsrvd/logsrvd_relay.c:951
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "reläserver stängde anslutningen"
-#: logsrvd/logsrvd_relay.c:850
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "servermeddelandet för stort"
-#: logsrvd/logsrvd_relay.c:915
+#: logsrvd/logsrvd_relay.c:907
+#, c-format
+msgid "timed out writing to relay %s (%s)"
+msgstr "tidsgräns passerad vid skrivning till relä %s (%s)"
+
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "tidsgräns passerad vid skrivning till relä"
-#: logsrvd/logsrvd_relay.c:973 logsrvd/logsrvd_relay.c:981
-#: logsrvd/logsrvd_relay.c:993
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "fel vid skrivning till relä"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "skicka sudo I/O-logg till fjärrserver"
-#: logsrvd/sendlog.c:126
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "skicka endast en accepteringshändelse (ingen I/O)"
-#: logsrvd/sendlog.c:129
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "certifikatbuntfil för att verifiera serverns certifikat mot"
-#: logsrvd/sendlog.c:131
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "certifikatfil för TLS-handskakning"
-#: logsrvd/sendlog.c:134
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "värd att skicka loggar till"
-#: logsrvd/sendlog.c:136
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "fjärr-ID för I/O-logg som ska återupptas"
-#: logsrvd/sendlog.c:139
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "privat nyckelfil"
-#: logsrvd/sendlog.c:141
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "verifiera inte servercertifikat"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "port som ska användas när du ansluter till värd"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "starta om tidigare I/O-loggöverföring"
-#: logsrvd/sendlog.c:148
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "avvisa kommandot med angiven anledning"
-#: logsrvd/sendlog.c:150
+#: logsrvd/sendlog.c:149
+msgid "stop transfer after reaching this time"
+msgstr "stoppa överföring efter att ha nått denna tid"
+
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "testa granskningsservern genom att skicka utvalda I/O-loggar n gånger parallellt"
-#: logsrvd/sendlog.c:175 plugins/sudoers/log_client.c:432
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "kan inte slå upp %s:%s: %s"
-#: logsrvd/sendlog.c:213
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "kan inte hämta server-IP-adress"
-#: logsrvd/sendlog.c:267 plugins/sudoers/sudoreplay.c:851
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "kan inte läsa %s/%s: %s"
-#: logsrvd/sendlog.c:288 plugins/sudoers/log_client.c:692
-#, c-format
-msgid "client message too large: %zu"
-msgstr "klientmeddelande för stort: %zu"
-
-#: logsrvd/sendlog.c:830
-#, c-format
-msgid "%s: write buffer already in use"
-msgstr "%s: skrivbuffert används redan"
-
-#: logsrvd/sendlog.c:882 plugins/sudoers/iolog.c:893
-#: plugins/sudoers/iolog.c:962
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "oväntad I/O-händelse %d"
-#: logsrvd/sendlog.c:928 logsrvd/sendlog.c:945 logsrvd/sendlog.c:979
-#: plugins/sudoers/log_client.c:1124 plugins/sudoers/log_client.c:1392
-#: plugins/sudoers/log_client.c:1460 plugins/sudoers/log_client.c:1496
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: oväntat tillstånd %d"
-#: logsrvd/sendlog.c:1015 plugins/sudoers/log_client.c:1540
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "felmeddelande mottaget från server: %s"
-#: logsrvd/sendlog.c:1028 plugins/sudoers/log_client.c:1553
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "avbrottsmeddelande mottaget från server: %s"
-#: logsrvd/sendlog.c:1047 plugins/sudoers/log_client.c:1572
-msgid "unable to unpack ServerMessage"
-msgstr "kan inte packa upp ServerMessage"
-
-#: logsrvd/sendlog.c:1087 plugins/sudoers/log_client.c:1603
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: oväntat type_case-värde %d"
-#: logsrvd/sendlog.c:1116
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "tidsgräns passerad vid läsning från server"
-#: logsrvd/sendlog.c:1195
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
+msgid "host name does not match certificate"
+msgstr "värdnamn matchar inte certifikat"
+
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "oväntad EOF"
-#: logsrvd/sendlog.c:1208 plugins/sudoers/log_client.c:1761
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "servermeddelande för långt: %u"
-#: logsrvd/sendlog.c:1259
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "tidsgräns passerad vid skrivning till server"
-#: logsrvd/sendlog.c:1591
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "både omstartspunkt och iolog-ID måste anges"
-#: logsrvd/sendlog.c:1595
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "en omstartspunkt får inte sättas när ingen I/O skickas"
-#: logsrvd/sendlog.c:1671
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "avslutade oväntat i tillstånd %d"
-#: logsrvd/sendlog.c:1672
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "förfluten tid skickad till server [%lld, %ld]"
-#: logsrvd/sendlog.c:1674
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "incheckningspunkt mottagen från server [%lld, %ld]"
-#: logsrvd/tls_client.c:113 plugins/sudoers/log_client.c:296
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "Tidsgräns för TLS-handskakning uppnådd"
-#: logsrvd/tls_client.c:133 logsrvd/tls_client.c:149
-#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "kan inte ställa in händelse"
-#: logsrvd/tls_client.c:159 logsrvd/tls_client.c:163
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "TLS-anslutning misslyckades: %s"
-#: logsrvd/tls_client.c:197
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "kan inte allokera ssl-objekt: %s"
@@ -995,97 +1399,84 @@ msgstr "Kan inte fästa kontakt på ssl-objektet: %s"
msgid "unable to initialize TLS context"
msgstr "kan inte initiera TLS-kontext"
-#: logsrvd/tls_init.c:129 logsrvd/tls_init.c:137
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "kan inte ställa in TLS 1.2-krypteringssvit till %s: %s"
-#: logsrvd/tls_init.c:157 logsrvd/tls_init.c:165
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "kan inte ställa in TLS 1.3-krypteringssvit till %s: %s"
-#: logsrvd/tls_init.c:200
-#, c-format
-msgid "unable to create TLS context: %s"
-msgstr "kan inte skapa TLS-kontext: %s"
-
-#: logsrvd/tls_init.c:206
-#, c-format
-msgid "unable to set minimum protocol version to TLS 1.2: %s"
-msgstr "kunde inte sätta minsta protokollversion till TLS 1.2: %s"
-
-#: logsrvd/tls_init.c:282
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "kunde inte sätta diffie-hellman-parametrar: %s"
-#: logsrvd/tls_init.c:291
+#: logsrvd/tls_init.c:283
#, c-format
-msgid "unable to read diffie-hellman parameters: %s"
-msgstr "kunde inte läsa diffie-hellman-parametrar: %s"
+msgid "unable to create TLS context: %s"
+msgstr "kan inte skapa TLS-kontext: %s"
-#: logsrvd/tls_init.c:296 plugins/sudoers/check.c:274
-#: plugins/sudoers/cvtsudoers.c:618 plugins/sudoers/cvtsudoers.c:639
-#: plugins/sudoers/cvtsudoers.c:1249 plugins/sudoers/cvtsudoers_json.c:872
-#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1028
-#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:913
+#: logsrvd/tls_init.c:290
#, c-format
-msgid "unable to open %s"
-msgstr "kan inte öppna %s"
+msgid "unable to set minimum protocol version to TLS 1.2: %s"
+msgstr "kunde inte sätta minsta protokollversion till TLS 1.2: %s"
-#: plugins/sudoers/audit.c:259 plugins/sudoers/audit.c:398
-#: plugins/sudoers/log_client.c:960 plugins/sudoers/log_client.c:1008
-#: plugins/sudoers/log_client.c:1056 plugins/sudoers/log_client.c:1181
-#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:120
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "kan inte hämta tid på dagen"
-#: plugins/sudoers/auth/aix_auth.c:277
+#: plugins/sudoers/auth/aix_auth.c:280
#, c-format
msgid "unable to change password for %s"
msgstr "kan inte ändra lösenord för %s"
-#: plugins/sudoers/auth/bsdauth.c:70
+#: plugins/sudoers/auth/bsdauth.c:74
#, c-format
msgid "unable to get login class for user %s"
msgstr "kan inte hämta inloggningsklass för användaren %s"
-#: plugins/sudoers/auth/bsdauth.c:75
+#: plugins/sudoers/auth/bsdauth.c:79
msgid "unable to begin bsd authentication"
msgstr "kan inte påbörja bsd-autentisering"
-#: plugins/sudoers/auth/bsdauth.c:83
+#: plugins/sudoers/auth/bsdauth.c:87
msgid "invalid authentication type"
msgstr "ogiltig autentiseringstyp"
-#: plugins/sudoers/auth/bsdauth.c:92
+#: plugins/sudoers/auth/bsdauth.c:96
msgid "unable to initialize BSD authentication"
msgstr "kan inte initiera BSD-autentisering"
-#: plugins/sudoers/auth/bsdauth.c:179
+#: plugins/sudoers/auth/bsdauth.c:186
msgid "your account has expired"
msgstr "ditt konto har gått ut"
-#: plugins/sudoers/auth/bsdauth.c:181
+#: plugins/sudoers/auth/bsdauth.c:188
msgid "approval failed"
msgstr "godkännande misslyckades"
-#: plugins/sudoers/auth/fwtk.c:54
+#: plugins/sudoers/auth/fwtk.c:61
msgid "unable to read fwtk config"
msgstr "kan inte läsa fwtk-konfiguration"
-#: plugins/sudoers/auth/fwtk.c:59
+#: plugins/sudoers/auth/fwtk.c:66
msgid "unable to connect to authentication server"
msgstr "kan inte ansluta till autentiseringsservern"
-#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89
-#: plugins/sudoers/auth/fwtk.c:121
+#: plugins/sudoers/auth/fwtk.c:72 plugins/sudoers/auth/fwtk.c:97
+#: plugins/sudoers/auth/fwtk.c:129
msgid "lost connection to authentication server"
msgstr "förlorade kontakten med autentiseringsservern"
-#: plugins/sudoers/auth/fwtk.c:69
+#: plugins/sudoers/auth/fwtk.c:76
#, c-format
msgid ""
"authentication server error:\n"
@@ -1094,149 +1485,149 @@ msgstr ""
"fel i autentiseringsservern:\n"
"%s"
-#: plugins/sudoers/auth/kerb5.c:110
+#: plugins/sudoers/auth/kerb5.c:115
#, c-format
msgid "%s: unable to convert principal to string ('%s'): %s"
msgstr "%s: kan inte konvertera principal till sträng (â€%sâ€): %s"
-#: plugins/sudoers/auth/kerb5.c:160
+#: plugins/sudoers/auth/kerb5.c:164
#, c-format
msgid "%s: unable to parse '%s': %s"
msgstr "%s: kan inte tolka â€%sâ€: %s"
-#: plugins/sudoers/auth/kerb5.c:169
+#: plugins/sudoers/auth/kerb5.c:173
#, c-format
msgid "%s: unable to resolve credential cache: %s"
msgstr "%s: kan inte slå upp inloggningsuppgiftscache: %s"
-#: plugins/sudoers/auth/kerb5.c:216
+#: plugins/sudoers/auth/kerb5.c:222
#, c-format
msgid "%s: unable to allocate options: %s"
msgstr "%s: kan inte allokera flaggor: %s"
-#: plugins/sudoers/auth/kerb5.c:231
+#: plugins/sudoers/auth/kerb5.c:237
#, c-format
msgid "%s: unable to get credentials: %s"
msgstr "%s: kan inte hämta inloggningsuppgifter: %s"
-#: plugins/sudoers/auth/kerb5.c:244
+#: plugins/sudoers/auth/kerb5.c:250
#, c-format
msgid "%s: unable to initialize credential cache: %s"
msgstr "%s: kan inte initiera inloggningsuppgiftscache: %s"
-#: plugins/sudoers/auth/kerb5.c:247
+#: plugins/sudoers/auth/kerb5.c:253
#, c-format
msgid "%s: unable to store credential in cache: %s"
msgstr "%s: kan inte lagra inloggningsuppgifter i cache: %s"
-#: plugins/sudoers/auth/kerb5.c:311
+#: plugins/sudoers/auth/kerb5.c:317
#, 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:325
+#: plugins/sudoers/auth/kerb5.c:331
#, 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:218
+#: plugins/sudoers/auth/pam.c:224
#, c-format
msgid "unable to initialize PAM: %s"
msgstr "kan inte initiera PAM: %s"
-#: plugins/sudoers/auth/pam.c:340
+#: plugins/sudoers/auth/pam.c:337
#, c-format
msgid "PAM authentication error: %s"
msgstr "PAM-autentiseringsfel: %s"
-#: plugins/sudoers/auth/pam.c:359
+#: plugins/sudoers/auth/pam.c:356
msgid "account validation failure, is your account locked?"
msgstr "kontovalidering misslyckades. Är ditt konto låst?"
-#: plugins/sudoers/auth/pam.c:370
+#: plugins/sudoers/auth/pam.c:367
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:376
+#: plugins/sudoers/auth/pam.c:373
#, c-format
msgid "unable to change expired password: %s"
msgstr "kan inte ändra utgånget lösenord: %s"
-#: plugins/sudoers/auth/pam.c:387
+#: plugins/sudoers/auth/pam.c:384
msgid "Password expired, contact your system administrator"
msgstr "Lösenordet har gått ut. Kontakta din systemadministratör"
-#: plugins/sudoers/auth/pam.c:392
+#: plugins/sudoers/auth/pam.c:389
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:400 plugins/sudoers/auth/pam.c:405
+#: plugins/sudoers/auth/pam.c:397 plugins/sudoers/auth/pam.c:402
#, c-format
msgid "PAM account management error: %s"
msgstr "Fel vid hantering av PAM-konto: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:241
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "du finns inte i %s-databasen"
-#: plugins/sudoers/auth/securid5.c:72
+#: plugins/sudoers/auth/securid5.c:75
msgid "failed to initialise the ACE API library"
msgstr "misslyckades med att initiera ACE API-biblioteket"
-#: plugins/sudoers/auth/securid5.c:98
+#: plugins/sudoers/auth/securid5.c:106
msgid "unable to contact the SecurID server"
msgstr "kan inte kontakta SecurID-servern"
-#: plugins/sudoers/auth/securid5.c:107
+#: plugins/sudoers/auth/securid5.c:115
msgid "User ID locked for SecurID Authentication"
msgstr "Användar-ID låst för SecurID-autentisering"
-#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162
+#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:170
msgid "invalid username length for SecurID"
msgstr "ogiltig längd för användarnamn för SecurID"
-#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167
+#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:175
msgid "invalid Authentication Handle for SecurID"
msgstr "ogiltigt autentiseringshandtag för SecurID"
-#: plugins/sudoers/auth/securid5.c:119
+#: plugins/sudoers/auth/securid5.c:127
msgid "SecurID communication failed"
msgstr "SecurID-kommunikation misslyckades"
-#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210
+#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:218
msgid "unknown SecurID error"
msgstr "okänt SecurID-fel"
-#: plugins/sudoers/auth/securid5.c:157
+#: plugins/sudoers/auth/securid5.c:165
msgid "invalid passcode length for SecurID"
msgstr "ogiltig lösenordslängd för SecurID"
-#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123
+#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:126
msgid "unable to initialize SIA session"
msgstr "kan inte initiera SIA-session"
-#: plugins/sudoers/auth/sudo_auth.c:132
+#: plugins/sudoers/auth/sudo_auth.c:135
msgid "invalid authentication methods"
msgstr "ogiltiga autentiseringsmetoder"
-#: plugins/sudoers/auth/sudo_auth.c:134
+#: plugins/sudoers/auth/sudo_auth.c:137
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:255 plugins/sudoers/auth/sudo_auth.c:305
+#: plugins/sudoers/auth/sudo_auth.c:258 plugins/sudoers/auth/sudo_auth.c:310
msgid "no authentication methods"
msgstr "inga autentiseringsmetoder"
-#: plugins/sudoers/auth/sudo_auth.c:257
+#: plugins/sudoers/auth/sudo_auth.c:260
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:307
+#: plugins/sudoers/auth/sudo_auth.c:312
msgid "Unable to initialize authentication methods."
msgstr "Kan inte initiera autentiseringsmetoder."
-#: plugins/sudoers/auth/sudo_auth.c:471
+#: plugins/sudoers/auth/sudo_auth.c:486
msgid "Authentication methods:"
msgstr "Autentiseringsmetoder:"
@@ -1248,17 +1639,17 @@ msgstr "Kunde inte fastställa granskningsvillkor"
msgid "unable to commit audit record"
msgstr "kan inte bekräfta granskningsberättelse"
-#: plugins/sudoers/check.c:264
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "fel vid inläsning av lektionsfil %s"
-#: plugins/sudoers/check.c:270
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "hoppar över lektionsfil %s: inte en vanlig fil"
-#: plugins/sudoers/check.c:283
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1278,129 +1669,107 @@ msgstr ""
" #3) Med stor makt kommer ett stort ansvar.\n"
"\n"
-#: plugins/sudoers/check.c:325 plugins/sudoers/check.c:335
-#: plugins/sudoers/sudoers.c:830 plugins/sudoers/sudoers.c:851
-#: plugins/sudoers/tsdump.c:119
-#, c-format
-msgid "unknown uid: %u"
-msgstr "okänt uid: %u"
-
-#: plugins/sudoers/check.c:330 plugins/sudoers/exptilde.c:85
-#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1123
-#: plugins/sudoers/sudoers.c:432 plugins/sudoers/sudoers.c:1283
-#: plugins/sudoers/testsudoers.c:215 plugins/sudoers/testsudoers.c:382
-#, c-format
-msgid "unknown user: %s"
-msgstr "okänd användare: %s"
-
-#: plugins/sudoers/check_aliases.c:56
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
-msgid "Error: %s:%d:%d: cycle in %s \"%s\""
-msgstr "Fel: %s:%d:%d: cykel i %s â€%sâ€"
+msgid "unknown uid %u"
+msgstr "okänt uid %u"
-#: plugins/sudoers/check_aliases.c:57
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
-msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
-msgstr "Varning: %s:%d:%d: cykel i %s â€%sâ€"
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
-#: plugins/sudoers/check_aliases.c:61
+#: plugins/sudoers/check_aliases.c:133
#, c-format
-msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
-msgstr "Fel: %s:%d:%d: %s â€%s†refererad till men inte definierad"
+msgid "cycle in %s \"%s\""
+msgstr "cykel i %s â€%sâ€"
-#: plugins/sudoers/check_aliases.c:62
+#: plugins/sudoers/check_aliases.c:136
#, c-format
-msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
-msgstr "Varning: %s:%d:%d: %s â€%s†refererad till men inte definierad"
+msgid "%s \"%s\" referenced but not defined"
+msgstr "%s â€%s†refererad till men inte definierad"
-#: plugins/sudoers/cvtsudoers.c:194
+#: plugins/sudoers/cvtsudoers.c:209
#, c-format
msgid "order increment: %s: %s"
msgstr "ordningsinkrement: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:210
+#: plugins/sudoers/cvtsudoers.c:228
#, c-format
msgid "starting order: %s: %s"
msgstr "startordning: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:220
+#: plugins/sudoers/cvtsudoers.c:238
#, c-format
msgid "order padding: %s: %s"
msgstr "ordningsutfyllnad: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:177
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "%s grammatikversion %d\n"
-#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:159
+#: plugins/sudoers/cvtsudoers.c:277 plugins/sudoers/testsudoers.c:159
#, c-format
msgid "unsupported input format %s"
msgstr "inmatningsformat %s stöds inte"
-#: plugins/sudoers/cvtsudoers.c:262
+#: plugins/sudoers/cvtsudoers.c:295
#, c-format
msgid "unsupported output format %s"
msgstr "utmatningsformat %s stöds inte"
-#: plugins/sudoers/cvtsudoers.c:314
+#: plugins/sudoers/cvtsudoers.c:385
#, c-format
msgid "%s: input and output files must be different"
msgstr "%s: in- och utmatningsfiler måste vara olika"
-#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:177
-#: plugins/sudoers/testsudoers.c:254 plugins/sudoers/visudo.c:247
-#: plugins/sudoers/visudo.c:597 plugins/sudoers/visudo.c:917
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "kan inte initiera sudoers standardvärden"
-#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s: %s: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:475
+#: plugins/sudoers/cvtsudoers.c:584
#, c-format
-msgid "%s: unknown key word: %s"
-msgstr "%s: okänt nyckelord: %s"
+msgid "%s: unknown key word %s"
+msgstr "%s: okänt nyckelord %s"
-#: plugins/sudoers/cvtsudoers.c:521
+#: plugins/sudoers/cvtsudoers.c:630
#, c-format
msgid "invalid defaults type: %s"
msgstr "ogiltig standardtyp: %s"
-#: plugins/sudoers/cvtsudoers.c:544
+#: plugins/sudoers/cvtsudoers.c:653
#, c-format
msgid "invalid suppression type: %s"
msgstr "ogiltig undertryckningstyp: %s"
-#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598
+#: plugins/sudoers/cvtsudoers.c:694 plugins/sudoers/cvtsudoers.c:710
#, c-format
msgid "invalid filter: %s"
msgstr "ogiltigt filter: %s"
-#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:922
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, 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
-#, 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
-#, c-format
-msgid "parse error in %s\n"
-msgstr "tolkningsfel i %s\n"
-
-#: plugins/sudoers/cvtsudoers.c:1296 plugins/sudoers/sudoreplay.c:1124
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "kan inte skriva till %s"
-#: plugins/sudoers/cvtsudoers.c:1319
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1409,7 +1778,7 @@ msgstr ""
"%s - konvertera mellan sudoers filformat\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1321
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -1449,714 +1818,859 @@ msgstr ""
" -s, --suppress=avsnitt undertryck utmatning av vissa avsnitt\n"
" -V, --version visa versionsinformation och avsluta"
-#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514
-#: plugins/sudoers/cvtsudoers_json.c:713
-#, c-format
-msgid "unknown defaults entry \"%s\""
-msgstr "okänd standardpost â€%sâ€"
-
-#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664
-#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357
-#: plugins/sudoers/ldap.c:503
+#: plugins/sudoers/cvtsudoers_csv.c:452 plugins/sudoers/cvtsudoers_csv.c:466
+#: plugins/sudoers/cvtsudoers_json.c:657 plugins/sudoers/cvtsudoers_json.c:672
+#: plugins/sudoers/cvtsudoers_ldif.c:347 plugins/sudoers/cvtsudoers_ldif.c:360
+#: plugins/sudoers/ldap.c:510
msgid "unable to get GMT time"
msgstr "kan inte hämta GMT-tid"
-#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667
-#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360
-#: plugins/sudoers/ldap.c:509
+#: plugins/sudoers/cvtsudoers_csv.c:457 plugins/sudoers/cvtsudoers_csv.c:471
+#: plugins/sudoers/cvtsudoers_json.c:662 plugins/sudoers/cvtsudoers_json.c:677
+#: plugins/sudoers/cvtsudoers_ldif.c:352 plugins/sudoers/cvtsudoers_ldif.c:365
+#: plugins/sudoers/ldap.c:518
msgid "unable to format timestamp"
msgstr "kan inte formatera tidsstämpel"
-#: plugins/sudoers/cvtsudoers_ldif.c:640
+#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:515
+#: plugins/sudoers/cvtsudoers_json.c:728
+#, c-format
+msgid "%s:%d:%d: unknown defaults entry \"%s\""
+msgstr "%s:%d:%d: okänd standardpost â€%sâ€"
+
+#: plugins/sudoers/cvtsudoers_ldif.c:661
#, c-format
msgid "too many sudoers entries, maximum %u"
msgstr "för många sudoers-poster, maximalt %u"
-#: plugins/sudoers/cvtsudoers_ldif.c:683
+#: plugins/sudoers/cvtsudoers_ldif.c:704
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:50
+#: plugins/sudoers/cvtsudoers_merge.c:273
+#: plugins/sudoers/cvtsudoers_merge.c:309
+#, c-format
+msgid "%s:%d:%d: converting host list to ALL"
+msgstr "%s:%d:%d: konverterar värdlista till ALL"
+
+#: plugins/sudoers/cvtsudoers_merge.c:545
+#, c-format
+msgid "unable to find alias %s"
+msgstr "kan inte hitta alias %s"
+
+#: plugins/sudoers/cvtsudoers_merge.c:548
+#, c-format
+msgid "%s:%d:%d: renaming alias %s to %s"
+msgstr "%s:%d:%d: byter namn på alias %s till %s"
+
+#: plugins/sudoers/cvtsudoers_merge.c:605
+#, c-format
+msgid "%s:%d:%d: removing duplicate alias %s"
+msgstr "%s:%d:%d: tar bort duplicerat alias %s"
+
+#: plugins/sudoers/cvtsudoers_merge.c:830
+#, c-format
+msgid "%s:%d:%d: conflicting Defaults entry \"%s\" host-specific in %s:%d:%d"
+msgstr "%s:%d:%d: Defaults-post â€%s†stÃ¥r i konflikt med värdspecifik pÃ¥ %s:%d:%d"
+
+#: plugins/sudoers/cvtsudoers_merge.c:864
+#, c-format
+msgid "%s:%d:%d: made Defaults \"%s\" specific to host %s"
+msgstr "%s:%d:%d: gjorde Defaults â€%s†specifika för värd %s"
+
+#: plugins/sudoers/cvtsudoers_merge.c:882
+#, c-format
+msgid "%s:%d:%d: unable to make Defaults \"%s\" host-specific"
+msgstr "%s:%d:%d: kan inte göra Defaults â€%s†värdspecifik"
+
+#: plugins/sudoers/cvtsudoers_merge.c:892
+#, c-format
+msgid "%s:%d:%d: removing Defaults \"%s\" overridden by subsequent entries"
+msgstr "%s:%d:%d: tar bort Defaults â€%s†åsidosatt av efterföljande poster"
+
+#: plugins/sudoers/cvtsudoers_merge.c:1088
+#, c-format
+msgid "%s:%d:%d: merging userspec into %s:%d:%d"
+msgstr "%s:%d:%d: sammanfogar användarspec till %s:%d:%d"
+
+#: plugins/sudoers/cvtsudoers_merge.c:1182
+#, c-format
+msgid "%s:%d:%d: removing userspec overridden by subsequent entries"
+msgstr "%s:%d:%d: tar bort användarspec åsidosatt av efterföljande poster"
+
+#: plugins/sudoers/def_data.c:56
#, 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:54
+#: plugins/sudoers/def_data.c:60
#, 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:58
+#: plugins/sudoers/def_data.c:64
#, 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:62
+#: plugins/sudoers/def_data.c:68
msgid "Put OTP prompt on its own line"
msgstr "Lägg OTP-prompt på en egen rad"
-#: plugins/sudoers/def_data.c:66
+#: plugins/sudoers/def_data.c:72
msgid "Ignore '.' in $PATH"
msgstr "Ignorera â€.†i $PATH"
-#: plugins/sudoers/def_data.c:70
+#: plugins/sudoers/def_data.c:76
msgid "Always send mail when sudo is run"
msgstr "Skicka alltid e-post när sudo körs"
-#: plugins/sudoers/def_data.c:74
+#: plugins/sudoers/def_data.c:80
msgid "Send mail if user authentication fails"
msgstr "Skicka e-post om användarens autentisering misslyckas"
-#: plugins/sudoers/def_data.c:78
+#: plugins/sudoers/def_data.c:84
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:82
+#: plugins/sudoers/def_data.c:88
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:86
+#: plugins/sudoers/def_data.c:92
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:90
+#: plugins/sudoers/def_data.c:96
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:94
+#: plugins/sudoers/def_data.c:100
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:98
+#: plugins/sudoers/def_data.c:104
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:102
+#: plugins/sudoers/def_data.c:108
#, c-format
msgid "File containing the sudo lecture: %s"
msgstr "Fil som innehåller sudo-lektion: %s"
-#: plugins/sudoers/def_data.c:106
+#: plugins/sudoers/def_data.c:112
msgid "Require users to authenticate by default"
msgstr "Kräv att användare autentiseras som standard"
-#: plugins/sudoers/def_data.c:110
+#: plugins/sudoers/def_data.c:116
msgid "Root may run sudo"
msgstr "Root får köra sudo"
-#: plugins/sudoers/def_data.c:114
+#: plugins/sudoers/def_data.c:120
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:118
+#: plugins/sudoers/def_data.c:124
msgid "Log the year in the (non-syslog) log file"
msgstr "Logga året i (den icke syslog-baserade) loggfilen"
-#: plugins/sudoers/def_data.c:122
+#: plugins/sudoers/def_data.c:128
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:126
+#: plugins/sudoers/def_data.c:132
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:130
+#: plugins/sudoers/def_data.c:136
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:134
+#: plugins/sudoers/def_data.c:140
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:138
+#: plugins/sudoers/def_data.c:144
msgid "Require fully-qualified hostnames in the sudoers file"
msgstr "Kräv fullständiga värdnamn i sudoers-filen"
-#: plugins/sudoers/def_data.c:142
+#: plugins/sudoers/def_data.c:148
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:146
+#: plugins/sudoers/def_data.c:152
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:150
+#: plugins/sudoers/def_data.c:156
msgid "Visudo will honor the EDITOR environment variable"
msgstr "Visudo kommer att respektera miljövariabeln EDITOR"
-#: plugins/sudoers/def_data.c:154
+#: plugins/sudoers/def_data.c:160
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:158
+#: plugins/sudoers/def_data.c:164
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:162
+#: plugins/sudoers/def_data.c:168
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:166
+#: plugins/sudoers/def_data.c:172
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:170
+#: plugins/sudoers/def_data.c:176
msgid "Set the LOGNAME and USER environment variables"
msgstr "Ställ in miljövariablerna LOGNAME och USER"
-#: plugins/sudoers/def_data.c:174
+#: plugins/sudoers/def_data.c:180
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:178
+#: plugins/sudoers/def_data.c:184
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:182
+#: plugins/sudoers/def_data.c:188
#, 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:186
+#: plugins/sudoers/def_data.c:192
#, c-format
msgid "Authentication timestamp timeout: %.1f minutes"
msgstr "Tidsgräns för autentiseringstidsstämpel: %.1f minuter"
-#: plugins/sudoers/def_data.c:190
+#: plugins/sudoers/def_data.c:196
#, c-format
msgid "Password prompt timeout: %.1f minutes"
msgstr "Tidsgräns för lösenordsprompt: %.1f minuter"
-#: plugins/sudoers/def_data.c:194
+#: plugins/sudoers/def_data.c:200
#, 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:198
+#: plugins/sudoers/def_data.c:204
#, 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:202
+#: plugins/sudoers/def_data.c:208
#, c-format
msgid "Path to log file: %s"
msgstr "Sökväg till loggfil: %s"
-#: plugins/sudoers/def_data.c:206
+#: plugins/sudoers/def_data.c:212
#, c-format
msgid "Path to mail program: %s"
msgstr "Sökväg till e-postprogram: %s"
-#: plugins/sudoers/def_data.c:210
+#: plugins/sudoers/def_data.c:216
#, c-format
msgid "Flags for mail program: %s"
msgstr "Flaggor för e-postprogram: %s"
-#: plugins/sudoers/def_data.c:214
+#: plugins/sudoers/def_data.c:220
#, c-format
msgid "Address to send mail to: %s"
msgstr "Adress att skicka e-post till: %s"
-#: plugins/sudoers/def_data.c:218
+#: plugins/sudoers/def_data.c:224
#, c-format
msgid "Address to send mail from: %s"
msgstr "Adress att skicka e-post från: %s"
-#: plugins/sudoers/def_data.c:222
+#: plugins/sudoers/def_data.c:228
#, c-format
msgid "Subject line for mail messages: %s"
msgstr "Ämnesrad för e-postmeddelanden: %s"
-#: plugins/sudoers/def_data.c:226
+#: plugins/sudoers/def_data.c:232
#, c-format
msgid "Incorrect password message: %s"
msgstr "Meddelande vid felaktigt lösenord: %s"
-#: plugins/sudoers/def_data.c:230
+#: plugins/sudoers/def_data.c:236
#, c-format
msgid "Path to lecture status dir: %s"
msgstr "Sökväg till lektionsstatuskatalog: %s"
-#: plugins/sudoers/def_data.c:234
+#: plugins/sudoers/def_data.c:240
#, 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:238
+#: plugins/sudoers/def_data.c:244
#, c-format
msgid "Owner of the authentication timestamp dir: %s"
msgstr "Ägare av katalogen för autentiseringstidsstämplar: %s"
-#: plugins/sudoers/def_data.c:242
+#: plugins/sudoers/def_data.c:248
#, 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:246
+#: plugins/sudoers/def_data.c:252
#, c-format
msgid "Default password prompt: %s"
msgstr "Standard lösenordsprompt: %s"
-#: plugins/sudoers/def_data.c:250
+#: plugins/sudoers/def_data.c:256
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:254
+#: plugins/sudoers/def_data.c:260
#, c-format
msgid "Default user to run commands as: %s"
msgstr "Standardanvändaren att köra kommandon som: %s"
-#: plugins/sudoers/def_data.c:258
+#: plugins/sudoers/def_data.c:264
#, 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:262
+#: plugins/sudoers/def_data.c:268
#, 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:266
+#: plugins/sudoers/def_data.c:272
#, 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:270
+#: plugins/sudoers/def_data.c:276
#, 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:274
+#: plugins/sudoers/def_data.c:280
msgid "Preload the sudo_noexec library which replaces the exec functions"
msgstr "Förinläs sudo_noexec-biblioteket vilket ersätter exec-funktionerna"
-#: plugins/sudoers/def_data.c:278
+#: plugins/sudoers/def_data.c:284
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:282
+#: plugins/sudoers/def_data.c:288
#, c-format
msgid "File descriptors >= %d will be closed before executing a command"
msgstr "Fildeskriptorer >= %d kommer att stängas innan ett kommando körs"
-#: plugins/sudoers/def_data.c:286
+#: plugins/sudoers/def_data.c:292
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:290
+#: plugins/sudoers/def_data.c:296
msgid "Allow users to set arbitrary environment variables"
msgstr "Låt användare ställa in godtyckliga miljövariabler"
-#: plugins/sudoers/def_data.c:294
+#: plugins/sudoers/def_data.c:300
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:298
+#: plugins/sudoers/def_data.c:304
msgid "Environment variables to check for safety:"
msgstr "Miljövariabler att säkerhetskontrollera:"
-#: plugins/sudoers/def_data.c:302
+#: plugins/sudoers/def_data.c:308
msgid "Environment variables to remove:"
msgstr "Miljövariabler att ta bort:"
-#: plugins/sudoers/def_data.c:306
+#: plugins/sudoers/def_data.c:312
msgid "Environment variables to preserve:"
msgstr "Miljövariabler att behålla:"
-#: plugins/sudoers/def_data.c:310
+#: plugins/sudoers/def_data.c:316
#, 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:314
+#: plugins/sudoers/def_data.c:320
#, 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:318
+#: plugins/sudoers/def_data.c:324
#, 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:322
+#: plugins/sudoers/def_data.c:328
#, 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:326
+#: plugins/sudoers/def_data.c:332
#, 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:330
+#: plugins/sudoers/def_data.c:336
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:334
+#: plugins/sudoers/def_data.c:340
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:338
+#: plugins/sudoers/def_data.c:344
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:342
+#: plugins/sudoers/def_data.c:348
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:346
+#: plugins/sudoers/def_data.c:352
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:350
+#: plugins/sudoers/def_data.c:356
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "Logga kommandots standard in om inte ansluten till en terminal"
+
+#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "Logga användarens terminalinmatning för kommandot som körs"
+
+#: plugins/sudoers/def_data.c:364
msgid "Log the output of the command being run"
msgstr "Logga utmatningen för kommandot som körs"
-#: plugins/sudoers/def_data.c:354
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "Logga kommandots standard ut om inte ansluten till en terminal"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "Logga kommandots standard fel om inte ansluten till en terminal"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "Logga terminalutmatningen för kommandot som körs"
+
+#: plugins/sudoers/def_data.c:380
msgid "Compress I/O logs using zlib"
msgstr "Komprimera I/O-loggar med hjälp av zlib"
-#: plugins/sudoers/def_data.c:358
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "Kör alltid kommandon i en pseudo-tty"
-#: plugins/sudoers/def_data.c:362
+#: plugins/sudoers/def_data.c:388
#, 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:366
+#: plugins/sudoers/def_data.c:392
#, 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:370
+#: plugins/sudoers/def_data.c:396
#, 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:374
+#: plugins/sudoers/def_data.c:400
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:378
+#: plugins/sudoers/def_data.c:404
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:382
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "Uppsättning tillåtna rättigheter: %s"
-#: plugins/sudoers/def_data.c:386
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "Uppsättning av begränsningsrättigheter: %s"
-#: plugins/sudoers/def_data.c:390
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr "Kör kommandon i en pty i bakgrunden"
-#: plugins/sudoers/def_data.c:394
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "PAM-tjänstnamn att använda: %s"
-#: plugins/sudoers/def_data.c:398
+#: plugins/sudoers/def_data.c:424
#, 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:402
+#: plugins/sudoers/def_data.c:428
+#, c-format
+msgid "PAM service name to use when sudo is run with the -A option: %s"
+msgstr "PAM-tjänstnamn att använda när sudo körs med flaggan -A: %s"
+
+#: plugins/sudoers/def_data.c:432
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:406
+#: plugins/sudoers/def_data.c:436
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:410
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "Utför valideringshantering av PAM-konto"
-#: plugins/sudoers/def_data.c:414
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "Största sekvensnummer i I/O-logg: %s"
-#: plugins/sudoers/def_data.c:418
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "Aktivera sudoers nätgruppsstöd"
-#: plugins/sudoers/def_data.c:422
+#: plugins/sudoers/def_data.c:452
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:426
+#: plugins/sudoers/def_data.c:456
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:430
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr "Fråga gruppinsticksmodulen efter okända systemgrupper"
-#: plugins/sudoers/def_data.c:434
+#: plugins/sudoers/def_data.c:464
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:438
+#: plugins/sudoers/def_data.c:468
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:442
+#: plugins/sudoers/def_data.c:472
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:446
+#: plugins/sudoers/def_data.c:476
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:450
+#: plugins/sudoers/def_data.c:480
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:454
+#: plugins/sudoers/def_data.c:484
#, 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:458
+#: plugins/sudoers/def_data.c:488
#, 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:462
+#: plugins/sudoers/def_data.c:492
#, 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:466
+#: plugins/sudoers/def_data.c:496
#, 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:470
+#: plugins/sudoers/def_data.c:500
#, c-format
msgid "Execute commands by file descriptor instead of by path: %s"
msgstr "Kör kommandon efter fildeskriptor istället för efter sökväg: %s"
-#: plugins/sudoers/def_data.c:474
+#: plugins/sudoers/def_data.c:504
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:478
+#: plugins/sudoers/def_data.c:508
#, 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:482
+#: plugins/sudoers/def_data.c:512
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:486
+#: plugins/sudoers/def_data.c:516
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:490
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr "Inkludera process-ID:t vid loggning via syslog"
-#: plugins/sudoers/def_data.c:494
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "Typ av post för autentiseringstidsstämplar: %s"
-#: plugins/sudoers/def_data.c:498
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "Autentiseringsfelsmeddelande: %s"
-#: plugins/sudoers/def_data.c:502
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "Matcha användarnamn skiftlägesokänsligt"
-#: plugins/sudoers/def_data.c:506
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "Matcha gruppnamn skiftlägesokänsligt"
-#: plugins/sudoers/def_data.c:510
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr "Logga när ett kommando tillåts av sudoers"
-#: plugins/sudoers/def_data.c:514
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "Logga när ett kommando nekas av sudoers"
-#: plugins/sudoers/def_data.c:518
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "Sudo-loggservrar att ansluta till med valfri port"
-#: plugins/sudoers/def_data.c:522
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Tidsgräns för sudo-loggserver i sekunder: %u"
-#: plugins/sudoers/def_data.c:526
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "Aktivera SO_KEEPALIVE-kontaktalternativ på kontakten ansluten till loggservern"
-#: plugins/sudoers/def_data.c:530
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "Sökväg till granskningsserverns CA-buntfil: %s"
-#: plugins/sudoers/def_data.c:534
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "Sökväg till sudoers certifikatfil: %s"
-#: plugins/sudoers/def_data.c:538
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "Sökväg till sudoers privata nyckelfil: %s"
-#: plugins/sudoers/def_data.c:542
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "Verifiera att loggserverns certifikatfil är giltig"
-#: plugins/sudoers/def_data.c:546
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "Tillåt användningen av okänd runas-användare och/eller grupp-ID"
-#: plugins/sudoers/def_data.c:550
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "Tillåt endast körning av kommandon som en användare med ett giltigt skal"
-#: plugins/sudoers/def_data.c:554
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "Ställ in pam-fjärranvändaren för användaren som kör sudo"
-#: plugins/sudoers/def_data.c:558
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "Ställ in pam-fjärrvärden till det lokala värdnamnet"
-#: plugins/sudoers/def_data.c:562
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "Arbetskatalog att ändra till före körning av kommandot: %s"
-#: plugins/sudoers/def_data.c:566
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "Rotkatalog att ändra till innan kommandot körs: %s"
-#: plugins/sudoers/def_data.c:570
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "Formatet för loggarna som ska produceras: %s"
-#: plugins/sudoers/def_data.c:574
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "Aktivera SELinux RBAC-stöd"
-#: plugins/sudoers/def_data.c:578
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "Sökväg till filen som skapas första gången sudo körs: %s"
-#: plugins/sudoers/defaults.c:185
+#: plugins/sudoers/def_data.c:612
+msgid "Intercept further commands and apply sudoers restrictions to them"
+msgstr "Fånga in vidare kommando och tillämpa sudoers-begränsningar på dem"
+
+#: plugins/sudoers/def_data.c:616
+msgid "Log sub-commands run by the original command"
+msgstr "Logga underkommandon som körs av originalkommandot"
+
+#: plugins/sudoers/def_data.c:620
+msgid "Log the exit status of commands"
+msgstr "Logga avslutningsstatus för kommandon"
+
+#: plugins/sudoers/def_data.c:624
+msgid "Subsequent commands in an intercepted session must be authenticated"
+msgstr "Framtida kommandon i en infångad session måste autentiseras"
+
+#: plugins/sudoers/def_data.c:628
+msgid "Allow an intercepted command to run set setuid or setgid programs"
+msgstr "Tillåt ett infångat kommando att köra setuid- eller setgid-program"
+
+#: plugins/sudoers/def_data.c:632
#, c-format
-msgid "%s:%d:%d: unknown defaults entry \"%s\""
-msgstr "%s:%d:%d: okänd standardpost â€%sâ€"
+msgid "The maximum size to which the process's address space may grow (in bytes): %s"
+msgstr "Maximal storlek upp till vilken processens adressområde får växa (i byte): %s"
-#: plugins/sudoers/defaults.c:188
+#: plugins/sudoers/def_data.c:636
#, c-format
-msgid "%s: unknown defaults entry \"%s\""
-msgstr "%s: okänd standardpost â€%sâ€"
+msgid "The largest size core dump file that may be created (in bytes): %s"
+msgstr "Största storlek för kärndumpfil som får skapas (i byte): %s"
-#: plugins/sudoers/defaults.c:234
+#: plugins/sudoers/def_data.c:640
#, c-format
-msgid "%s:%d:%d: no value specified for \"%s\""
-msgstr "%s:%d:%d: inget värde angivet för â€%sâ€"
+msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
+msgstr "Maximal mängd CPU-tid som processen får använda (i sekunder): %s"
-#: plugins/sudoers/defaults.c:237
+#: plugins/sudoers/def_data.c:644
#, c-format
-msgid "%s: no value specified for \"%s\""
-msgstr "%s: inget värde angivet för â€%sâ€"
+msgid "The maximum size of the data segment for the process (in bytes): %s"
+msgstr "Maximal storlek på datasegmentet för processen (i byte): %s"
-#: plugins/sudoers/defaults.c:275
+#: plugins/sudoers/def_data.c:648
#, c-format
-msgid "%s:%d:%d: option \"%s\" does not take a value"
-msgstr "%s:%d:%d: flaggan â€%s†tar inte emot nÃ¥got värde"
+msgid "The largest size file that the process may create (in bytes): %s"
+msgstr "Största filstorlek som processen får skapa (i byte): %s"
-#: plugins/sudoers/defaults.c:278
+#: plugins/sudoers/def_data.c:652
#, c-format
-msgid "%s: option \"%s\" does not take a value"
-msgstr "%s: flaggan â€%s†tar inte emot nÃ¥got värde"
+msgid "The maximum number of locks that the process may establish: %s"
+msgstr "Största antalet lås som processen får etablera: %s"
-#: plugins/sudoers/defaults.c:303
+#: plugins/sudoers/def_data.c:656
#, c-format
-msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s:%d:%d: ogiltig standardtyp 0x%x för flagga â€%sâ€"
+msgid "The maximum size that the process may lock in memory (in bytes): %s"
+msgstr "Maximal storlek som processen får låsa i minnet (i byte): %s"
-#: plugins/sudoers/defaults.c:306
+#: plugins/sudoers/def_data.c:660
+#, c-format
+msgid "The maximum number of files that the process may have open: %s"
+msgstr "Maximalt antal filer som processen får ha öppna: %s"
+
+#: plugins/sudoers/def_data.c:664
+#, c-format
+msgid "The maximum number of processes that the user may run simultaneously: %s"
+msgstr "Maximalt antal processer som användaren får köra samtidigt: %s"
+
+#: plugins/sudoers/def_data.c:668
+#, c-format
+msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
+msgstr "Maximal storlek upp till vilken processens residenta mängd får växa (i byte): %s"
+
+#: plugins/sudoers/def_data.c:672
#, c-format
-msgid "%s: invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s: ogiltig standardtyp 0x%x för flagga â€%sâ€"
+msgid "The maximum size to which the process's stack may grow (in bytes): %s"
+msgstr "Maximal storlek upp till vilken processen stack får växa (i byte) : %s"
+
+#: plugins/sudoers/def_data.c:676
+msgid "Attempt authentication even when in non-interactive mode"
+msgstr "Försök att autentisera även i icke-interaktivt läge"
+
+#: plugins/sudoers/def_data.c:680
+msgid "Store plaintext passwords in I/O log input"
+msgstr "Spara lösenord i klartext i I/O-logg-indata"
-#: plugins/sudoers/defaults.c:316
+#: plugins/sudoers/def_data.c:684
+msgid "List of regular expressions to use when matching a password prompt"
+msgstr "Lista över reguljära uttryck att använda vid matchning av en lösenordsförfrågan"
+
+#: plugins/sudoers/def_data.c:688
#, c-format
-msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
-msgstr "%s:%d:%d: värdet â€%s†är ogiltigt för flaggan â€%sâ€"
+msgid "The mechanism used by the intercept and log_subcmds options: %s"
+msgstr "Mekanismen som används av infångning och log_subcmd-flaggorna: %s"
+
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "Försök att verifiera kommandot och argumenten efter körning"
-#: plugins/sudoers/defaults.c:319
+#: plugins/sudoers/def_data.c:696
#, c-format
-msgid "%s: value \"%s\" is invalid for option \"%s\""
-msgstr "%s: värdet â€%s†är ogiltigt för flaggan â€%sâ€"
+msgid "AppArmor profile to use in the new security context: %s"
+msgstr "AppArmor-profil att använda i den nya säkerhetskontexten: %s"
-#: plugins/sudoers/defaults.c:1040
+#: plugins/sudoers/defaults.c:191
#, c-format
-msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
-msgstr "%s:%d:%d: värden för â€%s†mÃ¥ste börja med ett â€/â€, â€~†eller â€*â€"
+msgid "unknown defaults entry \"%s\""
+msgstr "okänd standardpost â€%sâ€"
-#: plugins/sudoers/defaults.c:1044
+#: plugins/sudoers/defaults.c:234
#, c-format
-msgid "%s: values for \"%s\" must start with a '/', '~', or '*'"
-msgstr "%s: värden för â€%s†mÃ¥ste börja med ett â€/â€, â€~†eller â€*â€"
+msgid "no value specified for \"%s\""
+msgstr "inget värde angivet för â€%sâ€"
-#: plugins/sudoers/defaults.c:1055
+#: plugins/sudoers/defaults.c:243
#, c-format
-msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
-msgstr "%s:%d:%d: värden för â€%s†mÃ¥ste börja med ett â€/â€"
+msgid "invalid operator \"%c=\" for \"%s\""
+msgstr "ogiltig operator â€%c=†för â€%sâ€"
-#: plugins/sudoers/defaults.c:1059
+#: plugins/sudoers/defaults.c:275
#, c-format
-msgid "%s: values for \"%s\" must start with a '/'"
-msgstr "%s: värden för â€%s†mÃ¥ste börja med ett â€/â€"
+msgid "option \"%s\" does not take a value"
+msgstr "flaggan â€%s†tar inte emot nÃ¥got värde"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/defaults.c:299
+#, c-format
+msgid "invalid Defaults type 0x%x for option \"%s\""
+msgstr "ogiltig Defaults-typ 0x%x för flagga â€%sâ€"
+
+#: plugins/sudoers/defaults.c:306
+#, c-format
+msgid "value \"%s\" is invalid for option \"%s\""
+msgstr "värdet â€%s†är ogiltigt för flaggan â€%sâ€"
+
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
+#, c-format
+msgid "path name for \"%s\" too long"
+msgstr "sökvägsnamn för â€%s†för lÃ¥ngt"
+
+#: plugins/sudoers/defaults.c:1134
+#, c-format
+msgid "values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "värden för â€%s†mÃ¥ste börja med ett â€/â€, â€~†eller â€*â€"
+
+#: plugins/sudoers/defaults.c:1141
+#, c-format
+msgid "values for \"%s\" must start with a '/'"
+msgstr "värden för â€%s†mÃ¥ste börja med ett â€/â€"
+
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv: trasig envp, längd stämmer inte"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "kan inte återuppbygga miljön"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, 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:107
-#, c-format
-msgid "parse error in %s near line %d"
-msgstr "tolkningsfel i %s nära rad %d"
-
-#: plugins/sudoers/file.c:110
-#, c-format
-msgid "parse error in %s"
-msgstr "tolkningsfel i %s"
-
#: plugins/sudoers/filedigest.c:49
#, c-format
msgid "unsupported digest type %d for %s"
@@ -2167,86 +2681,81 @@ msgstr "typ %d av kontrollsumma stöds inte för %s"
msgid "%s: read error"
msgstr "%s: läsfel"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s måste ägas av uid %d"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, c-format
msgid "%s must only be writable by owner"
msgstr "%s får endast vara skrivbar av ägaren"
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "kan inte läsa in %s: %s"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, c-format
msgid "unable to find symbol \"group_plugin\" in %s"
msgstr "kan inte hitta symbolen â€group_plugin†i %s"
-#: plugins/sudoers/group_plugin.c:107
+#: plugins/sudoers/group_plugin.c:202
#, 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:80 plugins/sudoers/interfaces.c:97
+#: plugins/sudoers/interfaces.c:76 plugins/sudoers/interfaces.c:93
#, c-format
msgid "unable to parse IP address \"%s\""
msgstr "kan inte tolka IP-adress â€%sâ€"
-#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102
+#: plugins/sudoers/interfaces.c:81 plugins/sudoers/interfaces.c:98
#, c-format
msgid "unable to parse netmask \"%s\""
msgstr "kan inte tolka nätmask â€%sâ€"
-#: plugins/sudoers/interfaces.c:130
+#: plugins/sudoers/interfaces.c:126
msgid "Local IP address and netmask pairs:\n"
msgstr "Lokala IP-adress- och nätmaskpar:\n"
-#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:437
-#: plugins/sudoers/sudoers.c:1317 plugins/sudoers/testsudoers.c:406
-#, c-format
-msgid "unknown group: %s"
-msgstr "okänd grupp: %s"
-
-#: plugins/sudoers/iolog.c:635
+#: plugins/sudoers/iolog.c:685
msgid "unable to update sequence file"
msgstr "kan inte uppdatera sekvensfil"
-#: plugins/sudoers/iolog.c:666 plugins/sudoers/iolog.c:854
-#: plugins/sudoers/iolog.c:1007 plugins/sudoers/iolog.c:1014
-#: plugins/sudoers/iolog.c:1135 plugins/sudoers/iolog.c:1142
-#: plugins/sudoers/iolog.c:1241 plugins/sudoers/iolog.c:1248
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "kan inte skriva till I/O-loggfil: %s"
-#: plugins/sudoers/iolog.c:674
+#: plugins/sudoers/iolog.c:727
#, c-format
msgid "unable to create %s/%s"
msgstr "kan inte skapa %s/%s"
-#: plugins/sudoers/iolog.c:899
+#: plugins/sudoers/iolog.c:957
#, c-format
msgid "%s: internal error, I/O log file for event %d not open"
msgstr "%s: internt fel, I/O-loggfil för händelse %d inte öppen"
-#: plugins/sudoers/iolog.c:992 plugins/sudoers/iolog.c:1120
-#: plugins/sudoers/iolog.c:1225 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:487
-#: plugins/sudoers/visudo.c:493
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "kan inte läsa klockan"
-#: plugins/sudoers/iolog.c:1217 plugins/sudoers/log_client.c:1199
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: internt fel, ogiltig signal %d"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "starttls stöds inte när ldaps används"
@@ -2260,16 +2769,16 @@ msgstr "kan inte initiera SSL-certifikat och nyckeldatabas: %s"
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:1660
+#: plugins/sudoers/ldap.c:1712
#, c-format
msgid "unable to initialize LDAP: %s"
msgstr "kan inte initiera LDAP: %s"
-#: plugins/sudoers/ldap.c:1697
+#: plugins/sudoers/ldap.c:1749
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:1834 plugins/sudoers/parse_ldif.c:746
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "ogiltigt sudoOrder-attribut: %s"
@@ -2279,24 +2788,24 @@ msgstr "ogiltigt sudoOrder-attribut: %s"
msgid "%s: port too large"
msgstr "%s: port för stor"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "LDAP-uri-typ stöds ej: %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "kan inte blanda ldap- och ldaps-URI:er"
-#: plugins/sudoers/ldap_util.c:529 plugins/sudoers/ldap_util.c:536
-#: plugins/sudoers/ldap_util.c:544 plugins/sudoers/ldap_util.c:553
-#: plugins/sudoers/ldap_util.c:561 plugins/sudoers/ldap_util.c:571
-#: plugins/sudoers/ldap_util.c:579
+#: plugins/sudoers/ldap_util.c:499 plugins/sudoers/ldap_util.c:506
+#: plugins/sudoers/ldap_util.c:514 plugins/sudoers/ldap_util.c:523
+#: plugins/sudoers/ldap_util.c:531 plugins/sudoers/ldap_util.c:541
+#: plugins/sudoers/ldap_util.c:549
#, c-format
msgid "duplicate sudoOption: %s%s%s"
msgstr "duplicerad sudoOption: %s%s%s"
-#: plugins/sudoers/ldap_util.c:598 plugins/sudoers/ldap_util.c:600
+#: plugins/sudoers/ldap_util.c:568 plugins/sudoers/ldap_util.c:570
#, c-format
msgid "unable to convert sudoOption: %s%s%s"
msgstr "kan inte konvertera sudoOption: %s%s%s"
@@ -2309,107 +2818,111 @@ msgstr "kan inte öppna granskningssystem"
msgid "unable to send audit message"
msgstr "kan inte skicka granskningsmeddelande"
-#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391
-#: plugins/sudoers/log_client.c:1437 plugins/sudoers/log_client.c:2031
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "fel i händelseloop"
-#: plugins/sudoers/log_client.c:193
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "Skapande av nytt SSL_CTX-objekt misslyckades: %s"
-#: plugins/sudoers/log_client.c:216
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "kan inte läsa in certifikatauktoritetsbunt %s"
-#: plugins/sudoers/log_client.c:236
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "kan inte läsa in certifikat %s"
-#: plugins/sudoers/log_client.c:249
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "kan inte läsa in privat nyckel %s"
-#: plugins/sudoers/log_client.c:258
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "Kan inte allokera ssl-objekt: %s"
-#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "TLS-anslutning till %s:%s misslyckades: %s"
-#: plugins/sudoers/log_client.c:519
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "TLS-initiering misslyckades"
-#: plugins/sudoers/log_client.c:528
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "TLS-handskakning misslyckades"
-#: plugins/sudoers/log_client.c:1208
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: internt fel, ogiltig avslutningskod %d"
-#: plugins/sudoers/log_client.c:1724 plugins/sudoers/log_client.c:1748
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "förlorade kontakten med loggservern"
-#: plugins/sudoers/log_client.c:1825
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "saknar skrivbuffert"
-#: plugins/sudoers/log_client.c:1972
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "kan inte ansluta till loggserver"
-#: plugins/sudoers/logging.c:244
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "användare finns INTE i sudoers"
-#: plugins/sudoers/logging.c:246
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "användaren är INTE auktoriserad på värddatorn"
-#: plugins/sudoers/logging.c:248
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "kommandot tillåts inte"
-#: plugins/sudoers/logging.c:269
+#: plugins/sudoers/logging.c:315
#, 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"
+msgid "%s is not in the sudoers file.\n"
+msgstr "%s finns inte i sudoers-filen.\n"
-#: plugins/sudoers/logging.c:272
+#: plugins/sudoers/logging.c:318
#, 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"
+msgid "%s is not allowed to run sudo on %s.\n"
+msgstr "%s tillåts inte att köra sudo på %s.\n"
-#: plugins/sudoers/logging.c:276
+#: plugins/sudoers/logging.c:321
#, 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:279
+#: plugins/sudoers/logging.c:324
#, 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:316 plugins/sudoers/sudoers.c:575
-#: plugins/sudoers/sudoers.c:577 plugins/sudoers/sudoers.c:579
-#: plugins/sudoers/sudoers.c:581 plugins/sudoers/sudoers.c:723
-#: plugins/sudoers/sudoers.c:725
+#: plugins/sudoers/logging.c:334
+msgid "This incident has been reported to the administrator.\n"
+msgstr "Denna incident har rapporterats till administratören.\n"
+
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s: kommandot hittades inte"
-#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:571
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2418,37 +2931,46 @@ 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:337
+#: plugins/sudoers/logging.c:387
#, 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:393
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "autentiseringsfel"
-#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "ett lösenord krävs"
-#: plugins/sudoers/logging.c:739
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
+msgid "problem parsing sudoers"
+msgstr "problem vid tolkning av sudoers"
+
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
-msgid "unable to open log file: %s"
-msgstr "kan inte öppna loggfil: %s"
+msgid "%s:%d:%d: %s"
+msgstr "%s:%d:%d: %s"
-#: plugins/sudoers/logging.c:772
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "kan inte skriva till loggfil: %s"
-#: plugins/sudoers/match_digest.c:129
+#: plugins/sudoers/match_digest.c:112
+#, c-format
+msgid "digest for %s (%s) bad length %zu, expected %zu"
+msgstr "kontrollsumma för %s (%s) felaktig längd %zu, förväntade %zu"
+
+#: plugins/sudoers/match_digest.c:131
#, 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/parse.c:530
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2457,7 +2979,7 @@ msgstr ""
"\n"
"LDAP-roll: %s\n"
-#: plugins/sudoers/parse.c:533
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2465,110 +2987,110 @@ msgstr ""
"\n"
"Sudoers-post:\n"
-#: plugins/sudoers/parse.c:535
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " KörSomAnvändare: "
-#: plugins/sudoers/parse.c:550
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " KörSomGrupper: "
-#: plugins/sudoers/parse.c:560
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " Flaggor: "
-#: plugins/sudoers/parse.c:614
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " Kommandon:\n"
-#: plugins/sudoers/parse.c:805
+#: plugins/sudoers/parse.c:876
#, c-format
msgid "Matching Defaults entries for %s on %s:\n"
msgstr "Matchande standardposter för %s på %s:\n"
-#: plugins/sudoers/parse.c:823
+#: plugins/sudoers/parse.c:894
#, 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:841
+#: plugins/sudoers/parse.c:912
#, 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:856
+#: plugins/sudoers/parse.c:927
#, 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:616
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "hoppar över ofullständig sudoRole: cn: %s"
-#: plugins/sudoers/parse_ldif.c:676
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "ogiltigt LDIF-attribut: %s"
-#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:108
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr "ogiltigt %.*s inställt av sudo-framände"
-#: plugins/sudoers/policy.c:314 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "kan inte tolka nätverksadresslista"
-#: plugins/sudoers/policy.c:465
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr "användarnamn inte inställt av sudo-framände"
-#: plugins/sudoers/policy.c:469
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr "användar-ID inte inställt av sudo-framände"
-#: plugins/sudoers/policy.c:473
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr "grupp-ID inte inställt av sudo-framände"
-#: plugins/sudoers/policy.c:477
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr "värdnamn inte inställt av sudo-framände"
-#: plugins/sudoers/policy.c:660
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "ogiltig arbetskatalog: %s"
-#: plugins/sudoers/policy.c:828
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "ogiltig chroot-katalog: %s"
-#: plugins/sudoers/policy.c:963 plugins/sudoers/visudo.c:229
-#: plugins/sudoers/visudo.c:851
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "kan inte köra %s"
-#: plugins/sudoers/policy.c:1030 plugins/sudoers/policy.c:1067
-#: plugins/sudoers/policy.c:1089 plugins/sudoers/policy.c:1115
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: ogiltiga lägesflaggor från sudo-framände: 0x%x"
-#: plugins/sudoers/policy.c:1146
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "Sudoers policyinsticksmodul version %s\n"
-#: plugins/sudoers/policy.c:1148
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "Sudoers-filgrammatik version %d\n"
-#: plugins/sudoers/policy.c:1152
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -2577,137 +3099,137 @@ msgstr ""
"\n"
"Sökväg till sudoers: %s\n"
-#: plugins/sudoers/policy.c:1155
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "Sökväg till nsswitch: %s\n"
-#: plugins/sudoers/policy.c:1157
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "Sökväg till ldap.conf: %s\n"
-#: plugins/sudoers/policy.c:1158
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "Sökväg till ldap.secret: %s\n"
-#: plugins/sudoers/policy.c:1191
+#: plugins/sudoers/policy.c:1337
#, 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/policy.c:1209
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "kan inte avregistrera krok av typ %d (version %d.%d)"
-#: plugins/sudoers/pwutil.c:218 plugins/sudoers/pwutil.c:236
+#: 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:230
+#: 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:290 plugins/sudoers/pwutil.c:308
-#: plugins/sudoers/pwutil.c:371 plugins/sudoers/pwutil.c:416
+#: 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 cacha användare %s"
-#: plugins/sudoers/pwutil.c:303
+#: 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:535 plugins/sudoers/pwutil.c:553
+#: 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:547
+#: 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:601 plugins/sudoers/pwutil.c:619
-#: plugins/sudoers/pwutil.c:680 plugins/sudoers/pwutil.c:729
+#: plugins/sudoers/pwutil.c:605 plugins/sudoers/pwutil.c:623
+#: plugins/sudoers/pwutil.c:684 plugins/sudoers/pwutil.c:733
#, c-format
msgid "unable to cache group %s"
msgstr "kan inte cacha grupp %s"
-#: plugins/sudoers/pwutil.c:614
+#: plugins/sudoers/pwutil.c:618
#, c-format
msgid "unable to cache group %s, already exists"
msgstr "kan inte cacha grupp %s, finns redan"
-#: plugins/sudoers/pwutil.c:876 plugins/sudoers/pwutil.c:927
-#: plugins/sudoers/pwutil.c:977 plugins/sudoers/pwutil.c:1029
+#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:931
+#: plugins/sudoers/pwutil.c:981 plugins/sudoers/pwutil.c:1033
#, 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:882 plugins/sudoers/pwutil.c:932
-#: plugins/sudoers/pwutil.c:983 plugins/sudoers/pwutil.c:1034
+#: plugins/sudoers/pwutil.c:886 plugins/sudoers/pwutil.c:936
+#: plugins/sudoers/pwutil.c:987 plugins/sudoers/pwutil.c:1038
#, c-format
msgid "unable to cache group list for %s"
msgstr "kan inte cacha grupplista för %s"
-#: plugins/sudoers/pwutil.c:921
+#: plugins/sudoers/pwutil.c:925
#, c-format
msgid "unable to parse groups for %s"
msgstr "kan inte tolka grupper för %s"
-#: plugins/sudoers/pwutil.c:1023
+#: plugins/sudoers/pwutil.c:1027
#, c-format
msgid "unable to parse gids for %s"
msgstr "kan inte tolka gids för %s"
-#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441
-#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150
-#: plugins/sudoers/set_perms.c:1444
+#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:445
+#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1162
+#: plugins/sudoers/set_perms.c:1460
msgid "perm stack overflow"
msgstr "perm-stackspill"
-#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372
-#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711
-#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074
-#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377
-#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542
+#: plugins/sudoers/set_perms.c:125 plugins/sudoers/set_perms.c:376
+#: plugins/sudoers/set_perms.c:456 plugins/sudoers/set_perms.c:719
+#: plugins/sudoers/set_perms.c:863 plugins/sudoers/set_perms.c:1086
+#: plugins/sudoers/set_perms.c:1173 plugins/sudoers/set_perms.c:1393
+#: plugins/sudoers/set_perms.c:1471 plugins/sudoers/set_perms.c:1562
msgid "perm stack underflow"
msgstr "perm-stackunderspill"
-#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495
-#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485
+#: plugins/sudoers/set_perms.c:185 plugins/sudoers/set_perms.c:503
+#: plugins/sudoers/set_perms.c:1227 plugins/sudoers/set_perms.c:1505
msgid "unable to change to root gid"
msgstr "kan inte ändra till root-gid"
-#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592
-#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288
+#: plugins/sudoers/set_perms.c:276 plugins/sudoers/set_perms.c:600
+#: plugins/sudoers/set_perms.c:995 plugins/sudoers/set_perms.c:1304
msgid "unable to change to runas gid"
msgstr "kan inte ändra till runas-gid"
-#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597
-#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293
+#: plugins/sudoers/set_perms.c:281 plugins/sudoers/set_perms.c:605
+#: plugins/sudoers/set_perms.c:1000 plugins/sudoers/set_perms.c:1309
msgid "unable to set runas group vector"
msgstr "kan inte ställa in gruppvektor för runas"
-#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608
-#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302
+#: plugins/sudoers/set_perms.c:292 plugins/sudoers/set_perms.c:616
+#: plugins/sudoers/set_perms.c:1009 plugins/sudoers/set_perms.c:1318
msgid "unable to change to runas uid"
msgstr "kan inte ändra till runas-uid"
-#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626
-#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318
+#: plugins/sudoers/set_perms.c:310 plugins/sudoers/set_perms.c:634
+#: plugins/sudoers/set_perms.c:1025 plugins/sudoers/set_perms.c:1334
msgid "unable to change to sudoers gid"
msgstr "kan inte ändra till sudoers-gid"
-#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698
-#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364
-#: plugins/sudoers/set_perms.c:1529
+#: plugins/sudoers/set_perms.c:363 plugins/sudoers/set_perms.c:706
+#: plugins/sudoers/set_perms.c:1073 plugins/sudoers/set_perms.c:1380
+#: plugins/sudoers/set_perms.c:1549
msgid "too many processes"
msgstr "för många processer"
@@ -2725,263 +3247,261 @@ msgstr "trunkerad granskningssökväg user_cmnd: %s"
msgid "truncated audit path argv[0]: %s"
msgstr "trunkerad granskningssökväg argv[0]: %s"
-#: plugins/sudoers/sssd.c:572
+#: plugins/sudoers/sssd.c:579
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:580 plugins/sudoers/sssd.c:589
-#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607
-#: plugins/sudoers/sssd.c:616
+#: plugins/sudoers/sssd.c:587 plugins/sudoers/sssd.c:596
+#: plugins/sudoers/sssd.c:605 plugins/sudoers/sssd.c:614
+#: plugins/sudoers/sssd.c:623
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "kan inte hitta symbol â€%s†i %s"
-#: plugins/sudoers/sudoers.c:213 plugins/sudoers/sudoers.c:985
-msgid "problem with defaults entries"
-msgstr "problem med standardposter"
+#: plugins/sudoers/sudoers.c:263
+#, c-format
+msgid "unable to get defaults from %s"
+msgstr "kan inte hämta standardvärden från %s"
-#: plugins/sudoers/sudoers.c:217
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr "inga giltiga sudoers-källor hittades, avslutar"
-#: plugins/sudoers/sudoers.c:291
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "användare inte tillåten att ändra rotkatalog till %s"
-#: plugins/sudoers/sudoers.c:293
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "du tillåts inte att använda flaggan -R med %s"
-#: plugins/sudoers/sudoers.c:318
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "användare inte tillåten att ändra katalog till %s"
-#: plugins/sudoers/sudoers.c:319
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "du tillåts inte att använda flaggan -D med %s"
-#: plugins/sudoers/sudoers.c:345
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "inget kommando specificerat"
-#: plugins/sudoers/sudoers.c:355
+#: plugins/sudoers/sudoers.c:426
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:403
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "användare inte tillåten att åsidosätta closefrom-begränsning"
-#: plugins/sudoers/sudoers.c:404
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "du tillåts inte att använda flaggan -C"
-#: plugins/sudoers/sudoers.c:464
+#: plugins/sudoers/sudoers.c:537
#, 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:479
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "ingen tty"
-#: plugins/sudoers/sudoers.c:480
+#: plugins/sudoers/sudoers.c:553
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:487
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "ogiltigt skal för användare %s: %s"
-#: plugins/sudoers/sudoers.c:570
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "kommando i aktuell katalog"
-#: plugins/sudoers/sudoers.c:589
+#: plugins/sudoers/sudoers.c:658
+msgid "\"cd\" is a shell built-in command, it cannot be run directly."
+msgstr "â€cd†är ett inbyggt shell-kommando, det kan inte köras direkt."
+
+#: plugins/sudoers/sudoers.c:660
+msgid "the -s option may be used to run a privileged shell."
+msgstr "flaggan -s får inte användas för att köra ett privilegierat skal."
+
+#: plugins/sudoers/sudoers.c:662
+msgid "the -D option may be used to run a command in a specific directory."
+msgstr "flaggan -D får inte användas för att köra ett kommando i en specifik katalog."
+
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "användare inte tillåten att ställa in en tidsgräns för kommandon"
-#: plugins/sudoers/sudoers.c:591
+#: plugins/sudoers/sudoers.c:673
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:599
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "användare inte tillåten att behålla miljön"
-#: plugins/sudoers/sudoers.c:601
+#: plugins/sudoers/sudoers.c:683
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:936
-msgid "command too long"
-msgstr "kommandot för långt"
-
-#: plugins/sudoers/sudoers.c:973
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "sudoedit behöver inte köras via sudo"
-#: plugins/sudoers/sudoers.c:1032 plugins/sudoers/sudoreplay.c:1547
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "kan inte läsa %s"
-#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/visudo.c:426
-#: plugins/sudoers/visudo.c:720
-#, c-format
-msgid "unable to stat %s"
-msgstr "kan inte ta status på %s"
-
-#: plugins/sudoers/sudoers.c:1061 plugins/sudoers/visudo.c:1009
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%s är inte en vanlig fil"
-#: plugins/sudoers/sudoers.c:1065 plugins/sudoers/timestamp.c:252 toke.l:1138
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, 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:1069 toke.l:1143
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "%s är skrivbar för alla"
-#: plugins/sudoers/sudoers.c:1073 toke.l:1146
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, 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:1106
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "endast root kan använda â€-c %sâ€"
-#: plugins/sudoers/sudoers.c:1125
+#: plugins/sudoers/sudoers.c:1213
#, c-format
-msgid "unknown login class: %s"
-msgstr "okänd inloggningsklass: %s"
+msgid "unknown login class %s"
+msgstr "okänd inloggningsklass %s"
-#: plugins/sudoers/sudoers.c:1211 plugins/sudoers/sudoers.c:1226
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "kan inte slå upp värddatorn %s"
-#: plugins/sudoers/sudoreplay.c:257
+#: plugins/sudoers/sudoreplay.c:259
#, c-format
msgid "invalid filter option: %s"
msgstr "ogiltig filterflagga: %s"
-#: plugins/sudoers/sudoreplay.c:273
+#: plugins/sudoers/sudoreplay.c:275
#, c-format
msgid "invalid max wait: %s"
msgstr "ogiltig största väntan: %s"
-#: plugins/sudoers/sudoreplay.c:296
+#: plugins/sudoers/sudoreplay.c:298
#, c-format
msgid "invalid speed factor: %s"
msgstr "ogiltig hastighetsfaktor: %s"
-#: plugins/sudoers/sudoreplay.c:332
+#: plugins/sudoers/sudoreplay.c:333
+#, c-format
+msgid "invalid time offset %s"
+msgstr "ogiltigt värde för tidsavstånd %s"
+
+#: plugins/sudoers/sudoreplay.c:342
#, c-format
msgid "%s/%.2s/%.2s/%.2s: %s"
msgstr "%s/%.2s/%.2s/%.2s: %s"
-#: plugins/sudoers/sudoreplay.c:337
+#: plugins/sudoers/sudoreplay.c:347
#, c-format
msgid "%s/timing: %s"
msgstr "%s/tidsmätning: %s"
-#: plugins/sudoers/sudoreplay.c:341
-#, c-format
-msgid "%s/%s: %s"
-msgstr "%s/%s: %s"
-
-#: plugins/sudoers/sudoreplay.c:365
+#: plugins/sudoers/sudoreplay.c:375
#, c-format
msgid "Replaying sudo session: %s"
msgstr "Spelar upp sudo-session: %s"
-#: plugins/sudoers/sudoreplay.c:627
+#: plugins/sudoers/sudoreplay.c:637
msgid "unable to set tty to raw mode"
msgstr "kan inte ställa in tty i råläge"
-#: plugins/sudoers/sudoreplay.c:678
+#: plugins/sudoers/sudoreplay.c:688
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:679
+#: plugins/sudoers/sudoreplay.c:689
#, 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:707
+#: plugins/sudoers/sudoreplay.c:717
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:1197 plugins/sudoers/sudoreplay.c:1227
+#: plugins/sudoers/sudoreplay.c:1219 plugins/sudoers/sudoreplay.c:1249
#, c-format
msgid "ambiguous expression \"%s\""
msgstr "tvetydigt uttryck â€%sâ€"
-#: plugins/sudoers/sudoreplay.c:1249
+#: plugins/sudoers/sudoreplay.c:1271
msgid "unmatched ')' in expression"
msgstr "omatchat â€)†i uttryck"
-#: plugins/sudoers/sudoreplay.c:1253
+#: plugins/sudoers/sudoreplay.c:1275
#, c-format
msgid "unknown search term \"%s\""
msgstr "okänt sökvillkor â€%sâ€"
-#: plugins/sudoers/sudoreplay.c:1268
+#: plugins/sudoers/sudoreplay.c:1290
#, c-format
msgid "%s requires an argument"
msgstr "%s kräver ett argument"
-#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523
-#, c-format
-msgid "invalid regular expression: %s"
-msgstr "ogiltigt reguljärt uttryck: %s"
-
-#: plugins/sudoers/sudoreplay.c:1276
+#: plugins/sudoers/sudoreplay.c:1300
#, c-format
msgid "could not parse date \"%s\""
msgstr "kunde inte tolka datumet â€%sâ€"
-#: plugins/sudoers/sudoreplay.c:1285
+#: plugins/sudoers/sudoreplay.c:1309
msgid "unmatched '(' in expression"
msgstr "omatchat â€(†i uttryck"
-#: plugins/sudoers/sudoreplay.c:1287
+#: plugins/sudoers/sudoreplay.c:1311
msgid "illegal trailing \"or\""
msgstr "ogiltigt avslutande â€orâ€"
-#: plugins/sudoers/sudoreplay.c:1289
+#: plugins/sudoers/sudoreplay.c:1313
msgid "illegal trailing \"!\""
msgstr "ogiltigt efterföljande â€!â€"
-#: plugins/sudoers/sudoreplay.c:1347
+#: plugins/sudoers/sudoreplay.c:1371
#, c-format
msgid "unknown search type %d"
msgstr "okänd söktyp %d"
-#: plugins/sudoers/sudoreplay.c:1614
+#: plugins/sudoers/sudoreplay.c:1650
#, 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:1617
+#: plugins/sudoers/sudoreplay.c:1652
#, 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:1626
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -2990,7 +3510,7 @@ msgstr ""
"%s - spela upp loggar från sudo-session\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1628
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3046,127 +3566,123 @@ msgstr ""
"\n"
"Kommando omatchat"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%s är skrivbar för gruppen"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, c-format
msgid "unable to truncate time stamp file to %lld bytes"
msgstr "kan inte trunkera tidsstämpelfil till %lld byte"
-#: plugins/sudoers/timestamp.c:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "ignorerar tidsstämpel från framtiden"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, 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:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "kan inte låsa tidsstämpelfil %s"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, 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/toke_util.c:150
+#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "sudoedit ska inte anges med en sökväg"
-#: plugins/sudoers/visudo.c:224
+#: plugins/sudoers/visudo.c:254
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:226
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "överväg att använda verktyget cvtsudoers istället"
-#: plugins/sudoers/visudo.c:277 plugins/sudoers/visudo.c:653
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "tryck på retur för att redigera %s: "
-#: plugins/sudoers/visudo.c:338
+#: plugins/sudoers/visudo.c:326
+#, c-format
+msgid "contents of edit session left in %s"
+msgstr "innehållet från redigeringssessionen lämnat i %s"
+
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "angiven redigerare (%s) finns inte"
-#: plugins/sudoers/visudo.c:340
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "ingen textredigerare hittad (sökväg för textredigerare = %s)"
-#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:454
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "kan inte ta status på %s"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "skrivfel"
-#: plugins/sudoers/visudo.c:500
+#: plugins/sudoers/visudo.c:565
#, 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:507
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr "temporärfil tom (%s), %s oförändrad"
-#: plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "redigeraren (%s) misslyckades, %s är oförändrad"
-#: plugins/sudoers/visudo.c:535
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s oförändrad"
-#: plugins/sudoers/visudo.c:592
+#: plugins/sudoers/visudo.c:645
#, c-format
msgid "unable to re-open temporary file (%s), %s unchanged."
msgstr "kan inte återöppna temporärfil (%s), %s är oförändrad."
-#: plugins/sudoers/visudo.c:604
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "kan inte tolka temporärfil (%s), okänt fel"
-#: plugins/sudoers/visudo.c:642
-#, c-format
-msgid "internal error, unable to find %s in list!"
-msgstr "internt fel, kan inte hitta %s i listan!"
-
-#: plugins/sudoers/visudo.c:722 plugins/sudoers/visudo.c:731
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, c-format
msgid "unable to set (uid, gid) of %s to (%u, %u)"
msgstr "kan inte ställa in (uid, gid) för %s till (%u, %u)"
-#: plugins/sudoers/visudo.c:754
+#: plugins/sudoers/visudo.c:809
#, 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:765
+#: plugins/sudoers/visudo.c:820
#, 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:775
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "fel vid namnbyte för %s, %s är oförändrad"
-#: plugins/sudoers/visudo.c:796
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "Nu då? "
-#: plugins/sudoers/visudo.c:810
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3178,46 +3694,41 @@ msgstr ""
" avsluta (x) utan att spara ändringar i sudoers-filen\n"
" Avsluta (Q) och spara ändringar i sudoers-filen (FARLIGT!)\n"
-#: plugins/sudoers/visudo.c:856
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "kan inte köra %s"
-#: plugins/sudoers/visudo.c:886
+#: plugins/sudoers/visudo.c:938
#, 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:893
+#: plugins/sudoers/visudo.c:949
#, 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:942 plugins/sudoers/visudo.c:949
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: tolkad OK\n"
-#: plugins/sudoers/visudo.c:968
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%s är upptagen, försök igen senare"
-#: plugins/sudoers/visudo.c:971
-#, c-format
-msgid "unable to lock %s"
-msgstr "kan inte låsa %s"
-
-#: plugins/sudoers/visudo.c:972
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "Redigera ändå? [y/N]"
-#: plugins/sudoers/visudo.c:1067
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "Varning: %s:%d:%d: oanvänd %s â€%sâ€"
-#: plugins/sudoers/visudo.c:1183
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3226,13 +3737,14 @@ msgstr ""
"%s - redigera sudoers-filen på ett säkert sätt\n"
"\n"
-#: plugins/sudoers/visudo.c:1185
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"
@@ -3242,38 +3754,112 @@ msgstr ""
" -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"
+" -I, --no-includes redigera inte include-filer\n"
" -q, --quiet mindre utförliga (tysta) syntaxfelmeddelanden\n"
" -s, --strict strikt syntaxkontroll\n"
" -V, --version visa versionsinformation och avsluta\n"
-#: toke.l:187
+#: toke.l:189
msgid "empty string"
msgstr "tom sträng"
-#: toke.l:199 toke.l:503
+#: toke.l:201 toke.l:571
msgid "empty group"
msgstr "tom grupp"
-#: toke.l:209 toke.l:501
+#: toke.l:211 toke.l:569
msgid "empty netgroup"
msgstr "tom nätgrupp"
-#: toke.l:305 toke.l:317 toke.l:329 toke.l:345 toke.l:364 toke.l:404
+#: toke.l:289
+msgid "unterminated regular expression"
+msgstr "oavslutat reguljärt uttryck"
+
+#: toke.l:363 toke.l:375 toke.l:387 toke.l:403 toke.l:422 toke.l:462
msgid "invalid line continuation"
msgstr "ogiltig radfortsättning"
-#: toke.l:540 toke.l:552
+#: toke.l:608 toke.l:620
msgid "invalid IPv6 address"
msgstr "ogiltig IPv6-adress"
-#: toke.l:779
+#: toke.l:868
msgid "unexpected line break in string"
msgstr "oväntad radbrytning i sträng"
-#: toke.l:1109
+#: toke.l:1218
msgid "too many levels of includes"
msgstr "för många nivåer av inkluderingar"
+#~ msgid "%s:%d unknown key: %s"
+#~ msgstr "%s:%d okänd nyckel: %s"
+
+#~ msgid "%s: write buffer already in use"
+#~ msgstr "%s: skrivbuffert används redan"
+
+#~ msgid "unable to read diffie-hellman parameters: %s"
+#~ msgstr "kunde inte läsa diffie-hellman-parametrar: %s"
+
+#~ msgid "Error: %s:%d:%d: cycle in %s \"%s\""
+#~ msgstr "Fel: %s:%d:%d: cykel i %s â€%sâ€"
+
+#~ msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
+#~ msgstr "Varning: %s:%d:%d: cykel i %s â€%sâ€"
+
+#~ msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
+#~ msgstr "Fel: %s:%d:%d: %s â€%s†refererad till men inte definierad"
+
+#~ msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
+#~ msgstr "Varning: %s:%d:%d: %s â€%s†refererad till men inte definierad"
+
+#~ msgid "parse error in %s near line %d\n"
+#~ msgstr "tolkningsfel i %s nära rad %d\n"
+
+#~ msgid "parse error in %s\n"
+#~ msgstr "tolkningsfel i %s\n"
+
+#~ msgid "%s: unknown defaults entry \"%s\""
+#~ msgstr "%s: okänd standardpost â€%sâ€"
+
+#~ msgid "%s:%d:%d: no value specified for \"%s\""
+#~ msgstr "%s:%d:%d: inget värde angivet för â€%sâ€"
+
+#~ msgid "%s:%d:%d: option \"%s\" does not take a value"
+#~ msgstr "%s:%d:%d: flaggan â€%s†tar inte emot nÃ¥got värde"
+
+#~ msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
+#~ msgstr "%s:%d:%d: värdet â€%s†är ogiltigt för flaggan â€%sâ€"
+
+#~ msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
+#~ msgstr "%s:%d:%d: värden för â€%s†mÃ¥ste börja med ett â€/â€, â€~†eller â€*â€"
+
+#~ msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
+#~ msgstr "%s:%d:%d: värden för â€%s†mÃ¥ste börja med ett â€/â€"
+
+#~ msgid "parse error in %s near line %d"
+#~ msgstr "tolkningsfel i %s nära rad %d"
+
+#~ msgid "parse error in %s"
+#~ msgstr "tolkningsfel i %s"
+
+#~ 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"
+
+#~ 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"
+
+#~ msgid "problem with defaults entries"
+#~ msgstr "problem med standardposter"
+
+#~ msgid "%s is group writable"
+#~ msgstr "%s är skrivbar för gruppen"
+
+#~ msgid "lecture status path too long: %s/%s"
+#~ msgstr "sökväg för lektionsstatus för lång: %s/%s"
+
+#~ msgid "internal error, unable to find %s in list!"
+#~ msgstr "internt fel, kan inte hitta %s i listan!"
+
#~ msgid "%s:%u unable to parse \"%s\""
#~ msgstr "%s:%u kan inte tolka â€%sâ€"
@@ -3429,12 +4015,6 @@ msgstr "för många nivåer av inkluderingar"
#~ "\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"
diff --git a/plugins/sudoers/po/uk.mo b/plugins/sudoers/po/uk.mo
index 61db98214..39da58385 100644
--- a/plugins/sudoers/po/uk.mo
+++ b/plugins/sudoers/po/uk.mo
Binary files differ
diff --git a/plugins/sudoers/po/uk.po b/plugins/sudoers/po/uk.po
index 3612f8803..ae3844bc0 100644
--- a/plugins/sudoers/po/uk.po
+++ b/plugins/sudoers/po/uk.po
@@ -4,10 +4,10 @@
# Yuri Chornoivan <yurchor@ukr.net>, 2011-2021, 2022.
msgid ""
msgstr ""
-"Project-Id-Version: sudoers 1.9.11b1\n"
+"Project-Id-Version: sudoers 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 12:13+0300\n"
+"POT-Creation-Date: 2022-10-10 09:13-0600\n"
+"PO-Revision-Date: 2022-10-11 12:21+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
@@ -18,7 +18,7 @@ msgstr ""
"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 20.12.0\n"
-#: confstr.sh:1 gram.y:1218
+#: confstr.sh:1 gram.y:1220 plugins/sudoers/logging.c:862
msgid "syntax error"
msgstr "ÑинтакÑична помилка"
@@ -42,13 +42,13 @@ msgstr "*** Дані щодо ЗÐХИСТУ %h ***"
msgid "Sorry, try again."
msgstr "Вибачте, повторіть Ñпробу."
-#: gram.y:236 gram.y:303 gram.y:312 gram.y:321 gram.y:331 gram.y:341
-#: gram.y:365 gram.y:392 gram.y:401 gram.y:409 gram.y:418 gram.y:427
-#: gram.y:501 gram.y:511 gram.y:523 gram.y:571 gram.y:580 gram.y:589
-#: gram.y:598 gram.y:730 gram.y:738 gram.y:749 gram.y:761 gram.y:780
-#: gram.y:943 gram.y:948 gram.y:956 gram.y:970 gram.y:976 gram.y:1098
-#: gram.y:1107 gram.y:1115 gram.y:1124 gram.y:1133 gram.y:1162 gram.y:1171
-#: gram.y:1179 gram.y:1272 gram.y:1402 gram.y:1769 gram.y:1816
+#: gram.y:237 gram.y:304 gram.y:313 gram.y:322 gram.y:332 gram.y:342
+#: gram.y:366 gram.y:393 gram.y:402 gram.y:410 gram.y:419 gram.y:428
+#: gram.y:502 gram.y:512 gram.y:524 gram.y:572 gram.y:581 gram.y:590
+#: gram.y:599 gram.y:731 gram.y:739 gram.y:750 gram.y:762 gram.y:781
+#: gram.y:944 gram.y:949 gram.y:957 gram.y:971 gram.y:977 gram.y:1099
+#: gram.y:1108 gram.y:1116 gram.y:1125 gram.y:1134 gram.y:1163 gram.y:1172
+#: gram.y:1180 gram.y:1280 gram.y:1410 gram.y:1777 gram.y:1827
#: lib/eventlog/eventlog.c:309 lib/eventlog/eventlog.c:382
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:904
#: lib/eventlog/eventlog.c:1204 lib/iolog/iolog_filter.c:142
@@ -58,50 +58,64 @@ msgstr "Вибачте, повторіть Ñпробу."
#: lib/iolog/iolog_legacy.c:100 lib/iolog/iolog_legacy.c:111
#: lib/iolog/iolog_legacy.c:123 lib/iolog/iolog_legacy.c:133
#: lib/iolog/iolog_legacy.c:139 lib/iolog/iolog_loginfo.c:76
-#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:84
-#: logsrvd/iolog_writer.c:89 logsrvd/iolog_writer.c:123
-#: logsrvd/iolog_writer.c:172 logsrvd/iolog_writer.c:212
-#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:261
-#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:301
-#: logsrvd/iolog_writer.c:314 logsrvd/iolog_writer.c:327
-#: logsrvd/iolog_writer.c:340 logsrvd/iolog_writer.c:355
-#: logsrvd/iolog_writer.c:393 logsrvd/iolog_writer.c:399
-#: logsrvd/iolog_writer.c:406 logsrvd/iolog_writer.c:412
-#: logsrvd/iolog_writer.c:596 logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296
-#: logsrvd/logsrvd.c:305 logsrvd/logsrvd.c:1012 logsrvd/logsrvd.c:1075
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:203 logsrvd/logsrvd_journal.c:204
-#: logsrvd/logsrvd_journal.c:260 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_journal.c:422 logsrvd/logsrvd_local.c:174
-#: logsrvd/logsrvd_local.c:175 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:238 logsrvd/logsrvd_local.c:376
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:426
-#: logsrvd/logsrvd_local.c:431 logsrvd/logsrvd_local.c:432
-#: logsrvd/logsrvd_queue.c:154 logsrvd/logsrvd_queue.c:184
-#: logsrvd/logsrvd_queue.c:261 logsrvd/logsrvd_relay.c:439
-#: logsrvd/logsrvd_relay.c:738 logsrvd/logsrvd_relay.c:845
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 plugins/sudoers/audit.c:116
-#: plugins/sudoers/auth/bsdauth.c:150 plugins/sudoers/auth/kerb5.c:121
-#: plugins/sudoers/auth/kerb5.c:148 plugins/sudoers/auth/pam.c:687
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/check_aliases.c:168 plugins/sudoers/cvtsudoers.c:131
-#: plugins/sudoers/cvtsudoers.c:175 plugins/sudoers/cvtsudoers.c:192
-#: plugins/sudoers/cvtsudoers.c:203 plugins/sudoers/cvtsudoers.c:333
-#: plugins/sudoers/cvtsudoers.c:372 plugins/sudoers/cvtsudoers.c:392
-#: plugins/sudoers/cvtsudoers.c:537 plugins/sudoers/cvtsudoers.c:670
-#: plugins/sudoers/cvtsudoers.c:688 plugins/sudoers/cvtsudoers.c:862
-#: plugins/sudoers/cvtsudoers.c:870 plugins/sudoers/cvtsudoers.c:1365
-#: plugins/sudoers/cvtsudoers.c:1369 plugins/sudoers/cvtsudoers.c:1471
-#: plugins/sudoers/cvtsudoers_csv.c:183 plugins/sudoers/cvtsudoers_csv.c:246
-#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151
-#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235
-#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:376
-#: plugins/sudoers/cvtsudoers_ldif.c:430 plugins/sudoers/cvtsudoers_ldif.c:438
-#: plugins/sudoers/cvtsudoers_ldif.c:449 plugins/sudoers/cvtsudoers_ldif.c:456
-#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:481
-#: plugins/sudoers/cvtsudoers_ldif.c:489 plugins/sudoers/cvtsudoers_ldif.c:636
-#: plugins/sudoers/cvtsudoers_merge.c:47 plugins/sudoers/cvtsudoers_merge.c:52
+#: lib/iolog/iolog_loginfo.c:212 logsrvd/iolog_writer.c:95
+#: logsrvd/iolog_writer.c:100 logsrvd/iolog_writer.c:134
+#: logsrvd/iolog_writer.c:182 logsrvd/iolog_writer.c:215
+#: logsrvd/iolog_writer.c:225 logsrvd/iolog_writer.c:254
+#: logsrvd/iolog_writer.c:275 logsrvd/iolog_writer.c:287
+#: logsrvd/iolog_writer.c:297 logsrvd/iolog_writer.c:307
+#: logsrvd/iolog_writer.c:317 logsrvd/iolog_writer.c:329
+#: logsrvd/iolog_writer.c:364 logsrvd/iolog_writer.c:370
+#: logsrvd/iolog_writer.c:377 logsrvd/iolog_writer.c:383
+#: logsrvd/iolog_writer.c:567 logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301
+#: logsrvd/logsrvd.c:310 logsrvd/logsrvd.c:1050 logsrvd/logsrvd.c:1113
+#: logsrvd/logsrvd.c:1582 logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771
+#: logsrvd/logsrvd.c:1988 logsrvd/logsrvd_conf.c:357
+#: logsrvd/logsrvd_conf.c:370 logsrvd/logsrvd_conf.c:511
+#: logsrvd/logsrvd_conf.c:534 logsrvd/logsrvd_conf.c:538
+#: logsrvd/logsrvd_conf.c:556 logsrvd/logsrvd_conf.c:626
+#: logsrvd/logsrvd_conf.c:650 logsrvd/logsrvd_conf.c:678
+#: logsrvd/logsrvd_conf.c:692 logsrvd/logsrvd_conf.c:706
+#: logsrvd/logsrvd_conf.c:720 logsrvd/logsrvd_conf.c:734
+#: logsrvd/logsrvd_conf.c:748 logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1053
+#: logsrvd/logsrvd_conf.c:1448 logsrvd/logsrvd_conf.c:1595
+#: logsrvd/logsrvd_conf.c:1621 logsrvd/logsrvd_conf.c:1633
+#: logsrvd/logsrvd_conf.c:1640 logsrvd/logsrvd_conf.c:1646
+#: logsrvd/logsrvd_conf.c:1743 logsrvd/logsrvd_journal.c:75
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:214
+#: logsrvd/logsrvd_journal.c:270 logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:432 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:216 logsrvd/logsrvd_local.c:278
+#: logsrvd/logsrvd_local.c:279 logsrvd/logsrvd_local.c:417
+#: logsrvd/logsrvd_local.c:466 logsrvd/logsrvd_local.c:467
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:473
+#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/logsrvd_relay.c:444
+#: logsrvd/logsrvd_relay.c:743 logsrvd/logsrvd_relay.c:850
+#: logsrvd/sendlog.c:251 logsrvd/sendlog.c:260 logsrvd/sendlog.c:291
+#: logsrvd/sendlog.c:338 logsrvd/sendlog.c:615 logsrvd/sendlog.c:1801
+#: plugins/sudoers/audit.c:116 plugins/sudoers/auth/bsdauth.c:150
+#: plugins/sudoers/auth/kerb5.c:121 plugins/sudoers/auth/kerb5.c:148
+#: plugins/sudoers/auth/pam.c:687 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/check_aliases.c:168
+#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:175
+#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:203
+#: plugins/sudoers/cvtsudoers.c:333 plugins/sudoers/cvtsudoers.c:372
+#: plugins/sudoers/cvtsudoers.c:392 plugins/sudoers/cvtsudoers.c:537
+#: plugins/sudoers/cvtsudoers.c:670 plugins/sudoers/cvtsudoers.c:688
+#: plugins/sudoers/cvtsudoers.c:862 plugins/sudoers/cvtsudoers.c:870
+#: plugins/sudoers/cvtsudoers.c:1365 plugins/sudoers/cvtsudoers.c:1369
+#: plugins/sudoers/cvtsudoers.c:1471 plugins/sudoers/cvtsudoers_csv.c:183
+#: plugins/sudoers/cvtsudoers_csv.c:246 plugins/sudoers/cvtsudoers_json.c:76
+#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194
+#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300
+#: plugins/sudoers/cvtsudoers_ldif.c:376 plugins/sudoers/cvtsudoers_ldif.c:430
+#: plugins/sudoers/cvtsudoers_ldif.c:438 plugins/sudoers/cvtsudoers_ldif.c:449
+#: plugins/sudoers/cvtsudoers_ldif.c:456 plugins/sudoers/cvtsudoers_ldif.c:468
+#: plugins/sudoers/cvtsudoers_ldif.c:481 plugins/sudoers/cvtsudoers_ldif.c:489
+#: plugins/sudoers/cvtsudoers_ldif.c:636 plugins/sudoers/cvtsudoers_merge.c:47
+#: plugins/sudoers/cvtsudoers_merge.c:52
#: plugins/sudoers/cvtsudoers_merge.c:353
#: plugins/sudoers/cvtsudoers_merge.c:399
#: plugins/sudoers/cvtsudoers_merge.c:446
@@ -111,11 +125,11 @@ msgstr "Вибачте, повторіть Ñпробу."
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1158
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:228
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -124,124 +138,125 @@ msgstr "Вибачте, повторіть Ñпробу."
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:688
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:294
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:689
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:294
#: plugins/sudoers/ldap_util.c:301 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:397 plugins/sudoers/log_client.c:710
-#: plugins/sudoers/log_client.c:731 plugins/sudoers/log_client.c:1451
-#: plugins/sudoers/log_client.c:1672 plugins/sudoers/log_client.c:2003
-#: plugins/sudoers/log_client.c:2059 plugins/sudoers/logging.c:112
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/match_command.c:333 plugins/sudoers/match_command.c:594
-#: plugins/sudoers/match_command.c:645 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:767 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:227 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:282
-#: plugins/sudoers/parse.c:299 plugins/sudoers/parse.c:322
-#: plugins/sudoers/parse.c:333 plugins/sudoers/parse_ldif.c:153
-#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253
-#: plugins/sudoers/parse_ldif.c:261 plugins/sudoers/parse_ldif.c:266
-#: plugins/sudoers/parse_ldif.c:342 plugins/sudoers/parse_ldif.c:353
-#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:397
-#: plugins/sudoers/parse_ldif.c:409 plugins/sudoers/parse_ldif.c:413
-#: plugins/sudoers/parse_ldif.c:427 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:627
-#: plugins/sudoers/parse_ldif.c:652 plugins/sudoers/parse_ldif.c:710
-#: plugins/sudoers/parse_ldif.c:727 plugins/sudoers/parse_ldif.c:755
-#: plugins/sudoers/parse_ldif.c:762 plugins/sudoers/policy.c:606
-#: plugins/sudoers/policy.c:998 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270
-#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522
-#: plugins/sudoers/pwutil.c:587 plugins/sudoers/pwutil.c:659
-#: plugins/sudoers/pwutil.c:857 plugins/sudoers/pwutil.c:913
-#: plugins/sudoers/pwutil.c:957 plugins/sudoers/pwutil.c:1014
-#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:185
-#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
-#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
-#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:715
+#: plugins/sudoers/log_client.c:736 plugins/sudoers/log_client.c:1416
+#: plugins/sudoers/log_client.c:1537 plugins/sudoers/log_client.c:1637
+#: plugins/sudoers/log_client.c:1973 plugins/sudoers/log_client.c:2032
+#: plugins/sudoers/logging.c:110 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/match_command.c:335
+#: plugins/sudoers/match_command.c:603 plugins/sudoers/match_command.c:654
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:776
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:227
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:282 plugins/sudoers/parse.c:299
+#: plugins/sudoers/parse.c:322 plugins/sudoers/parse.c:333
+#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184
+#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:261
+#: plugins/sudoers/parse_ldif.c:266 plugins/sudoers/parse_ldif.c:342
+#: plugins/sudoers/parse_ldif.c:353 plugins/sudoers/parse_ldif.c:380
+#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:409
+#: plugins/sudoers/parse_ldif.c:413 plugins/sudoers/parse_ldif.c:427
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:628 plugins/sudoers/parse_ldif.c:653
+#: plugins/sudoers/parse_ldif.c:711 plugins/sudoers/parse_ldif.c:728
+#: plugins/sudoers/parse_ldif.c:756 plugins/sudoers/parse_ldif.c:763
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
+#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
+#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
+#: plugins/sudoers/pwutil.c:659 plugins/sudoers/pwutil.c:857
+#: plugins/sudoers/pwutil.c:913 plugins/sudoers/pwutil.c:957
+#: plugins/sudoers/pwutil.c:1014 plugins/sudoers/sssd.c:145
+#: plugins/sudoers/sssd.c:185 plugins/sudoers/sssd.c:414
+#: plugins/sudoers/sssd.c:479 plugins/sudoers/sssd.c:505
+#: plugins/sudoers/sssd.c:568 plugins/sudoers/sssd.c:761
+#: plugins/sudoers/strvec_join.c:53 plugins/sudoers/stubs.c:112
+#: plugins/sudoers/stubs.c:120 plugins/sudoers/sudoers.c:354
+#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:448
+#: plugins/sudoers/sudoers.c:457 plugins/sudoers/sudoers.c:498
+#: plugins/sudoers/sudoers.c:827 plugins/sudoers/sudoers.c:877
+#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/sudoers.c:1075
+#: plugins/sudoers/sudoers.c:1330 plugins/sudoers/sudoreplay.c:562
#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
+#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:588
+#: plugins/sudoers/timestamp.c:451 plugins/sudoers/timestamp.c:495
+#: plugins/sudoers/timestamp.c:1017 plugins/sudoers/timestamp.c:1146
#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:161
#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1226
+#: plugins/sudoers/visudo.c:150 plugins/sudoers/visudo.c:385
+#: plugins/sudoers/visudo.c:391 plugins/sudoers/visudo.c:498
+#: plugins/sudoers/visudo.c:1054 toke.l:1023 toke.l:1155 toke.l:1226
msgid "unable to allocate memory"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ потрібний об’єм пам’ÑÑ‚Ñ–"
-#: gram.y:622
+#: gram.y:623
msgid "a digest requires a path name"
msgstr "Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми Ñлід вказати шлÑÑ…"
-#: gram.y:644
+#: gram.y:645
msgid "values for \"CWD\" must start with a '/', '~', or '*'"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«CWD» мають починатиÑÑ Ð· «/», «~» або «*»"
-#: gram.y:650
+#: gram.y:651
msgid "\"CWD\" path too long"
msgstr "ШлÑÑ… «CWD» Ñ” надто довгим"
-#: gram.y:660
+#: gram.y:661
msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«CHROOT» мають починатиÑÑ Ð· «/», «~» або «*»"
-#: gram.y:666
+#: gram.y:667
msgid "\"CHROOT\" path too long"
msgstr "ШлÑÑ… «CHROOT» Ñ” надто довгим"
-#: gram.y:801
+#: gram.y:802
#, c-format
msgid "syntax error, reserved word %s used as an alias name"
msgstr "ÑинтакÑична помилка, Ñк назву замінника викориÑтано зарезервоване Ñлово %s"
-#: gram.y:824
+#: gram.y:825
msgid "invalid notbefore value"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ notbefore"
-#: gram.y:833
+#: gram.y:834
msgid "invalid notafter value"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ notafter"
-#: gram.y:843 plugins/sudoers/policy.c:376
+#: gram.y:844 plugins/sudoers/policy.c:383
msgid "timeout value too large"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ” надто великим"
-#: gram.y:845 plugins/sudoers/policy.c:378
+#: gram.y:846 plugins/sudoers/policy.c:385
msgid "invalid timeout value"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу очікуваннÑ"
-#: gram.y:966 plugins/sudoers/sudoers.c:1014
+#: gram.y:967 plugins/sudoers/sudoers.c:1033
msgid "command too long"
msgstr "надто довга команда"
-#: gram.y:1220 plugins/sudoers/check_aliases.c:96
-#: plugins/sudoers/defaults.c:1275
+#: gram.y:1224 plugins/sudoers/check_aliases.c:96
+#: plugins/sudoers/defaults.c:1276
#, c-format
msgid "%s:%d:%d: %s\n"
msgstr "%s:%d:%d: %s\n"
-#: gram.y:1270
+#: gram.y:1278
#, c-format
msgid "Alias \"%s\" already defined"
msgstr "Замінник «%s» вже визначено"
-#: gram.y:1769 gram.y:1816 lib/eventlog/eventlog.c:309
+#: gram.y:1777 gram.y:1827 lib/eventlog/eventlog.c:309
#: lib/eventlog/eventlog.c:827 lib/eventlog/eventlog.c:900
#: lib/eventlog/eventlog.c:903 lib/eventlog/eventlog.c:1204
#: lib/iolog/iolog_filter.c:142 lib/iolog/iolog_filter.c:202
@@ -251,33 +266,48 @@ msgstr "Замінник «%s» вже визначено"
#: lib/iolog/iolog_legacy.c:111 lib/iolog/iolog_legacy.c:123
#: lib/iolog/iolog_legacy.c:133 lib/iolog/iolog_legacy.c:139
#: lib/iolog/iolog_loginfo.c:76 lib/iolog/iolog_loginfo.c:212
-#: logsrvd/iolog_writer.c:84 logsrvd/iolog_writer.c:89
-#: logsrvd/iolog_writer.c:123 logsrvd/iolog_writer.c:162
-#: logsrvd/iolog_writer.c:171 logsrvd/iolog_writer.c:189
-#: logsrvd/iolog_writer.c:211 logsrvd/iolog_writer.c:224
-#: logsrvd/iolog_writer.c:251 logsrvd/iolog_writer.c:260
-#: logsrvd/iolog_writer.c:276 logsrvd/iolog_writer.c:285
-#: logsrvd/iolog_writer.c:300 logsrvd/iolog_writer.c:313
-#: logsrvd/iolog_writer.c:326 logsrvd/iolog_writer.c:339
-#: logsrvd/iolog_writer.c:354 logsrvd/iolog_writer.c:393
-#: logsrvd/iolog_writer.c:399 logsrvd/iolog_writer.c:406
-#: logsrvd/iolog_writer.c:412 logsrvd/iolog_writer.c:596
-#: logsrvd/logsrv_util.c:64 logsrvd/logsrvd.c:296 logsrvd/logsrvd.c:305
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:593
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1403 logsrvd/logsrvd.c:1410
-#: logsrvd/logsrvd_conf.c:1443 logsrvd/logsrvd_journal.c:70
-#: logsrvd/logsrvd_journal.c:114 logsrvd/logsrvd_journal.c:203
-#: logsrvd/logsrvd_journal.c:233 logsrvd/logsrvd_journal.c:237
-#: logsrvd/logsrvd_journal.c:245 logsrvd/logsrvd_journal.c:268
-#: logsrvd/logsrvd_journal.c:272 logsrvd/logsrvd_journal.c:420
-#: logsrvd/logsrvd_local.c:174 logsrvd/logsrvd_local.c:237
-#: logsrvd/logsrvd_local.c:425 logsrvd/logsrvd_local.c:431
-#: logsrvd/logsrvd_local.c:450 logsrvd/logsrvd_queue.c:153
-#: logsrvd/logsrvd_queue.c:184 logsrvd/logsrvd_queue.c:261
-#: logsrvd/sendlog.c:246 logsrvd/sendlog.c:255 logsrvd/sendlog.c:333
-#: logsrvd/sendlog.c:640 logsrvd/sendlog.c:1526 logsrvd/sendlog.c:1533
-#: logsrvd/sendlog.c:1756 logsrvd/tls_init.c:299 logsrvd/tls_init.c:323
-#: logsrvd/tls_init.c:334 plugins/sudoers/audit.c:116
+#: logsrvd/iolog_writer.c:95 logsrvd/iolog_writer.c:100
+#: logsrvd/iolog_writer.c:134 logsrvd/iolog_writer.c:171
+#: logsrvd/iolog_writer.c:181 logsrvd/iolog_writer.c:194
+#: logsrvd/iolog_writer.c:214 logsrvd/iolog_writer.c:224
+#: logsrvd/iolog_writer.c:243 logsrvd/iolog_writer.c:253
+#: logsrvd/iolog_writer.c:264 logsrvd/iolog_writer.c:274
+#: logsrvd/iolog_writer.c:286 logsrvd/iolog_writer.c:296
+#: logsrvd/iolog_writer.c:306 logsrvd/iolog_writer.c:316
+#: logsrvd/iolog_writer.c:328 logsrvd/iolog_writer.c:364
+#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:377
+#: logsrvd/iolog_writer.c:383 logsrvd/iolog_writer.c:567
+#: logsrvd/logsrv_util.c:69 logsrvd/logsrvd.c:301 logsrvd/logsrvd.c:310
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:522
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:660
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:1124
+#: logsrvd/logsrvd.c:1439 logsrvd/logsrvd.c:1446 logsrvd/logsrvd.c:1582
+#: logsrvd/logsrvd.c:1587 logsrvd/logsrvd.c:1771 logsrvd/logsrvd.c:1988
+#: logsrvd/logsrvd_conf.c:357 logsrvd/logsrvd_conf.c:370
+#: logsrvd/logsrvd_conf.c:511 logsrvd/logsrvd_conf.c:534
+#: logsrvd/logsrvd_conf.c:538 logsrvd/logsrvd_conf.c:556
+#: logsrvd/logsrvd_conf.c:626 logsrvd/logsrvd_conf.c:649
+#: logsrvd/logsrvd_conf.c:678 logsrvd/logsrvd_conf.c:692
+#: logsrvd/logsrvd_conf.c:706 logsrvd/logsrvd_conf.c:720
+#: logsrvd/logsrvd_conf.c:734 logsrvd/logsrvd_conf.c:748
+#: logsrvd/logsrvd_conf.c:829 logsrvd/logsrvd_conf.c:1036
+#: logsrvd/logsrvd_conf.c:1053 logsrvd/logsrvd_conf.c:1448
+#: logsrvd/logsrvd_conf.c:1595 logsrvd/logsrvd_conf.c:1621
+#: logsrvd/logsrvd_conf.c:1633 logsrvd/logsrvd_conf.c:1640
+#: logsrvd/logsrvd_conf.c:1646 logsrvd/logsrvd_conf.c:1742
+#: logsrvd/logsrvd_journal.c:75 logsrvd/logsrvd_journal.c:122
+#: logsrvd/logsrvd_journal.c:213 logsrvd/logsrvd_journal.c:243
+#: logsrvd/logsrvd_journal.c:247 logsrvd/logsrvd_journal.c:255
+#: logsrvd/logsrvd_journal.c:278 logsrvd/logsrvd_journal.c:282
+#: logsrvd/logsrvd_journal.c:430 logsrvd/logsrvd_local.c:215
+#: logsrvd/logsrvd_local.c:278 logsrvd/logsrvd_local.c:466
+#: logsrvd/logsrvd_local.c:472 logsrvd/logsrvd_local.c:491
+#: logsrvd/logsrvd_queue.c:158 logsrvd/logsrvd_queue.c:189
+#: logsrvd/logsrvd_queue.c:266 logsrvd/sendlog.c:251 logsrvd/sendlog.c:260
+#: logsrvd/sendlog.c:291 logsrvd/sendlog.c:338 logsrvd/sendlog.c:615
+#: logsrvd/sendlog.c:1503 logsrvd/sendlog.c:1510 logsrvd/sendlog.c:1733
+#: logsrvd/sendlog.c:1801 logsrvd/tls_init.c:305 logsrvd/tls_init.c:329
+#: logsrvd/tls_init.c:340 plugins/sudoers/audit.c:116
#: plugins/sudoers/auth/pam.c:502 plugins/sudoers/auth/pam.c:687
#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/check_aliases.c:168
#: plugins/sudoers/cvtsudoers.c:131 plugins/sudoers/cvtsudoers.c:174
@@ -307,11 +337,11 @@ msgstr "Замінник «%s» вже визначено"
#: plugins/sudoers/cvtsudoers_merge.c:633
#: plugins/sudoers/cvtsudoers_merge.c:1157
#: plugins/sudoers/cvtsudoers_merge.c:1231 plugins/sudoers/defaults.c:434
-#: plugins/sudoers/defaults.c:657 plugins/sudoers/defaults.c:1018
-#: plugins/sudoers/defaults.c:1186 plugins/sudoers/editor.c:190
-#: plugins/sudoers/env.c:262 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/defaults.c:658 plugins/sudoers/defaults.c:1019
+#: plugins/sudoers/defaults.c:1187 plugins/sudoers/editor.c:188
+#: plugins/sudoers/env.c:263 plugins/sudoers/exptilde.c:92
#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:132
+#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:227
#: plugins/sudoers/interfaces.c:68 plugins/sudoers/iolog.c:268
#: plugins/sudoers/iolog.c:668 plugins/sudoers/iolog.c:694
#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:464
@@ -320,46 +350,47 @@ msgstr "Замінник «%s» вже визначено"
#: plugins/sudoers/ldap.c:1798 plugins/sudoers/ldap.c:1879
#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2115
#: plugins/sudoers/ldap.c:2131 plugins/sudoers/ldap_conf.c:218
-#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301
-#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:443
-#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:563
-#: plugins/sudoers/ldap_conf.c:596 plugins/sudoers/ldap_conf.c:687
-#: plugins/sudoers/ldap_conf.c:770 plugins/sudoers/ldap_util.c:293
+#: plugins/sudoers/ldap_conf.c:250 plugins/sudoers/ldap_conf.c:302
+#: plugins/sudoers/ldap_conf.c:338 plugins/sudoers/ldap_conf.c:444
+#: plugins/sudoers/ldap_conf.c:459 plugins/sudoers/ldap_conf.c:564
+#: plugins/sudoers/ldap_conf.c:597 plugins/sudoers/ldap_conf.c:688
+#: plugins/sudoers/ldap_conf.c:771 plugins/sudoers/ldap_util.c:293
#: plugins/sudoers/ldap_util.c:300 plugins/sudoers/ldap_util.c:614
-#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:112
-#: plugins/sudoers/log_client.c:223 plugins/sudoers/log_client.c:245
-#: plugins/sudoers/log_client.c:259 plugins/sudoers/log_client.c:397
-#: plugins/sudoers/log_client.c:710 plugins/sudoers/log_client.c:731
-#: plugins/sudoers/log_client.c:1451 plugins/sudoers/log_client.c:1672
-#: plugins/sudoers/log_client.c:2003 plugins/sudoers/log_client.c:2059
-#: plugins/sudoers/logging.c:112 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:193 plugins/sudoers/logging.c:461
-#: plugins/sudoers/logging.c:675 plugins/sudoers/logging.c:812
-#: plugins/sudoers/logging.c:882 plugins/sudoers/logging.c:894
-#: plugins/sudoers/match_command.c:332 plugins/sudoers/match_command.c:593
-#: plugins/sudoers/match_command.c:644 plugins/sudoers/match_command.c:719
-#: plugins/sudoers/match_command.c:766 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:226 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:281
-#: plugins/sudoers/parse.c:298 plugins/sudoers/parse.c:321
-#: plugins/sudoers/parse.c:332 plugins/sudoers/parse_ldif.c:152
-#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252
-#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265
-#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352
-#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396
-#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412
-#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:484
-#: plugins/sudoers/parse_ldif.c:597 plugins/sudoers/parse_ldif.c:626
-#: plugins/sudoers/parse_ldif.c:651 plugins/sudoers/parse_ldif.c:709
-#: plugins/sudoers/parse_ldif.c:726 plugins/sudoers/parse_ldif.c:754
-#: plugins/sudoers/parse_ldif.c:761 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:161 plugins/sudoers/policy.c:170
-#: plugins/sudoers/policy.c:198 plugins/sudoers/policy.c:361
-#: plugins/sudoers/policy.c:376 plugins/sudoers/policy.c:378
-#: plugins/sudoers/policy.c:414 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:471 plugins/sudoers/policy.c:481
+#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:117
+#: plugins/sudoers/log_client.c:228 plugins/sudoers/log_client.c:250
+#: plugins/sudoers/log_client.c:264 plugins/sudoers/log_client.c:402
+#: plugins/sudoers/log_client.c:715 plugins/sudoers/log_client.c:736
+#: plugins/sudoers/log_client.c:1416 plugins/sudoers/log_client.c:1537
+#: plugins/sudoers/log_client.c:1637 plugins/sudoers/log_client.c:1973
+#: plugins/sudoers/log_client.c:2032 plugins/sudoers/logging.c:110
+#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:189
+#: plugins/sudoers/logging.c:453 plugins/sudoers/logging.c:668
+#: plugins/sudoers/logging.c:805 plugins/sudoers/logging.c:876
+#: plugins/sudoers/logging.c:888 plugins/sudoers/match_command.c:334
+#: plugins/sudoers/match_command.c:602 plugins/sudoers/match_command.c:653
+#: plugins/sudoers/match_command.c:728 plugins/sudoers/match_command.c:775
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:226
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:262
+#: plugins/sudoers/parse.c:281 plugins/sudoers/parse.c:298
+#: plugins/sudoers/parse.c:321 plugins/sudoers/parse.c:332
+#: plugins/sudoers/parse_ldif.c:152 plugins/sudoers/parse_ldif.c:183
+#: plugins/sudoers/parse_ldif.c:252 plugins/sudoers/parse_ldif.c:260
+#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341
+#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379
+#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408
+#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426
+#: plugins/sudoers/parse_ldif.c:484 plugins/sudoers/parse_ldif.c:598
+#: plugins/sudoers/parse_ldif.c:627 plugins/sudoers/parse_ldif.c:652
+#: plugins/sudoers/parse_ldif.c:710 plugins/sudoers/parse_ldif.c:727
+#: plugins/sudoers/parse_ldif.c:755 plugins/sudoers/parse_ldif.c:762
+#: plugins/sudoers/policy.c:153 plugins/sudoers/policy.c:162
+#: plugins/sudoers/policy.c:171 plugins/sudoers/policy.c:199
+#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:383
+#: plugins/sudoers/policy.c:385 plugins/sudoers/policy.c:423
+#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:480
#: plugins/sudoers/policy.c:490 plugins/sudoers/policy.c:499
-#: plugins/sudoers/policy.c:606 plugins/sudoers/policy.c:998
+#: plugins/sudoers/policy.c:508 plugins/sudoers/policy.c:517
+#: plugins/sudoers/policy.c:624 plugins/sudoers/policy.c:1026
#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:199
#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348
#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:587
@@ -372,25 +403,25 @@ msgstr "Замінник «%s» вже визначено"
#: plugins/sudoers/sssd.c:414 plugins/sudoers/sssd.c:479
#: plugins/sudoers/sssd.c:505 plugins/sudoers/sssd.c:568
#: plugins/sudoers/sssd.c:761 plugins/sudoers/strvec_join.c:53
-#: plugins/sudoers/stubs.c:111 plugins/sudoers/stubs.c:119
-#: plugins/sudoers/sudoers.c:349 plugins/sudoers/sudoers.c:375
-#: plugins/sudoers/sudoers.c:443 plugins/sudoers/sudoers.c:452
-#: plugins/sudoers/sudoers.c:493 plugins/sudoers/sudoers.c:858
-#: plugins/sudoers/sudoers.c:996 plugins/sudoers/sudoers.c:1055
-#: plugins/sudoers/sudoers.c:1320 plugins/sudoers/sudoreplay.c:562
-#: plugins/sudoers/sudoreplay.c:565 plugins/sudoers/sudoreplay.c:1281
-#: plugins/sudoers/sudoreplay.c:1503 plugins/sudoers/sudoreplay.c:1507
-#: plugins/sudoers/testsudoers.c:120 plugins/sudoers/testsudoers.c:224
-#: plugins/sudoers/testsudoers.c:241 plugins/sudoers/testsudoers.c:581
-#: plugins/sudoers/timestamp.c:424 plugins/sudoers/timestamp.c:468
-#: plugins/sudoers/timestamp.c:980 plugins/sudoers/timestamp.c:1118
-#: plugins/sudoers/toke_util.c:78 plugins/sudoers/toke_util.c:106
-#: plugins/sudoers/toke_util.c:131 plugins/sudoers/toke_util.c:160
-#: plugins/sudoers/toke_util.c:200 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:148 plugins/sudoers/visudo.c:380
-#: plugins/sudoers/visudo.c:386 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:1048 toke.l:1023 toke.l:1155 toke.l:1218
-#: toke.l:1226
+#: plugins/sudoers/stubs.c:112 plugins/sudoers/stubs.c:120
+#: plugins/sudoers/sudoers.c:354 plugins/sudoers/sudoers.c:380
+#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:457
+#: plugins/sudoers/sudoers.c:498 plugins/sudoers/sudoers.c:827
+#: plugins/sudoers/sudoers.c:877 plugins/sudoers/sudoers.c:1015
+#: plugins/sudoers/sudoers.c:1075 plugins/sudoers/sudoers.c:1330
+#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:565
+#: plugins/sudoers/sudoreplay.c:1281 plugins/sudoers/sudoreplay.c:1503
+#: plugins/sudoers/sudoreplay.c:1507 plugins/sudoers/testsudoers.c:120
+#: plugins/sudoers/testsudoers.c:224 plugins/sudoers/testsudoers.c:241
+#: plugins/sudoers/testsudoers.c:588 plugins/sudoers/timestamp.c:451
+#: plugins/sudoers/timestamp.c:495 plugins/sudoers/timestamp.c:1017
+#: plugins/sudoers/timestamp.c:1146 plugins/sudoers/toke_util.c:78
+#: plugins/sudoers/toke_util.c:106 plugins/sudoers/toke_util.c:131
+#: plugins/sudoers/toke_util.c:160 plugins/sudoers/toke_util.c:200
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:150
+#: plugins/sudoers/visudo.c:385 plugins/sudoers/visudo.c:391
+#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:1054 toke.l:1023
+#: toke.l:1155 toke.l:1218 toke.l:1226
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
@@ -399,14 +430,14 @@ msgstr "%s: %s"
#: lib/iolog/iolog_json.c:568 lib/iolog/iolog_json.c:574
#: plugins/sudoers/cvtsudoers_csv.c:192 plugins/sudoers/cvtsudoers_csv.c:199
#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:251
-#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:326
-#: plugins/sudoers/env.c:333 plugins/sudoers/env.c:444
+#: plugins/sudoers/cvtsudoers_ldif.c:592 plugins/sudoers/env.c:340
+#: plugins/sudoers/env.c:347 plugins/sudoers/env.c:458
#: plugins/sudoers/ldap.c:526 plugins/sudoers/ldap.c:759
#: plugins/sudoers/ldap.c:1132 plugins/sudoers/ldap_conf.c:222
-#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/ldap_util.c:486
-#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:465
-#: plugins/sudoers/logging.c:820 plugins/sudoers/logging.c:830
-#: plugins/sudoers/policy.c:776 plugins/sudoers/policy.c:787
+#: plugins/sudoers/ldap_conf.c:313 plugins/sudoers/ldap_util.c:486
+#: plugins/sudoers/linux_audit.c:92 plugins/sudoers/logging.c:457
+#: plugins/sudoers/logging.c:813 plugins/sudoers/logging.c:823
+#: plugins/sudoers/policy.c:800 plugins/sudoers/policy.c:811
#: plugins/sudoers/prompt.c:168 plugins/sudoers/serialize_list.c:62
#: plugins/sudoers/serialize_list.c:71 plugins/sudoers/strvec_join.c:62
#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/toke_util.c:213
@@ -449,7 +480,7 @@ msgstr "%8s : %s"
msgid "%8s : (command continued) %s"
msgstr "%8s : (команда продовжуєтьÑÑ) %s"
-#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1241
+#: lib/iolog/iolog_filter.c:133 plugins/sudoers/defaults.c:1242
#: plugins/sudoers/sudoreplay.c:1293 plugins/sudoers/sudoreplay.c:1558
#, c-format
msgid "invalid regular expression \"%s\": %s"
@@ -564,14 +595,14 @@ msgstr "%s: не вказано даних щодо групи, від іменÑ
msgid "%s exists but is not a directory (0%o)"
msgstr "%s Ñ–Ñнує, але не Ñ” каталогом (0%o)"
-#: lib/iolog/iolog_mkdirs.c:119 lib/iolog/iolog_mkdtemp.c:77
-#: logsrvd/iolog_writer.c:810 plugins/sudoers/timestamp.c:205
+#: lib/iolog/iolog_mkdirs.c:123 lib/iolog/iolog_mkdtemp.c:78
+#: logsrvd/iolog_writer.c:781 plugins/sudoers/timestamp.c:209
#, c-format
msgid "unable to mkdir %s"
msgstr "не вдалоÑÑ Ñтворити каталог %s"
-#: lib/iolog/iolog_mkdtemp.c:81 plugins/sudoers/visudo.c:747
-#: plugins/sudoers/visudo.c:781 plugins/sudoers/visudo.c:787
+#: lib/iolog/iolog_mkdtemp.c:83 plugins/sudoers/visudo.c:753
+#: plugins/sudoers/visudo.c:787 plugins/sudoers/visudo.c:793
#, c-format
msgid "unable to change mode of %s to 0%o"
msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ режим доÑтупу до %s на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0%o"
@@ -586,150 +617,156 @@ msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° ча
msgid "invalid timing file line: %s"
msgstr "некоректний Ñ€Ñдок у файлі timing: %s"
-#: logsrvd/iolog_writer.c:130 plugins/sudoers/logging.c:982
-#: plugins/sudoers/policy.c:573
-msgid "unable to generate UUID"
-msgstr "не вдалоÑÑ Ñтворити UUID"
+#: logsrvd/iolog_writer.c:65
+#, c-format
+msgid "%s: protocol error: NULL key"
+msgstr "%s: помилка протоколу: ключ NULL"
-#: logsrvd/iolog_writer.c:158 logsrvd/iolog_writer.c:176
-#: logsrvd/iolog_writer.c:185 logsrvd/iolog_writer.c:203
-#: logsrvd/iolog_writer.c:216 logsrvd/iolog_writer.c:229
-#: logsrvd/iolog_writer.c:240 logsrvd/iolog_writer.c:247
-#: logsrvd/iolog_writer.c:265 logsrvd/iolog_writer.c:272
-#: logsrvd/iolog_writer.c:290 logsrvd/iolog_writer.c:305
-#: logsrvd/iolog_writer.c:318 logsrvd/iolog_writer.c:331
-#: logsrvd/iolog_writer.c:344 logsrvd/iolog_writer.c:359
+#: logsrvd/iolog_writer.c:69
#, c-format
msgid "%s: protocol error: wrong type for %s"
msgstr "%s: помилка протоколу: помилковий тип Ð´Ð»Ñ %s"
-#: logsrvd/iolog_writer.c:370 logsrvd/iolog_writer.c:375
-#: logsrvd/iolog_writer.c:380 logsrvd/iolog_writer.c:385
+#: logsrvd/iolog_writer.c:74 logsrvd/logsrvd_local.c:109
+#: logsrvd/logsrvd_local.c:123 logsrvd/logsrvd_local.c:131
+#: logsrvd/logsrvd_local.c:149
+#, c-format
+msgid "%s: protocol error: NULL value found in %s"
+msgstr "%s: помилка протоколу: виÑвлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ NULL у %s"
+
+#: logsrvd/iolog_writer.c:141 plugins/sudoers/logging.c:976
+#: plugins/sudoers/policy.c:591
+msgid "unable to generate UUID"
+msgstr "не вдалоÑÑ Ñтворити UUID"
+
+#: logsrvd/iolog_writer.c:341 logsrvd/iolog_writer.c:346
+#: logsrvd/iolog_writer.c:351 logsrvd/iolog_writer.c:356
#, c-format
msgid "%s: protocol error: %s missing from AcceptMessage"
msgstr "%s: помилка протоколу: не виÑтачає %s з AcceptMessage"
-#: logsrvd/iolog_writer.c:446
+#: logsrvd/iolog_writer.c:417
#, c-format
msgid "%s: unable to format session id"
msgstr "%s: не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° ÑеанÑу"
-#: logsrvd/iolog_writer.c:460 logsrvd/iolog_writer.c:474
-#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:503
-#: logsrvd/iolog_writer.c:517 logsrvd/iolog_writer.c:531
+#: logsrvd/iolog_writer.c:431 logsrvd/iolog_writer.c:445
+#: logsrvd/iolog_writer.c:459 logsrvd/iolog_writer.c:474
+#: logsrvd/iolog_writer.c:488 logsrvd/iolog_writer.c:502
#, c-format
msgid "%s: %s is not set"
msgstr "%s: %s не вÑтановлено"
-#: logsrvd/iolog_writer.c:567 logsrvd/iolog_writer.c:574
+#: logsrvd/iolog_writer.c:538 logsrvd/iolog_writer.c:545
#, c-format
msgid "unable to expand iolog path %s"
msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ð¸ шлÑÑ… iolog %s"
-#: logsrvd/iolog_writer.c:592
+#: logsrvd/iolog_writer.c:563
#, c-format
msgid "unable to create iolog path %s"
msgstr "не вдалоÑÑ Ñтворити шлÑÑ… iolog %s"
-#: logsrvd/iolog_writer.c:622
+#: logsrvd/iolog_writer.c:593
#, c-format
msgid "invalid iofd %d"
msgstr "некоректний файловий деÑкриптор введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ %d"
-#: logsrvd/iolog_writer.c:642
+#: logsrvd/iolog_writer.c:613
#, c-format
msgid "error closing iofd %d: %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби закрити деÑкриптор файла введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ %d: %s"
-#: logsrvd/iolog_writer.c:662
+#: logsrvd/iolog_writer.c:633
#, c-format
msgid "error flushing iofd %d: %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби витерти деÑкриптор файла введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ %d: %s"
-#: logsrvd/iolog_writer.c:780
+#: logsrvd/iolog_writer.c:751
#, c-format
msgid "invalid I/O log %s: %s referenced but not present"
msgstr "некоректний журнал введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ %s: маємо поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° %s без Ñамого запиÑу"
-#: logsrvd/iolog_writer.c:792 logsrvd/logsrvd_journal.c:372
+#: logsrvd/iolog_writer.c:763 logsrvd/logsrvd_journal.c:382
#, c-format
msgid "%s: unable to find resume point [%lld, %ld]"
msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ точку Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ [%lld, %ld]"
-#: logsrvd/iolog_writer.c:814 logsrvd/logsrvd_journal.c:415
-#: logsrvd/logsrvd_queue.c:110 logsrvd/tls_init.c:250
-#: plugins/sudoers/check.c:282 plugins/sudoers/cvtsudoers.c:730
+#: logsrvd/iolog_writer.c:785 logsrvd/logsrvd_journal.c:425
+#: logsrvd/logsrvd_queue.c:115 logsrvd/tls_init.c:256
+#: plugins/sudoers/check.c:292 plugins/sudoers/cvtsudoers.c:730
#: plugins/sudoers/cvtsudoers.c:751 plugins/sudoers/cvtsudoers.c:1431
-#: plugins/sudoers/cvtsudoers_csv.c:692 plugins/sudoers/cvtsudoers_json.c:898
-#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1106
-#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/timestamp.c:433
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:965
+#: plugins/sudoers/cvtsudoers_csv.c:695 plugins/sudoers/cvtsudoers_json.c:898
+#: plugins/sudoers/cvtsudoers_ldif.c:709 plugins/sudoers/sudoers.c:1113
+#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/sudoreplay.c:1469
+#: plugins/sudoers/timestamp.c:460 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:971
#, c-format
msgid "unable to open %s"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %s"
-#: logsrvd/iolog_writer.c:826 logsrvd/logsrv_util.c:100
-#: logsrvd/logsrv_util.c:107 plugins/sudoers/sudoreplay.c:362
+#: logsrvd/iolog_writer.c:797 logsrvd/logsrv_util.c:105
+#: logsrvd/logsrv_util.c:112 plugins/sudoers/sudoreplay.c:362
#: plugins/sudoers/sudoreplay.c:368
#, c-format
msgid "unable to open %s/%s"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %s/%s"
-#: logsrvd/iolog_writer.c:839
+#: logsrvd/iolog_writer.c:810
#, c-format
msgid "unable to copy %s/%s to %s/%s: %s"
msgstr "не вдалоÑÑ Ñкопіювати %s/%s до %s/%s: %s"
-#: logsrvd/iolog_writer.c:868 logsrvd/logsrvd_journal.c:185
+#: logsrvd/iolog_writer.c:839 logsrvd/logsrvd_journal.c:195
#, c-format
msgid "unable to rename %s to %s"
msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ %s на %s"
-#: logsrvd/logsrv_util.c:142 logsrvd/logsrv_util.c:171
+#: logsrvd/logsrv_util.c:147 logsrvd/logsrv_util.c:176
#, c-format
msgid "%s/%s: unable to find resume point [%lld, %ld]"
msgstr "%s/%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ точку Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ [%lld, %ld]"
-#: logsrvd/logsrv_util.c:154
+#: logsrvd/logsrv_util.c:159
#, c-format
msgid "missing I/O log file %s/%s"
msgstr "не виÑтачає файла журналу введеннÑ-виведеннÑ, %s/%s"
-#: logsrvd/logsrv_util.c:161
+#: logsrvd/logsrv_util.c:166
#, c-format
msgid "%s/%s: unable to seek forward %zu"
msgstr "%s/%s: неможливо виконати Ð¿Ð¾Ð·Ð¸Ñ†Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¿ÐµÑ€ÐµÐ´ на %zu"
-#: logsrvd/logsrvd.c:266 logsrvd/logsrvd_queue.c:130
+#: logsrvd/logsrvd.c:271 logsrvd/logsrvd_queue.c:135
msgid "unable to connect to relay"
msgstr "не вдалоÑÑ Ð²Ñтановити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· ретранÑлÑтором"
-#: logsrvd/logsrvd.c:325 logsrvd/logsrvd_relay.c:837
+#: logsrvd/logsrvd.c:330 logsrvd/logsrvd_relay.c:842
#, c-format
msgid "server message too large: %zu"
msgstr "надто велике Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера: %zu"
-#: logsrvd/logsrvd.c:417 logsrvd/logsrvd.c:534 logsrvd/logsrvd.c:613
-#: logsrvd/logsrvd.c:837 logsrvd/logsrvd.c:851 logsrvd/logsrvd.c:1011
-#: logsrvd/logsrvd.c:1136 logsrvd/logsrvd.c:1309 logsrvd/logsrvd.c:1327
-#: logsrvd/logsrvd.c:1428 logsrvd/logsrvd.c:1551 logsrvd/logsrvd.c:1735
-#: logsrvd/logsrvd_journal.c:484 logsrvd/logsrvd_local.c:197
-#: logsrvd/logsrvd_queue.c:159 logsrvd/logsrvd_relay.c:167
-#: logsrvd/logsrvd_relay.c:244 logsrvd/logsrvd_relay.c:248
-#: logsrvd/logsrvd_relay.c:384 logsrvd/logsrvd_relay.c:576
-#: logsrvd/logsrvd_relay.c:737 logsrvd/logsrvd_relay.c:1124
-#: logsrvd/sendlog.c:1316 logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
-#: logsrvd/tls_client.c:211 plugins/sudoers/audit.c:276
-#: plugins/sudoers/iolog.c:1031 plugins/sudoers/iolog.c:1164
-#: plugins/sudoers/iolog.c:1262 plugins/sudoers/log_client.c:116
-#: plugins/sudoers/log_client.c:338 plugins/sudoers/log_client.c:354
-#: plugins/sudoers/log_client.c:402 plugins/sudoers/log_client.c:606
-#: plugins/sudoers/log_client.c:613 plugins/sudoers/log_client.c:1138
-#: plugins/sudoers/log_client.c:1420 plugins/sudoers/log_client.c:1461
-#: plugins/sudoers/log_client.c:1469 plugins/sudoers/log_client.c:1628
-#: plugins/sudoers/log_client.c:1746 plugins/sudoers/log_client.c:2067
-#: plugins/sudoers/log_client.c:2075 plugins/sudoers/logging.c:150
-#: plugins/sudoers/logging.c:209 plugins/sudoers/sudoreplay.c:522
+#: logsrvd/logsrvd.c:422 logsrvd/logsrvd.c:545 logsrvd/logsrvd.c:631
+#: logsrvd/logsrvd.c:873 logsrvd/logsrvd.c:887 logsrvd/logsrvd.c:1049
+#: logsrvd/logsrvd.c:1174 logsrvd/logsrvd.c:1347 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1464 logsrvd/logsrvd.c:1589 logsrvd/logsrvd.c:1773
+#: logsrvd/logsrvd_journal.c:494 logsrvd/logsrvd_local.c:238
+#: logsrvd/logsrvd_queue.c:164 logsrvd/logsrvd_relay.c:172
+#: logsrvd/logsrvd_relay.c:249 logsrvd/logsrvd_relay.c:253
+#: logsrvd/logsrvd_relay.c:389 logsrvd/logsrvd_relay.c:581
+#: logsrvd/logsrvd_relay.c:742 logsrvd/logsrvd_relay.c:1131
+#: logsrvd/sendlog.c:1291 logsrvd/tls_client.c:136 logsrvd/tls_client.c:152
+#: logsrvd/tls_client.c:216 plugins/sudoers/audit.c:278
+#: plugins/sudoers/iolog.c:1033 plugins/sudoers/iolog.c:1166
+#: plugins/sudoers/iolog.c:1264 plugins/sudoers/log_client.c:121
+#: plugins/sudoers/log_client.c:343 plugins/sudoers/log_client.c:359
+#: plugins/sudoers/log_client.c:407 plugins/sudoers/log_client.c:611
+#: plugins/sudoers/log_client.c:618 plugins/sudoers/log_client.c:1103
+#: plugins/sudoers/log_client.c:1385 plugins/sudoers/log_client.c:1426
+#: plugins/sudoers/log_client.c:1434 plugins/sudoers/log_client.c:1593
+#: plugins/sudoers/log_client.c:1711 plugins/sudoers/log_client.c:2040
+#: plugins/sudoers/log_client.c:2048 plugins/sudoers/logging.c:147
+#: plugins/sudoers/logging.c:205 plugins/sudoers/sudoreplay.c:522
#: plugins/sudoers/sudoreplay.c:569 plugins/sudoers/sudoreplay.c:811
#: plugins/sudoers/sudoreplay.c:923 plugins/sudoers/sudoreplay.c:1014
#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036
@@ -738,633 +775,658 @@ msgstr "надто велике Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера: %zu"
msgid "unable to add event to queue"
msgstr "не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ подію до черги обробки"
-#: logsrvd/logsrvd.c:441 logsrvd/logsrvd.c:478 logsrvd/logsrvd.c:510
-#: logsrvd/logsrvd.c:558 logsrvd/logsrvd.c:630 logsrvd/logsrvd.c:660
-#: logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:720 logsrvd/logsrvd_relay.c:505
-#: logsrvd/logsrvd_relay.c:538
+#: logsrvd/logsrvd.c:446 logsrvd/logsrvd.c:483 logsrvd/logsrvd.c:515
+#: logsrvd/logsrvd.c:569 logsrvd/logsrvd.c:648 logsrvd/logsrvd.c:684
+#: logsrvd/logsrvd.c:720 logsrvd/logsrvd.c:756 logsrvd/logsrvd_relay.c:510
+#: logsrvd/logsrvd_relay.c:543
#, c-format
msgid "unexpected state %d for %s"
msgstr "неочікуваний Ñтан %d %s"
-#: logsrvd/logsrvd.c:442 logsrvd/logsrvd.c:479 logsrvd/logsrvd.c:511
-#: logsrvd/logsrvd.c:559 logsrvd/logsrvd.c:631 logsrvd/logsrvd.c:661
-#: logsrvd/logsrvd.c:691 logsrvd/logsrvd.c:721 logsrvd/logsrvd_relay.c:507
-#: logsrvd/logsrvd_relay.c:540
+#: logsrvd/logsrvd.c:447 logsrvd/logsrvd.c:484 logsrvd/logsrvd.c:516
+#: logsrvd/logsrvd.c:570 logsrvd/logsrvd.c:649 logsrvd/logsrvd.c:685
+#: logsrvd/logsrvd.c:721 logsrvd/logsrvd.c:757 logsrvd/logsrvd_relay.c:512
+#: logsrvd/logsrvd_relay.c:545
msgid "state machine error"
msgstr "помилка Ñкінченного автомата"
-#: logsrvd/logsrvd.c:448 logsrvd/logsrvd.c:449
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:454
msgid "invalid AcceptMessage"
msgstr "некоректне AcceptMessage"
-#: logsrvd/logsrvd.c:485 logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490 logsrvd/logsrvd.c:491
msgid "invalid RejectMessage"
msgstr "некоректне RejectMessage"
-#: logsrvd/logsrvd.c:593 logsrvd/logsrvd.c:594
+#: logsrvd/logsrvd.c:522 logsrvd/logsrvd.c:523
+msgid "invalid ExitMessage"
+msgstr "некоректне ExitMessage"
+
+#: logsrvd/logsrvd.c:576 logsrvd/logsrvd.c:577
+msgid "invalid RestartMessage"
+msgstr "некоректне RestartMessage"
+
+#: logsrvd/logsrvd.c:611 logsrvd/logsrvd.c:612
msgid "invalid AlertMessage"
msgstr "некоректне AlertMessage"
-#: logsrvd/logsrvd.c:635 logsrvd/logsrvd.c:665 logsrvd/logsrvd.c:695
+#: logsrvd/logsrvd.c:653 logsrvd/logsrvd.c:689 logsrvd/logsrvd.c:725
#, c-format
msgid "%s: unexpected IoBuffer"
msgstr "%s: неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ IoBuffer"
-#: logsrvd/logsrvd.c:636 logsrvd/logsrvd.c:666 logsrvd/logsrvd.c:696
+#: logsrvd/logsrvd.c:654 logsrvd/logsrvd.c:690 logsrvd/logsrvd.c:726
msgid "protocol error"
msgstr "помилка протоколу"
-#: logsrvd/logsrvd.c:746 logsrvd/logsrvd_journal.c:283
-#: logsrvd/logsrvd_relay.c:647 logsrvd/sendlog.c:1217
-#: plugins/sudoers/log_client.c:1618
+#: logsrvd/logsrvd.c:660 logsrvd/logsrvd.c:661
+msgid "invalid IoBuffer"
+msgstr "некоректне IoBuffer"
+
+#: logsrvd/logsrvd.c:696 logsrvd/logsrvd.c:697
+msgid "invalid ChangeWindowSize"
+msgstr "некоректне ChangeWindowSize"
+
+#: logsrvd/logsrvd.c:732 logsrvd/logsrvd.c:733
+msgid "invalid CommandSuspend"
+msgstr "некоректне CommandSuspend"
+
+#: logsrvd/logsrvd.c:782 logsrvd/logsrvd_journal.c:293
+#: logsrvd/logsrvd_relay.c:652 logsrvd/sendlog.c:1192
+#: plugins/sudoers/log_client.c:1583
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ %s, розмір %zu"
-#: logsrvd/logsrvd.c:791 logsrvd/logsrvd_journal.c:357
-#: logsrvd/logsrvd_local.c:125 logsrvd/logsrvd_relay.c:671
+#: logsrvd/logsrvd.c:827 logsrvd/logsrvd_journal.c:367
+#: logsrvd/logsrvd_relay.c:676
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ type_case %d у %s від %s"
-#: logsrvd/logsrvd.c:793
+#: logsrvd/logsrvd.c:829
msgid "unrecognized ClientMessage type"
msgstr "нерозпізнаний тип ClientMessage"
-#: logsrvd/logsrvd.c:883
+#: logsrvd/logsrvd.c:919
#, c-format
msgid "timed out writing to client %s"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу до клієнта %s"
-#: logsrvd/logsrvd.c:888 logsrvd/logsrvd_relay.c:909 logsrvd/sendlog.c:1420
+#: logsrvd/logsrvd.c:924 logsrvd/logsrvd_relay.c:914 logsrvd/sendlog.c:1395
#, c-format
msgid "missing write buffer for client %s"
msgstr "пропущено буфер запиÑу Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð° %s"
-#: logsrvd/logsrvd.c:982
+#: logsrvd/logsrvd.c:1020
#, c-format
msgid "timed out reading from client %s"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· клієнта %s"
-#: logsrvd/logsrvd.c:1023 logsrvd/logsrvd_relay.c:772
+#: logsrvd/logsrvd.c:1061 logsrvd/logsrvd_relay.c:777
#, c-format
msgid "EOF from %s without proper TLS shutdown"
msgstr "EOF від %s без належного Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ TLS"
-#: logsrvd/logsrvd.c:1067 logsrvd/logsrvd_relay.c:200 logsrvd/sendlog.c:317
-#: plugins/sudoers/log_client.c:716
+#: logsrvd/logsrvd.c:1105 logsrvd/logsrvd_relay.c:205 logsrvd/sendlog.c:322
+#: plugins/sudoers/log_client.c:721
#, c-format
msgid "client message too large: %zu"
msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð° Ñ” надто довгим: %zu"
-#: logsrvd/logsrvd.c:1068 logsrvd/logsrvd_journal.c:246
-#: logsrvd/logsrvd_journal.c:247
+#: logsrvd/logsrvd.c:1106 logsrvd/logsrvd_journal.c:256
+#: logsrvd/logsrvd_journal.c:257
msgid "client message too large"
msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð° Ñ” надто великим"
-#: logsrvd/logsrvd.c:1086 logsrvd/logsrvd.c:1087
+#: logsrvd/logsrvd.c:1124 logsrvd/logsrvd.c:1125
msgid "invalid ClientMessage"
msgstr "некоректне ClientMessage"
-#: logsrvd/logsrvd.c:1389
+#: logsrvd/logsrvd.c:1425
msgid "unable to get remote IP addr"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ віддалену IP-адреÑу"
-#: logsrvd/logsrvd.c:1420 logsrvd/tls_client.c:198
-#: plugins/sudoers/log_client.c:276
+#: logsrvd/logsrvd.c:1456 logsrvd/tls_client.c:203
+#: plugins/sudoers/log_client.c:281
#, c-format
msgid "Unable to attach user data to the ssl object: %s"
msgstr "Ðе вдалоÑÑ Ð´Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ дані кориÑтувача до об'єкта SSL: %s"
-#: logsrvd/logsrvd.c:1601 logsrvd/logsrvd.c:1953
+#: logsrvd/logsrvd.c:1639 logsrvd/logsrvd.c:1992
msgid "unable to setup listen socket"
msgstr "не вдалоÑÑ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ñ‚Ð¸ Ñокет Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° дані"
-#: logsrvd/logsrvd.c:1718
+#: logsrvd/logsrvd.c:1756
#, c-format
msgid "unexpected signal %d"
msgstr "неочікуваний Ñигнал %d"
-#: logsrvd/logsrvd.c:1855
+#: logsrvd/logsrvd.c:1894
msgid "sudo log server"
msgstr "Ñервер журналу sudo"
-#: logsrvd/logsrvd.c:1857 logsrvd/sendlog.c:116
+#: logsrvd/logsrvd.c:1896 logsrvd/sendlog.c:121
msgid "Options:"
msgstr "Параметри:"
-#: logsrvd/logsrvd.c:1859
+#: logsrvd/logsrvd.c:1898
msgid "path to configuration file"
msgstr "шлÑÑ… до файла налаштувань"
-#: logsrvd/logsrvd.c:1861 logsrvd/sendlog.c:118
+#: logsrvd/logsrvd.c:1900 logsrvd/sendlog.c:123
msgid "display help message and exit"
msgstr "показати довідкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ– завершити роботу"
-#: logsrvd/logsrvd.c:1863
+#: logsrvd/logsrvd.c:1902
msgid "do not fork, run in the foreground"
msgstr "не відгалужувати, не переходити у фоновий режим під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
-#: logsrvd/logsrvd.c:1865
+#: logsrvd/logsrvd.c:1904
msgid "percent chance connections will drop"
msgstr "ймовірніÑÑ‚ÑŒ Ñ€Ð¾Ð·Ñ–Ñ€Ð²Ð°Ð½Ð½Ñ Ð·'єднаннÑ"
-#: logsrvd/logsrvd.c:1867 logsrvd/sendlog.c:148
+#: logsrvd/logsrvd.c:1906 logsrvd/sendlog.c:153
msgid "display version information and exit"
msgstr "показати дані щодо верÑÑ–Ñ— Ñ– завершити роботу"
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:1725
+#: logsrvd/logsrvd.c:1956 logsrvd/sendlog.c:1702
msgid "Protobuf-C version 1.3 or higher required"
msgstr "Потрібна верÑÑ–Ñ Protobuf-C 1.3 або новіша"
-#: logsrvd/logsrvd.c:1933
+#: logsrvd/logsrvd.c:1972
#, c-format
msgid "invalid random drop value: %s"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¹Ð¼Ð¾Ð²Ñ–Ñ€Ð½Ð¾ÑÑ‚Ñ– ÑкиданнÑ: %s"
-#: logsrvd/logsrvd.c:1936 logsrvd/sendlog.c:1779
+#: logsrvd/logsrvd.c:1975 logsrvd/sendlog.c:1756
#: plugins/sudoers/cvtsudoers.c:246 plugins/sudoers/sudoreplay.c:301
-#: plugins/sudoers/visudo.c:180
+#: plugins/sudoers/visudo.c:182
#, c-format
msgid "%s version %s\n"
msgstr "%s, верÑÑ–Ñ %s\n"
-#: logsrvd/logsrvd_conf.c:417 plugins/sudoers/check.c:347
+#: logsrvd/logsrvd_conf.c:422 plugins/sudoers/check.c:353
#: plugins/sudoers/exptilde.c:85 plugins/sudoers/iolog.c:122
-#: plugins/sudoers/policy.c:1234 plugins/sudoers/sudoers.c:500
-#: plugins/sudoers/sudoers.c:1362 plugins/sudoers/testsudoers.c:215
+#: plugins/sudoers/policy.c:1264 plugins/sudoers/sudoers.c:505
+#: plugins/sudoers/sudoers.c:1372 plugins/sudoers/testsudoers.c:215
#: plugins/sudoers/testsudoers.c:382
#, c-format
msgid "unknown user %s"
msgstr "невідомий кориÑтувач %s"
-#: logsrvd/logsrvd_conf.c:434 plugins/sudoers/iolog.c:148
-#: plugins/sudoers/sudoers.c:505 plugins/sudoers/sudoers.c:1396
+#: logsrvd/logsrvd_conf.c:439 plugins/sudoers/iolog.c:148
+#: plugins/sudoers/sudoers.c:510 plugins/sudoers/sudoers.c:1406
#: plugins/sudoers/testsudoers.c:406
#, c-format
msgid "unknown group %s"
msgstr "невідома група %s"
-#: logsrvd/logsrvd_conf.c:452
+#: logsrvd/logsrvd_conf.c:457
#, c-format
msgid "unable to parse iolog mode %s"
msgstr "не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ iolog %s"
-#: logsrvd/logsrvd_conf.c:469 logsrvd/logsrvd_conf.c:1238
+#: logsrvd/logsrvd_conf.c:474 logsrvd/logsrvd_conf.c:1243
#, c-format
msgid "invalid value for %s: %s"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s: %s"
-#: logsrvd/logsrvd_conf.c:522
+#: logsrvd/logsrvd_conf.c:527
msgid "TLS not supported"
msgstr "Підтримки TLS не передбачено"
-#: logsrvd/logsrvd_conf.c:544
+#: logsrvd/logsrvd_conf.c:549
#, c-format
msgid "%s:%s"
msgstr "%s:%s"
-#: logsrvd/logsrvd_conf.c:617 logsrvd/logsrvd_conf.c:1027
+#: logsrvd/logsrvd_conf.c:622 logsrvd/logsrvd_conf.c:1032
#, c-format
msgid "%s: not a fully qualified path"
msgstr "%s: не Ñ” повноцінним запиÑом шлÑхуnot a fully qualified path"
-#: logsrvd/logsrvd_conf.c:945 logsrvd/logsrvd_conf.c:961
-#: logsrvd/logsrvd_conf.c:1671
+#: logsrvd/logsrvd_conf.c:951 logsrvd/logsrvd_conf.c:967
+#: logsrvd/logsrvd_conf.c:1676
#, c-format
msgid "unknown syslog facility %s"
msgstr "невідома можливіÑÑ‚ÑŒ syslog %s"
-#: logsrvd/logsrvd_conf.c:977 logsrvd/logsrvd_conf.c:993
-#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1675
-#: logsrvd/logsrvd_conf.c:1679 logsrvd/logsrvd_conf.c:1683
+#: logsrvd/logsrvd_conf.c:983 logsrvd/logsrvd_conf.c:999
+#: logsrvd/logsrvd_conf.c:1015 logsrvd/logsrvd_conf.c:1680
+#: logsrvd/logsrvd_conf.c:1684 logsrvd/logsrvd_conf.c:1688
#, c-format
msgid "unknown syslog priority %s"
msgstr "невідома пріоритетніÑÑ‚ÑŒ syslog %s"
-#: logsrvd/logsrvd_conf.c:1192
+#: logsrvd/logsrvd_conf.c:1197
#, c-format
msgid "%s:%d unmatched '[': %s"
msgstr "%s:%d «[» без пари: %s"
-#: logsrvd/logsrvd_conf.c:1198
+#: logsrvd/logsrvd_conf.c:1203
#, c-format
msgid "%s:%d garbage after ']': %s"
msgstr "%s:%d мотлох піÑÐ»Ñ Â«]»: %s"
-#: logsrvd/logsrvd_conf.c:1210
+#: logsrvd/logsrvd_conf.c:1215
#, c-format
msgid "%s:%d invalid config section: %s"
msgstr "%s:%d некоректний розділ налаштувань: %s"
-#: logsrvd/logsrvd_conf.c:1218
+#: logsrvd/logsrvd_conf.c:1223
#, c-format
msgid "%s:%d invalid configuration line: %s"
msgstr "%s:%d некоректний Ñ€Ñдок налаштувань: %s"
-#: logsrvd/logsrvd_conf.c:1224
+#: logsrvd/logsrvd_conf.c:1229
#, c-format
msgid "%s:%d expected section name: %s"
msgstr "%s:%d мало бути вказано назву розділу: %s"
-#: logsrvd/logsrvd_conf.c:1246
+#: logsrvd/logsrvd_conf.c:1251
#, c-format
msgid "%s:%d [%s] illegal key: %s"
msgstr "%s:%d [%s] заборонений ключ: %s"
-#: logsrvd/logsrvd_conf.c:1276 plugins/sudoers/cvtsudoers.c:268
-#: plugins/sudoers/logging.c:1035
+#: logsrvd/logsrvd_conf.c:1281 plugins/sudoers/cvtsudoers.c:268
+#: plugins/sudoers/logging.c:1029
#, c-format
msgid "unable to open log file %s"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу %s"
-#: logsrvd/logsrvd_conf.c:1757
+#: logsrvd/logsrvd_conf.c:1763
msgid "unable to initialize server TLS context"
msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контекÑÑ‚ Ñервера TLS"
-#: logsrvd/logsrvd_conf.c:1777
+#: logsrvd/logsrvd_conf.c:1783
msgid "unable to initialize relay TLS context"
msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контекÑÑ‚ ретранÑлÑтора TLS"
-#: logsrvd/logsrvd_journal.c:136 logsrvd/logsrvd_journal.c:411
-#: logsrvd/logsrvd_journal.c:416
+#: logsrvd/logsrvd_journal.c:146 logsrvd/logsrvd_journal.c:421
+#: logsrvd/logsrvd_journal.c:426
msgid "unable to create journal file"
msgstr "не вдалоÑÑ Ñтворити файл журналу"
-#: logsrvd/logsrvd_journal.c:140 logsrvd/logsrvd_queue.c:104
-#: plugins/sudoers/visudo.c:1020
+#: logsrvd/logsrvd_journal.c:150 logsrvd/logsrvd_queue.c:109
+#: plugins/sudoers/visudo.c:1026
#, c-format
msgid "unable to lock %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ %s"
-#: logsrvd/logsrvd_journal.c:143
+#: logsrvd/logsrvd_journal.c:153
msgid "unable to lock journal file"
msgstr "не вдалоÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ файл журналу"
-#: logsrvd/logsrvd_journal.c:151
+#: logsrvd/logsrvd_journal.c:161
msgid "unable to open journal file"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу"
-#: logsrvd/logsrvd_journal.c:172 logsrvd/logsrvd_journal.c:447
-#: logsrvd/logsrvd_journal.c:452
+#: logsrvd/logsrvd_journal.c:182 logsrvd/logsrvd_journal.c:457
+#: logsrvd/logsrvd_journal.c:462
msgid "unable to write journal file"
msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл журналу"
-#: logsrvd/logsrvd_journal.c:180 logsrvd/logsrvd_journal.c:187
+#: logsrvd/logsrvd_journal.c:190 logsrvd/logsrvd_journal.c:197
msgid "unable to rename journal file"
msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл журналу"
-#: logsrvd/logsrvd_journal.c:234 logsrvd/logsrvd_journal.c:235
-#: logsrvd/logsrvd_journal.c:269 logsrvd/logsrvd_journal.c:270
+#: logsrvd/logsrvd_journal.c:244 logsrvd/logsrvd_journal.c:245
+#: logsrvd/logsrvd_journal.c:279 logsrvd/logsrvd_journal.c:280
msgid "unexpected EOF reading journal file"
msgstr "неочікуваний Ñимвол ÐºÑ–Ð½Ñ†Ñ Ñ„Ð°Ð¹Ð»Ð° під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° журналу"
-#: logsrvd/logsrvd_journal.c:238 logsrvd/logsrvd_journal.c:239
-#: logsrvd/logsrvd_journal.c:273 logsrvd/logsrvd_journal.c:274
+#: logsrvd/logsrvd_journal.c:248 logsrvd/logsrvd_journal.c:249
+#: logsrvd/logsrvd_journal.c:283 logsrvd/logsrvd_journal.c:284
msgid "error reading journal file"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° журналу"
-#: logsrvd/logsrvd_journal.c:285 logsrvd/logsrvd_journal.c:371
+#: logsrvd/logsrvd_journal.c:295 logsrvd/logsrvd_journal.c:381
msgid "invalid journal file, unable to restart"
msgstr "некоректний файл журналу, неможливо перезапуÑтити"
-#: logsrvd/logsrvd_journal.c:430
+#: logsrvd/logsrvd_journal.c:440
#, c-format
msgid "unable to seek to [%lld, %ld] in journal file %s"
msgstr "не вдалоÑÑ Ð²Ñтановити позицію [%lld, %ld] у файлі журналу %s"
-#: logsrvd/logsrvd_local.c:153
+#: logsrvd/logsrvd_local.c:166
+#, c-format
+msgid "unexpected value_case %d in %s from %s"
+msgstr "неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ value_case %d у %s з %s"
+
+#: logsrvd/logsrvd_local.c:194
msgid "error parsing AcceptMessage"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби обробити AcceptMessage"
-#: logsrvd/logsrvd_local.c:164
+#: logsrvd/logsrvd_local.c:205
msgid "error creating I/O log"
msgstr "помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ введеннÑ-виведеннÑ"
-#: logsrvd/logsrvd_local.c:187
+#: logsrvd/logsrvd_local.c:228
msgid "error logging accept event"
msgstr "помилка під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ події Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ñ–Ñ— журналу"
-#: logsrvd/logsrvd_local.c:226
+#: logsrvd/logsrvd_local.c:267
msgid "error parsing RejectMessage"
msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð¸ обробити RejectMessage"
-#: logsrvd/logsrvd_local.c:250
+#: logsrvd/logsrvd_local.c:291
msgid "error logging reject event"
msgstr "помилка під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ події відмови у запиÑÑ– до журналу"
-#: logsrvd/logsrvd_local.c:386 logsrvd/logsrvd_local.c:394
+#: logsrvd/logsrvd_local.c:427 logsrvd/logsrvd_local.c:435
msgid "error logging exit event"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби запиÑати до журналу подію виходу"
-#: logsrvd/logsrvd_local.c:451 logsrvd/logsrvd_local.c:452
+#: logsrvd/logsrvd_local.c:492 logsrvd/logsrvd_local.c:493
msgid "log is already complete, cannot be restarted"
msgstr "журнал вже завершено — його не можна перезапуÑтити"
-#: logsrvd/logsrvd_local.c:482
+#: logsrvd/logsrvd_local.c:523
msgid "unable to restart log"
msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити журнал"
-#: logsrvd/logsrvd_local.c:498
+#: logsrvd/logsrvd_local.c:539
msgid "error parsing AlertMessage"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби обробити AlertMessage"
-#: logsrvd/logsrvd_local.c:508
+#: logsrvd/logsrvd_local.c:549
msgid "error logging alert event"
msgstr "помилка під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ події критичного Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ"
-#: logsrvd/logsrvd_local.c:544 logsrvd/logsrvd_local.c:607
-#: logsrvd/logsrvd_local.c:642
+#: logsrvd/logsrvd_local.c:585 logsrvd/logsrvd_local.c:648
+#: logsrvd/logsrvd_local.c:683
#, c-format
msgid "unable to format timing buffer, length %d"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÑ„ÐµÑ€Ð° чаÑових позначок, довжина — %d"
-#: logsrvd/logsrvd_local.c:558 logsrvd/logsrvd_local.c:566
-#: logsrvd/logsrvd_local.c:614 logsrvd/logsrvd_local.c:649
+#: logsrvd/logsrvd_local.c:599 logsrvd/logsrvd_local.c:607
+#: logsrvd/logsrvd_local.c:655 logsrvd/logsrvd_local.c:690
#: plugins/sudoers/sudoreplay.c:351
#, c-format
msgid "%s/%s: %s"
msgstr "%s/%s: %s"
-#: logsrvd/logsrvd_local.c:577
+#: logsrvd/logsrvd_local.c:618
msgid "randomly dropping connection"
msgstr "випадковим чином розривати з'єднаннÑ"
-#: logsrvd/logsrvd_local.c:589
+#: logsrvd/logsrvd_local.c:630
msgid "error writing IoBuffer"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби запиÑати IoBuffer"
-#: logsrvd/logsrvd_local.c:624
+#: logsrvd/logsrvd_local.c:665
msgid "error writing ChangeWindowSize"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби запиÑати ChangeWindowSize"
-#: logsrvd/logsrvd_local.c:659
+#: logsrvd/logsrvd_local.c:700
msgid "error writing CommandSuspend"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби запиÑати CommandSuspend"
-#: logsrvd/logsrvd_relay.c:430
+#: logsrvd/logsrvd_relay.c:435
msgid "TLS handshake with relay host failed"
msgstr "помилка Ñпроби ініціалізації зв'Ñзку TLS із вузлом ретранÑлÑтора"
-#: logsrvd/logsrvd_relay.c:458
+#: logsrvd/logsrvd_relay.c:463
msgid "unable to connect to relay host"
msgstr "не вдалоÑÑ Ð²Ñтановити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· вузлом ретранÑлÑтора"
-#: logsrvd/logsrvd_relay.c:513
+#: logsrvd/logsrvd_relay.c:518
#, c-format
msgid "%s: invalid ServerHello, missing server_id"
msgstr "%s: некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ServerHello — пропущено server_id"
-#: logsrvd/logsrvd_relay.c:515 logsrvd/sendlog.c:1121
-#: plugins/sudoers/log_client.c:1504
+#: logsrvd/logsrvd_relay.c:520 logsrvd/sendlog.c:1096
+#: plugins/sudoers/log_client.c:1469
msgid "invalid ServerHello"
msgstr "некоректне ServerHello"
-#: logsrvd/logsrvd_relay.c:674
+#: logsrvd/logsrvd_relay.c:679
msgid "unrecognized ServerMessage type"
msgstr "нерозпізнаний тип ServerMessage"
-#: logsrvd/logsrvd_relay.c:703
+#: logsrvd/logsrvd_relay.c:708
#, c-format
msgid "timed out reading from relay %s (%s)"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· ретранÑлÑтора %s (%s)"
-#: logsrvd/logsrvd_relay.c:705
+#: logsrvd/logsrvd_relay.c:710
msgid "timeout reading from relay"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· ретранÑлÑтора"
-#: logsrvd/logsrvd_relay.c:757
+#: logsrvd/logsrvd_relay.c:762
msgid "relay host name does not match certificate"
msgstr "назва вузла ретранÑлÑтора не відповідає Ñертифікату"
-#: logsrvd/logsrvd_relay.c:763 logsrvd/logsrvd_relay.c:777
-#: logsrvd/logsrvd_relay.c:784
+#: logsrvd/logsrvd_relay.c:768 logsrvd/logsrvd_relay.c:782
+#: logsrvd/logsrvd_relay.c:789
msgid "error reading from relay"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· ретранÑлÑтора"
-#: logsrvd/logsrvd_relay.c:805
+#: logsrvd/logsrvd_relay.c:810
msgid "unable to read from relay"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з ретранÑлÑтора"
-#: logsrvd/logsrvd_relay.c:820 logsrvd/logsrvd_relay.c:938
+#: logsrvd/logsrvd_relay.c:825 logsrvd/logsrvd_relay.c:943
msgid "relay server closed connection"
msgstr "Ñервер-ретранÑлÑтор розірвав з'єднаннÑ"
-#: logsrvd/logsrvd_relay.c:838
+#: logsrvd/logsrvd_relay.c:843
msgid "server message too large"
msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера Ñ” надто великим"
-#: logsrvd/logsrvd_relay.c:902
+#: logsrvd/logsrvd_relay.c:907
#, c-format
msgid "timed out writing to relay %s (%s)"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу до ретранÑлÑтора %s (%s)"
-#: logsrvd/logsrvd_relay.c:904
+#: logsrvd/logsrvd_relay.c:909
msgid "timeout writing to relay"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ ретранÑлÑтора"
-#: logsrvd/logsrvd_relay.c:957 logsrvd/logsrvd_relay.c:964
-#: logsrvd/logsrvd_relay.c:974
+#: logsrvd/logsrvd_relay.c:962 logsrvd/logsrvd_relay.c:969
+#: logsrvd/logsrvd_relay.c:981
msgid "error writing to relay"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби запиÑати до ретранÑлÑтора"
-#: logsrvd/sendlog.c:114
+#: logsrvd/sendlog.c:119
msgid "send sudo I/O log to remote server"
msgstr "надіÑлати журнал введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ sudo на віддалений Ñервер"
-#: logsrvd/sendlog.c:120
+#: logsrvd/sendlog.c:125
msgid "only send an accept event (no I/O)"
msgstr "надіÑлати лише подію прийнÑÑ‚Ñ‚Ñ (без введеннÑ-виведеннÑ)"
-#: logsrvd/sendlog.c:123
+#: logsrvd/sendlog.c:128
msgid "certificate bundle file to verify server's cert against"
msgstr "файл пакунка Ñертифікатів, за Ñким Ñлід перевірÑти Ñертифікат Ñервера"
-#: logsrvd/sendlog.c:125
+#: logsrvd/sendlog.c:130
msgid "certificate file for TLS handshake"
msgstr "файл Ñертифіката Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²'Ñзку TLS"
-#: logsrvd/sendlog.c:128
+#: logsrvd/sendlog.c:133
msgid "host to send logs to"
msgstr "вузол, на Ñкий Ñлід надіÑлати журнал"
-#: logsrvd/sendlog.c:130
+#: logsrvd/sendlog.c:135
msgid "remote ID of I/O log to be resumed"
msgstr "віддалений ідентифікатор журналу введеннÑ-виведеннÑ, Ñкий Ñлід продовжити"
-#: logsrvd/sendlog.c:133
+#: logsrvd/sendlog.c:138
msgid "private key file"
msgstr "файл закритого ключа"
-#: logsrvd/sendlog.c:135
+#: logsrvd/sendlog.c:140
msgid "do not verify server certificate"
msgstr "не перевірÑти Ñертифікат Ñервера"
-#: logsrvd/sendlog.c:138
+#: logsrvd/sendlog.c:143
msgid "port to use when connecting to host"
msgstr "порт, Ñким Ñлід ÑкориÑтатиÑÑ Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· вузлом"
-#: logsrvd/sendlog.c:140
+#: logsrvd/sendlog.c:145
msgid "restart previous I/O log transfer"
msgstr "перезапуÑтити попередній обмін даними журналу введеннÑ-виведеннÑ"
-#: logsrvd/sendlog.c:142
+#: logsrvd/sendlog.c:147
msgid "reject the command with the given reason"
msgstr "відкинути команду із вказаною причиною"
-#: logsrvd/sendlog.c:144
+#: logsrvd/sendlog.c:149
msgid "stop transfer after reaching this time"
msgstr "припинити Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… піÑÐ»Ñ Ð´Ð¾ÑÑÐ³Ð½ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— тривалоÑÑ‚Ñ–"
-#: logsrvd/sendlog.c:146
+#: logsrvd/sendlog.c:151
msgid "test audit server by sending selected I/O log n times in parallel"
msgstr "перевірити Ñервер аудиту надÑиланнÑм вибраного журналу введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ n разів у паралельному режимі"
-#: logsrvd/sendlog.c:171 plugins/sudoers/log_client.c:448
+#: logsrvd/sendlog.c:176 plugins/sudoers/log_client.c:453
#, c-format
msgid "unable to look up %s:%s: %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ пошук %s:%s: %s"
-#: logsrvd/sendlog.c:209
+#: logsrvd/sendlog.c:214
msgid "unable to get server IP addr"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ IP-адреÑу Ñервера"
-#: logsrvd/sendlog.c:295 plugins/sudoers/sudoreplay.c:871
+#: logsrvd/sendlog.c:300 plugins/sudoers/sudoreplay.c:871
#, c-format
msgid "unable to read %s/%s: %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ %s/%s: %s"
-#: logsrvd/sendlog.c:1045 plugins/sudoers/iolog.c:949
-#: plugins/sudoers/iolog.c:1024
+#: logsrvd/sendlog.c:1020 plugins/sudoers/iolog.c:951
+#: plugins/sudoers/iolog.c:1026
#, c-format
msgid "unexpected I/O event %d"
msgstr "неочікувана Ð¿Ð¾Ð´Ñ–Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ â€” %d"
-#: logsrvd/sendlog.c:1098 logsrvd/sendlog.c:1115 logsrvd/sendlog.c:1149
-#: plugins/sudoers/log_client.c:1153 plugins/sudoers/log_client.c:1430
-#: plugins/sudoers/log_client.c:1498 plugins/sudoers/log_client.c:1537
+#: logsrvd/sendlog.c:1073 logsrvd/sendlog.c:1090 logsrvd/sendlog.c:1124
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1395
+#: plugins/sudoers/log_client.c:1463 plugins/sudoers/log_client.c:1502
#, c-format
msgid "%s: unexpected state %d"
msgstr "%s: неочікуваний Ñтан — %d"
-#: logsrvd/sendlog.c:1185 plugins/sudoers/log_client.c:1586
+#: logsrvd/sendlog.c:1160 plugins/sudoers/log_client.c:1551
#, c-format
msgid "error message received from server: %s"
msgstr "отримано Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку від Ñервера: %s"
-#: logsrvd/sendlog.c:1198 plugins/sudoers/log_client.c:1599
+#: logsrvd/sendlog.c:1173 plugins/sudoers/log_client.c:1564
#, c-format
msgid "abort message received from server: %s"
msgstr "отримано Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ Ñервера: %s"
-#: logsrvd/sendlog.c:1257 plugins/sudoers/log_client.c:1649
+#: logsrvd/sendlog.c:1232 plugins/sudoers/log_client.c:1614
#, c-format
msgid "%s: unexpected type_case value %d"
msgstr "%s: неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ type_case — %d"
-#: logsrvd/sendlog.c:1286
+#: logsrvd/sendlog.c:1261
msgid "timeout reading from server"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· Ñервера"
-#: logsrvd/sendlog.c:1335 plugins/sudoers/log_client.c:1765
+#: logsrvd/sendlog.c:1310 plugins/sudoers/log_client.c:1730
msgid "host name does not match certificate"
msgstr "назва вузла не відповідає Ñертифікату"
-#: logsrvd/sendlog.c:1368
+#: logsrvd/sendlog.c:1343
msgid "premature EOF"
msgstr "передчаÑне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°"
-#: logsrvd/sendlog.c:1381 plugins/sudoers/log_client.c:1812
+#: logsrvd/sendlog.c:1356 plugins/sudoers/log_client.c:1777
#, c-format
msgid "server message too large: %u"
msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера Ñ” надто великим: %u"
-#: logsrvd/sendlog.c:1437
+#: logsrvd/sendlog.c:1412
msgid "timeout writing to server"
msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° Ñервері"
-#: logsrvd/sendlog.c:1802
+#: logsrvd/sendlog.c:1779
msgid "both restart point and iolog ID must be specified"
msgstr "Ñлід вказати одночаÑно точку перезапуÑку та ідентифікатор журналу введеннÑ-виведеннÑ"
-#: logsrvd/sendlog.c:1806
+#: logsrvd/sendlog.c:1783
msgid "a restart point may not be set when no I/O is sent"
msgstr "точку перезапуÑку не можна вÑтановлювати, Ñкщо не надÑилаєтьÑÑ Ð¶Ð¾Ð´Ð½Ð¸Ñ… даних введеннÑ-виведеннÑ"
-#: logsrvd/sendlog.c:1882
+#: logsrvd/sendlog.c:1859
#, c-format
msgid "exited prematurely with state %d"
msgstr "передчаÑний вихід зі Ñтаном %d"
-#: logsrvd/sendlog.c:1883
+#: logsrvd/sendlog.c:1860
#, c-format
msgid "elapsed time sent to server [%lld, %ld]"
msgstr "на Ñервер надіÑлано дані щодо чаÑу, Ñкий лишивÑÑ [%lld, %ld]"
-#: logsrvd/sendlog.c:1885
+#: logsrvd/sendlog.c:1862
#, c-format
msgid "commit point received from server [%lld, %ld]"
msgstr "отримано точку внеÑку від Ñервера [%lld, %ld]"
-#: logsrvd/tls_client.c:106 plugins/sudoers/log_client.c:310
+#: logsrvd/tls_client.c:111 plugins/sudoers/log_client.c:315
msgid "TLS handshake timeout occurred"
msgstr "ÑталоÑÑ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²'Ñзку TLS"
-#: logsrvd/tls_client.c:126 logsrvd/tls_client.c:142
-#: plugins/sudoers/log_client.c:332 plugins/sudoers/log_client.c:348
+#: logsrvd/tls_client.c:131 logsrvd/tls_client.c:147
+#: plugins/sudoers/log_client.c:337 plugins/sudoers/log_client.c:353
msgid "unable to set event"
msgstr "не вдалоÑÑ Ð²Ñтановити подію"
-#: logsrvd/tls_client.c:152 logsrvd/tls_client.c:156
+#: logsrvd/tls_client.c:157 logsrvd/tls_client.c:161
#, c-format
msgid "TLS connection failed: %s"
msgstr "Ðе вдалоÑÑ Ð²Ñтановити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ TLS: %s"
-#: logsrvd/tls_client.c:191
+#: logsrvd/tls_client.c:196
#, c-format
msgid "unable to allocate ssl object: %s"
msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñтити об'єкт SSL у пам'ÑÑ‚Ñ–: %s"
-#: logsrvd/tls_client.c:205
+#: logsrvd/tls_client.c:210
#, c-format
msgid "Unable to attach socket to the ssl object: %s"
msgstr "Ðе вдалоÑÑ Ð´Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ Ñокет до об'єкта SSL: %s"
-#: logsrvd/tls_client.c:233
+#: logsrvd/tls_client.c:238
msgid "unable to initialize TLS context"
msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контекÑÑ‚ TLS"
-#: logsrvd/tls_init.c:132 logsrvd/tls_init.c:140
+#: logsrvd/tls_init.c:138 logsrvd/tls_init.c:146
#, c-format
msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
msgstr "не вдалоÑÑ Ð²Ñтановити ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ TLS 1.2 у %s: %s"
-#: logsrvd/tls_init.c:160 logsrvd/tls_init.c:168
+#: logsrvd/tls_init.c:166 logsrvd/tls_init.c:174
#, c-format
msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
msgstr "не вдалоÑÑ Ð²Ñтановити ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ TLS 1.3 у %s: %s"
-#: logsrvd/tls_init.c:200 logsrvd/tls_init.c:221
+#: logsrvd/tls_init.c:206 logsrvd/tls_init.c:227
#, c-format
msgid "unable to set diffie-hellman parameters: %s"
msgstr "не вдалоÑÑ Ð²Ñтановити параметри Діфі-Гелмана: %s"
-#: logsrvd/tls_init.c:277
+#: logsrvd/tls_init.c:283
#, c-format
msgid "unable to create TLS context: %s"
msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ TLS: %s"
-#: logsrvd/tls_init.c:284
+#: logsrvd/tls_init.c:290
#, c-format
msgid "unable to set minimum protocol version to TLS 1.2: %s"
msgstr "не вдалоÑÑ Ð²Ñтановити мінімальну верÑÑ–ÑŽ протоколу у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TLS 1.2: %s"
-#: plugins/sudoers/audit.c:267 plugins/sudoers/audit.c:419
-#: plugins/sudoers/log_client.c:986 plugins/sudoers/log_client.c:1035
-#: plugins/sudoers/log_client.c:1084 plugins/sudoers/log_client.c:1210
-#: plugins/sudoers/logging.c:599 plugins/sudoers/logging.c:696
-#: plugins/sudoers/logging.c:800 plugins/sudoers/logging.c:989
-#: plugins/sudoers/policy.c:123
+#: plugins/sudoers/audit.c:269 plugins/sudoers/audit.c:429
+#: plugins/sudoers/log_client.c:951 plugins/sudoers/log_client.c:1000
+#: plugins/sudoers/log_client.c:1049 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:591 plugins/sudoers/logging.c:689
+#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:983
+#: plugins/sudoers/policy.c:124
msgid "unable to get time of day"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані щодо пори доби"
@@ -1501,7 +1563,7 @@ msgstr "Строк дії облікового запиÑу збіг або у Ñ
msgid "PAM account management error: %s"
msgstr "Помилка ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ð¼Ð¸ запиÑами PAM: %s"
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:266
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:271
#, c-format
msgid "you do not exist in the %s database"
msgstr "Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” у базі даних %s"
@@ -1574,17 +1636,17 @@ msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ умови аудита"
msgid "unable to commit audit record"
msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ð·Ð°Ð¿Ð¸Ñ Ð°ÑƒÐ´Ð¸Ñ‚Ð°"
-#: plugins/sudoers/check.c:275
+#: plugins/sudoers/check.c:285
#, c-format
msgid "error reading lecture file %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтанов %s"
-#: plugins/sudoers/check.c:278
+#: plugins/sudoers/check.c:288
#, c-format
msgid "ignoring lecture file %s: not a regular file"
msgstr "ігноруємо файл наÑтанов %s: він не Ñ” звичайним файлом"
-#: plugins/sudoers/check.c:291
+#: plugins/sudoers/check.c:301
msgid ""
"\n"
"We trust you have received the usual lecture from the local System\n"
@@ -1604,14 +1666,14 @@ msgstr ""
" #3) КориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ¸Ñ€Ð¾ÐºÐ¸Ð¼Ð¸ правами розширює Ñферу відповідальноÑÑ‚Ñ–.\n"
"\n"
-#: plugins/sudoers/check.c:342 plugins/sudoers/check.c:352
-#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:901
-#: plugins/sudoers/sudoers.c:922 plugins/sudoers/tsdump.c:119
+#: plugins/sudoers/check.c:348 plugins/sudoers/check.c:358
+#: plugins/sudoers/parse.c:64 plugins/sudoers/sudoers.c:920
+#: plugins/sudoers/sudoers.c:941 plugins/sudoers/tsdump.c:119
#, c-format
msgid "unknown uid %u"
msgstr "невідоме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ uid %u"
-#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1278
+#: plugins/sudoers/check_aliases.c:99 plugins/sudoers/defaults.c:1279
#, c-format
msgid "%s: %s\n"
msgstr "%s: %s\n"
@@ -1641,7 +1703,7 @@ msgstr "початковий порÑдок: %s: %s"
msgid "order padding: %s: %s"
msgstr "Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ñдку: %s: %s"
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:182
+#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/visudo.c:184
#, c-format
msgid "%s grammar version %d\n"
msgstr "Граматична перевірка %s, верÑÑ–Ñ %d\n"
@@ -1661,14 +1723,14 @@ msgstr "непідтримуваний формат виведеннÑ, %s"
msgid "%s: input and output files must be different"
msgstr "%s: файли вхідних і вихідних даних мають бути різними файлами"
-#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:165
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/testsudoers.c:254
-#: plugins/sudoers/visudo.c:275 plugins/sudoers/visudo.c:644
-#: plugins/sudoers/visudo.c:969
+#: plugins/sudoers/cvtsudoers.c:399 plugins/sudoers/sudoers.c:166
+#: plugins/sudoers/sudoers.c:222 plugins/sudoers/testsudoers.c:254
+#: plugins/sudoers/visudo.c:280 plugins/sudoers/visudo.c:650
+#: plugins/sudoers/visudo.c:975
msgid "unable to initialize sudoers default values"
msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ типові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ sudoers"
-#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:433
+#: plugins/sudoers/cvtsudoers.c:525 plugins/sudoers/ldap_conf.c:434
#, c-format
msgid "%s: %s: %s: %s"
msgstr "%s: %s: %s: %s"
@@ -1693,18 +1755,18 @@ msgstr "некоректний тип придушеннÑ: %s"
msgid "invalid filter: %s"
msgstr "некоректний фільтр: %s"
-#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:974
+#: plugins/sudoers/cvtsudoers.c:754 plugins/sudoers/visudo.c:980
#, c-format
msgid "failed to parse %s file, unknown error"
msgstr "не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ файл %s, невідома помилка"
#: plugins/sudoers/cvtsudoers.c:1478 plugins/sudoers/sudoreplay.c:1145
-#: plugins/sudoers/timestamp.c:317 plugins/sudoers/timestamp.c:320
+#: plugins/sudoers/timestamp.c:343 plugins/sudoers/timestamp.c:346
#, c-format
msgid "unable to write to %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ %s"
-#: plugins/sudoers/cvtsudoers.c:1501
+#: plugins/sudoers/cvtsudoers.c:1506
#, c-format
msgid ""
"%s - convert between sudoers file formats\n"
@@ -1713,7 +1775,7 @@ msgstr ""
"%s — Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñ–Ð² файлів sudoers\n"
"\n"
-#: plugins/sudoers/cvtsudoers.c:1503
+#: plugins/sudoers/cvtsudoers.c:1508
msgid ""
"\n"
"Options:\n"
@@ -2166,359 +2228,383 @@ msgid "Log user's input for the command being run"
msgstr "ЗапиÑувати дані, вказані кориÑтувачем під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
#: plugins/sudoers/def_data.c:356
+msgid "Log the command's standard input if not connected to a terminal"
+msgstr "ЗапиÑувати до журналу джерело Ñтандартних вхідних даних команди, Ñкщо команду не з'єднано із терміналом"
+
+#: plugins/sudoers/def_data.c:360
+msgid "Log the user's terminal input for the command being run"
+msgstr "ЗапиÑувати дані, вказані кориÑтувачем у терміналі, під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
+
+#: plugins/sudoers/def_data.c:364
msgid "Log the output of the command being run"
msgstr "ЗапиÑувати дані, виведені командою під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
-#: plugins/sudoers/def_data.c:360
+#: plugins/sudoers/def_data.c:368
+msgid "Log the command's standard output if not connected to a terminal"
+msgstr "ЗапиÑувати до журналу Ñтандартне Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸, Ñкщо команду не з'єднано із терміналом"
+
+#: plugins/sudoers/def_data.c:372
+msgid "Log the command's standard error if not connected to a terminal"
+msgstr "ЗапиÑувати до журналу Ñтандартне Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº команди, Ñкщо команду не з'єднано із терміналом"
+
+#: plugins/sudoers/def_data.c:376
+msgid "Log the terminal output of the command being run"
+msgstr "ЗапиÑувати дані, виведені командою до термінала під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: plugins/sudoers/def_data.c:380
msgid "Compress I/O logs using zlib"
msgstr "СтиÑкати журнали за допомогою zlib"
-#: plugins/sudoers/def_data.c:364
+#: plugins/sudoers/def_data.c:384
msgid "Always run commands in a pseudo-tty"
msgstr "Завжди запуÑкати команди у пÑевдо-tty"
-#: plugins/sudoers/def_data.c:368
+#: plugins/sudoers/def_data.c:388
#, c-format
msgid "Plugin for non-Unix group support: %s"
msgstr "Додаток Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ не-Unix груп: %s"
-#: plugins/sudoers/def_data.c:372
+#: plugins/sudoers/def_data.c:392
#, c-format
msgid "Directory in which to store input/output logs: %s"
msgstr "Каталог, у Ñкому Ñлід зберігати журнали введеннÑ/виведеннÑ: %s"
-#: plugins/sudoers/def_data.c:376
+#: plugins/sudoers/def_data.c:396
#, c-format
msgid "File in which to store the input/output log: %s"
msgstr "Файл, у Ñкому Ñлід зберігати журнал введеннÑ/Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %s"
-#: plugins/sudoers/def_data.c:380
+#: plugins/sudoers/def_data.c:400
msgid "Add an entry to the utmp/utmpx file when allocating a pty"
msgstr "Додати Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ файла utmp/utmpx під Ñ‡Ð°Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ pty"
-#: plugins/sudoers/def_data.c:384
+#: plugins/sudoers/def_data.c:404
msgid "Set the user in utmp to the runas user, not the invoking user"
msgstr "Ð’Ñтановити кориÑтувача у utmp у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, від імені Ñкого виконуєтьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
-#: plugins/sudoers/def_data.c:388
+#: plugins/sudoers/def_data.c:408
#, c-format
msgid "Set of permitted privileges: %s"
msgstr "Ðабір дозвільних прав доÑтупу: %s"
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:412
#, c-format
msgid "Set of limit privileges: %s"
msgstr "Ðабір обмежувальних прав доÑтупу: %s"
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:416
msgid "Run commands on a pty in the background"
msgstr "Виконувати команди у pty у фоновому режимі"
-#: plugins/sudoers/def_data.c:400
+#: plugins/sudoers/def_data.c:420
#, c-format
msgid "PAM service name to use: %s"
msgstr "Ðазва Ñлужби PAM, Ñкою Ñлід ÑкориÑтатиÑÑ: %s"
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:424
#, c-format
msgid "PAM service name to use for login shells: %s"
msgstr "Ðазва Ñлужби PAM, Ñкою Ñлід ÑкориÑтатиÑÑ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð»Ð¾Ð½Ð¾Ðº входу до ÑиÑтеми: %s"
-#: plugins/sudoers/def_data.c:408
+#: plugins/sudoers/def_data.c:428
#, c-format
msgid "PAM service name to use when sudo is run with the -A option: %s"
msgstr "Ðазва Ñлужби PAM, Ñкою Ñлід ÑкориÑтатиÑÑ, Ñкщо sudo запущено з параметром -A: %s"
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:432
msgid "Attempt to establish PAM credentials for the target user"
msgstr "Спробувати вÑтановити реєÑтраційні дані PAM Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, від імені Ñкого виконуватимутьÑÑ Ð´Ñ–Ñ—"
-#: plugins/sudoers/def_data.c:416
+#: plugins/sudoers/def_data.c:436
msgid "Create a new PAM session for the command to run in"
msgstr "Створити ÑÐµÐ°Ð½Ñ PAM Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
-#: plugins/sudoers/def_data.c:420
+#: plugins/sudoers/def_data.c:440
msgid "Perform PAM account validation management"
msgstr "Виконати ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ñ–ÑÑ‚ÑŽ облікового запиÑу PAM"
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:444
#, c-format
msgid "Maximum I/O log sequence number: %s"
msgstr "МакÑимальний номер у поÑлідовноÑÑ‚Ñ– журналу введеннÑ-виведеннÑ: %s"
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:448
msgid "Enable sudoers netgroup support"
msgstr "Увімкнути підтримку мережевих груп у sudoers"
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:452
msgid "Check parent directories for writability when editing files with sudoedit"
msgstr "ПеревірÑти можливіÑÑ‚ÑŒ запиÑу до батьківÑького каталогу під Ñ‡Ð°Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð»Ñ–Ð² за допомогою sudoedit"
-#: plugins/sudoers/def_data.c:436
+#: plugins/sudoers/def_data.c:456
msgid "Follow symbolic links when editing files with sudoedit"
msgstr "Переходити за Ñимволічними поÑиланнÑми під Ñ‡Ð°Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² за допомогою sudoedit"
-#: plugins/sudoers/def_data.c:440
+#: plugins/sudoers/def_data.c:460
msgid "Query the group plugin for unknown system groups"
msgstr "ÐадÑилати запит до додатка груп щодо невідомих груп ÑиÑтеми"
-#: plugins/sudoers/def_data.c:444
+#: plugins/sudoers/def_data.c:464
msgid "Match netgroups based on the entire tuple: user, host and domain"
msgstr "Ð’Ñтановлювати відповідніÑÑ‚ÑŒ мережевим групам за уÑім кортежем даних: кориÑтувачем, вузлом Ñ– доменом"
-#: plugins/sudoers/def_data.c:448
+#: plugins/sudoers/def_data.c:468
msgid "Allow commands to be run even if sudo cannot write to the audit log"
msgstr "Дозволити Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, навіть Ñкщо sudo не може здійÑнювати Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ журналу аудиту"
-#: plugins/sudoers/def_data.c:452
+#: plugins/sudoers/def_data.c:472
msgid "Allow commands to be run even if sudo cannot write to the I/O log"
msgstr "Дозволити Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, навіть Ñкщо sudo не може здійÑнювати Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ журналу введеннÑ-виведеннÑ"
-#: plugins/sudoers/def_data.c:456
+#: plugins/sudoers/def_data.c:476
msgid "Allow commands to be run even if sudo cannot write to the log file"
msgstr "Дозволити Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, навіть Ñкщо sudo не може здійÑнювати Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ файла журналу"
-#: plugins/sudoers/def_data.c:460
+#: plugins/sudoers/def_data.c:480
msgid "Resolve groups in sudoers and match on the group ID, not the name"
msgstr "Визначати групи у sudoers Ñ– вÑтановлювати відповідніÑÑ‚ÑŒ не назві, а ідентифікатору групи"
-#: plugins/sudoers/def_data.c:464
+#: plugins/sudoers/def_data.c:484
#, c-format
msgid "Log entries larger than this value will be split into multiple syslog messages: %u"
msgstr "ЗапиÑи журналу, Ñкі виÑвлÑÑ‚ÑŒÑÑ Ð´Ð¾Ð²ÑˆÐ¸Ð¼Ð¸ за це значеннÑ, буде поділено на декілька повідомлень журналу ÑиÑтеми: %u"
-#: plugins/sudoers/def_data.c:468
+#: plugins/sudoers/def_data.c:488
#, c-format
msgid "User that will own the I/O log files: %s"
msgstr "КориÑтувач, Ñкий буде влаÑником уÑÑ–Ñ… файлів журналу введеннÑ-виведеннÑ: %s"
-#: plugins/sudoers/def_data.c:472
+#: plugins/sudoers/def_data.c:492
#, c-format
msgid "Group that will own the I/O log files: %s"
msgstr "Група, Ñка буде влаÑником уÑÑ–Ñ… файлів журналу введеннÑ-виведеннÑ: %s"
-#: plugins/sudoers/def_data.c:476
+#: plugins/sudoers/def_data.c:496
#, c-format
msgid "File mode to use for the I/O log files: 0%o"
msgstr "Режим доÑтупу до файлів, Ñким Ñлід ÑкориÑтатиÑÑ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² журналу введеннÑ-виведеннÑ: 0%o"
-#: plugins/sudoers/def_data.c:480
+#: plugins/sudoers/def_data.c:500
#, c-format
msgid "Execute commands by file descriptor instead of by path: %s"
msgstr "Виконати команди за деÑкриптором файла заміÑÑ‚ÑŒ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð° шлÑхом: %s"
-#: plugins/sudoers/def_data.c:484
+#: plugins/sudoers/def_data.c:504
msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
msgstr "Ігнорувати невідомі запиÑи Defaults у sudoers заміÑÑ‚ÑŒ показу попередженнÑ"
-#: plugins/sudoers/def_data.c:488
+#: plugins/sudoers/def_data.c:508
#, c-format
msgid "Time in seconds after which the command will be terminated: %u"
msgstr "Ð§Ð°Ñ Ñƒ Ñекундах, Ñкий має минути, щоб команду буде перервано: %u"
-#: plugins/sudoers/def_data.c:492
+#: plugins/sudoers/def_data.c:512
msgid "Allow the user to specify a timeout on the command line"
msgstr "Ðадати змогу кориÑтувачеві вÑтановлювати Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ командному Ñ€Ñдку"
-#: plugins/sudoers/def_data.c:496
+#: plugins/sudoers/def_data.c:516
msgid "Flush I/O log data to disk immediately instead of buffering it"
msgstr "Скидати дані журналу введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ð° диÑк негайно, без буферизації"
-#: plugins/sudoers/def_data.c:500
+#: plugins/sudoers/def_data.c:520
msgid "Include the process ID when logging via syslog"
msgstr "Включати ідентифікатор процеÑу до журналів syslog"
-#: plugins/sudoers/def_data.c:504
+#: plugins/sudoers/def_data.c:524
#, c-format
msgid "Type of authentication timestamp record: %s"
msgstr "Тип запиÑу чаÑової позначки розпізнаваннÑ: %s"
-#: plugins/sudoers/def_data.c:508
+#: plugins/sudoers/def_data.c:528
#, c-format
msgid "Authentication failure message: %s"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку розпізнаваннÑ: %s"
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:532
msgid "Ignore case when matching user names"
msgstr "Ігнорувати регіÑÑ‚Ñ€ Ñимволів при пошуку імен кориÑтувачів"
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:536
msgid "Ignore case when matching group names"
msgstr "Ігнорувати регіÑÑ‚Ñ€ Ñимволів при пошуку назв груп"
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:540
msgid "Log when a command is allowed by sudoers"
msgstr "ЗапиÑувати до журналу дані, коли Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ дозволене sudoers"
-#: plugins/sudoers/def_data.c:524
+#: plugins/sudoers/def_data.c:544
msgid "Log when a command is denied by sudoers"
msgstr "ЗапиÑувати до журналу дані, коли Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ заборонене sudoers"
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:548
msgid "Sudo log server(s) to connect to with optional port"
msgstr "Сервер або Ñервери журналу sudo, з Ñкими Ñлід вÑтановити з'єднаннÑ, з необов'Ñзковим зазначеннÑм порту"
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:552
#, c-format
msgid "Sudo log server timeout in seconds: %u"
msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° дії Ñервера журналу sudo у Ñекундах: %u"
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:556
msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
msgstr "Увімкнути параметр Ñокета SO_KEEPALIVE на Ñокеті, Ñкий з'єднано із Ñервером журналу"
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:560
#, c-format
msgid "Path to the audit server's CA bundle file: %s"
msgstr "ШлÑÑ… до файла пакета CA Ñервера аудиту: %s"
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:564
#, c-format
msgid "Path to the sudoers certificate file: %s"
msgstr "ШлÑÑ… до файла Ñертифікатів sudoers: %s"
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:568
#, c-format
msgid "Path to the sudoers private key file: %s"
msgstr "ШлÑÑ… до файла закритого ключа sudoers: %s"
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:572
msgid "Verify that the log server's certificate is valid"
msgstr "Перевірити, чи Ñ” Ñертифікат Ñервера Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‡Ð¸Ð½Ð½Ð¸Ð¼"
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:576
msgid "Allow the use of unknown runas user and/or group ID"
msgstr "Дозволити викориÑÑ‚Ð°Ð½Ð½Ñ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð¸Ñ… значень імені кориÑтувача Ñ–/або ідентифікатора групи Ð´Ð»Ñ runas"
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:580
msgid "Only permit running commands as a user with a valid shell"
msgstr "ДозволÑти Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ лише від імені кориÑтувачів із коректним запиÑом командної оболонки"
-#: plugins/sudoers/def_data.c:564
+#: plugins/sudoers/def_data.c:584
msgid "Set the pam remote user to the user running sudo"
msgstr "Ð’Ñтановити Ð´Ð»Ñ Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ð¾Ð³Ð¾ кориÑтувача PAM те Ñаме ім'Ñ, що Ñ– Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, від імені Ñкого запущено sudo"
-#: plugins/sudoers/def_data.c:568
+#: plugins/sudoers/def_data.c:588
msgid "Set the pam remote host to the local host name"
msgstr "Ð’Ñтановити Ð´Ð»Ñ Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ð¾Ð³Ð¾ вузла PAM назву локального вузла"
-#: plugins/sudoers/def_data.c:572
+#: plugins/sudoers/def_data.c:592
#, c-format
msgid "Working directory to change to before executing the command: %s"
msgstr "Робочий каталог, до Ñкого Ñлід перейти перед виконаннÑм команди: %s"
-#: plugins/sudoers/def_data.c:576
+#: plugins/sudoers/def_data.c:596
#, c-format
msgid "Root directory to change to before executing the command: %s"
msgstr "Кореневий каталог, до Ñкого Ñлід перейти перед виконаннÑм команди: %s"
-#: plugins/sudoers/def_data.c:580
+#: plugins/sudoers/def_data.c:600
#, c-format
msgid "The format of logs to produce: %s"
msgstr "Формат журналу: %s"
-#: plugins/sudoers/def_data.c:584
+#: plugins/sudoers/def_data.c:604
msgid "Enable SELinux RBAC support"
msgstr "Увімкнути підтримку RBAC SELinux"
-#: plugins/sudoers/def_data.c:588
+#: plugins/sudoers/def_data.c:608
#, c-format
msgid "Path to the file that is created the first time sudo is run: %s"
msgstr "ШлÑÑ… до файла, Ñкий було Ñтворено під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ запуÑку sudo: %s"
-#: plugins/sudoers/def_data.c:592
+#: plugins/sudoers/def_data.c:612
msgid "Intercept further commands and apply sudoers restrictions to them"
msgstr "Перехоплювати подальші команди Ñ– заÑтоÑовувати до них Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ sudoers"
-#: plugins/sudoers/def_data.c:596
+#: plugins/sudoers/def_data.c:616
msgid "Log sub-commands run by the original command"
msgstr "ЗапиÑувати до журналу підкоманди, Ñкі запущено початковою командою"
-#: plugins/sudoers/def_data.c:600
+#: plugins/sudoers/def_data.c:620
msgid "Log the exit status of commands"
msgstr "ЗапиÑувати до журналу Ñтан виходу команд"
-#: plugins/sudoers/def_data.c:604
+#: plugins/sudoers/def_data.c:624
msgid "Subsequent commands in an intercepted session must be authenticated"
msgstr "Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð½Ð°Ñтупних команд у перехопленому ÑеанÑÑ– Ñлід пройти розпізнаваннÑ"
-#: plugins/sudoers/def_data.c:608
+#: plugins/sudoers/def_data.c:628
msgid "Allow an intercepted command to run set setuid or setgid programs"
msgstr "Дозволити перехопленій команді запуÑкати програми зі вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ setuid або setgid"
-#: plugins/sudoers/def_data.c:612
+#: plugins/sudoers/def_data.c:632
#, c-format
msgid "The maximum size to which the process's address space may grow (in bytes): %s"
msgstr "МакÑимальний розмір, до Ñкого може зроÑтати адреÑний проÑÑ‚Ñ–Ñ€ процеÑу (у байтах): %s"
-#: plugins/sudoers/def_data.c:616
+#: plugins/sudoers/def_data.c:636
#, c-format
msgid "The largest size core dump file that may be created (in bytes): %s"
msgstr "Ðайбільший розмір файла дампа Ñдра, Ñкий може бути Ñтворено (у байтах): %s"
-#: plugins/sudoers/def_data.c:620
+#: plugins/sudoers/def_data.c:640
#, c-format
msgid "The maximum amount of CPU time that the process may use (in seconds): %s"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ чаÑу процеÑора, Ñкий може викориÑтовувати Ð¿Ñ€Ð¾Ñ†ÐµÑ (у Ñекундах): %s"
-#: plugins/sudoers/def_data.c:624
+#: plugins/sudoers/def_data.c:644
#, c-format
msgid "The maximum size of the data segment for the process (in bytes): %s"
msgstr "МакÑимальний розмір Ñегмента даних Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу (у байтах): %s"
-#: plugins/sudoers/def_data.c:628
+#: plugins/sudoers/def_data.c:648
#, c-format
msgid "The largest size file that the process may create (in bytes): %s"
msgstr "Ðайбільший розмір файла, Ñкий може Ñтворювати Ð¿Ñ€Ð¾Ñ†ÐµÑ (у байтах): %s"
-#: plugins/sudoers/def_data.c:632
+#: plugins/sudoers/def_data.c:652
#, c-format
msgid "The maximum number of locks that the process may establish: %s"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ блокувань, Ñкі може вÑтановлювати процеÑ: %s"
-#: plugins/sudoers/def_data.c:636
+#: plugins/sudoers/def_data.c:656
#, c-format
msgid "The maximum size that the process may lock in memory (in bytes): %s"
msgstr "МакÑимальний розмір, Ñкий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¼Ð¾Ð¶Ðµ блокувати у пам'ÑÑ‚Ñ– (у байтах): %s"
-#: plugins/sudoers/def_data.c:640
+#: plugins/sudoers/def_data.c:660
#, c-format
msgid "The maximum number of files that the process may have open: %s"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ файлів, Ñкі може відкривати процеÑ: %s"
-#: plugins/sudoers/def_data.c:644
+#: plugins/sudoers/def_data.c:664
#, c-format
msgid "The maximum number of processes that the user may run simultaneously: %s"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ процеÑів, Ñкі кориÑтувач може запуÑкати одночаÑно: %s"
-#: plugins/sudoers/def_data.c:648
+#: plugins/sudoers/def_data.c:668
#, c-format
msgid "The maximum size to which the process's resident set size may grow (in bytes): %s"
msgstr "МакÑимальний розмір, до Ñкого може зроÑтати розмір резидентного набору (у байтах): %s"
-#: plugins/sudoers/def_data.c:652
+#: plugins/sudoers/def_data.c:672
#, c-format
msgid "The maximum size to which the process's stack may grow (in bytes): %s"
msgstr "МакÑимальний розмір, до Ñкого може зроÑтати ÑÑ‚Ð¾Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу (у байтах): %s"
-#: plugins/sudoers/def_data.c:656
+#: plugins/sudoers/def_data.c:676
msgid "Attempt authentication even when in non-interactive mode"
msgstr "ÐамагатиÑÑ Ð¿Ñ€Ð¾Ð¹Ñ‚Ð¸ розпізнаваннÑ, навіть Ñкщо працюємо не в інтерактивному режимі"
-#: plugins/sudoers/def_data.c:660
+#: plugins/sudoers/def_data.c:680
msgid "Store plaintext passwords in I/O log input"
msgstr "Зберігати звичайний текÑÑ‚ паролів у вхідних даних журналу введеннÑ-виведеннÑ"
-#: plugins/sudoers/def_data.c:664
+#: plugins/sudoers/def_data.c:684
msgid "List of regular expressions to use when matching a password prompt"
msgstr "СпиÑок формальних виразів Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ– при запиті паролÑ"
-#: plugins/sudoers/def_data.c:668
+#: plugins/sudoers/def_data.c:688
#, c-format
msgid "The mechanism used by the intercept and log_subcmds options: %s"
msgstr "Механізм, Ñкий викориÑтано Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² intercept Ñ– log_subcmds: %s"
-#: plugins/sudoers/def_data.c:672
+#: plugins/sudoers/def_data.c:692
+msgid "Attempt to verify the command and arguments after execution"
+msgstr "Спробувати перевірити команду Ñ– аргументи піÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: plugins/sudoers/def_data.c:696
#, c-format
msgid "AppArmor profile to use in the new security context: %s"
msgstr "Профіль AppArmor, Ñкий Ñлід викориÑтати у новому контекÑÑ‚Ñ– захиÑту: %s"
@@ -2553,31 +2639,31 @@ msgstr "некоректний тип Defaults, 0x%x, Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°
msgid "value \"%s\" is invalid for option \"%s\""
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s» Ñ” некоректним Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s»"
-#: plugins/sudoers/defaults.c:1127 plugins/sudoers/policy.c:207
-#: plugins/sudoers/policy.c:216
+#: plugins/sudoers/defaults.c:1128 plugins/sudoers/policy.c:208
+#: plugins/sudoers/policy.c:217
#, c-format
msgid "path name for \"%s\" too long"
msgstr "назва шлÑху Ð´Ð»Ñ Â«%s» Ñ” надто довгою"
-#: plugins/sudoers/defaults.c:1133
+#: plugins/sudoers/defaults.c:1134
#, c-format
msgid "values for \"%s\" must start with a '/', '~', or '*'"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Â«%s» має починатиÑÑ Ð· «/», «~» або «*»"
-#: plugins/sudoers/defaults.c:1140
+#: plugins/sudoers/defaults.c:1141
#, c-format
msgid "values for \"%s\" must start with a '/'"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Â«%s» має починатиÑÑ Ð· «/»"
-#: plugins/sudoers/env.c:412
+#: plugins/sudoers/env.c:426
msgid "sudo_putenv: corrupted envp, length mismatch"
msgstr "sudo_putenv: помилкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ envp, невідповідніÑÑ‚ÑŒ довжин"
-#: plugins/sudoers/env.c:1095
+#: plugins/sudoers/env.c:1109
msgid "unable to rebuild the environment"
msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ±ÑƒÐ´ÑƒÐ²Ð°Ñ‚Ð¸ Ñередовище"
-#: plugins/sudoers/env.c:1169
+#: plugins/sudoers/env.c:1183
#, c-format
msgid "sorry, you are not allowed to set the following environment variables: %s"
msgstr "вибачте, вам не дозволено вÑтановлювати такі змінні Ñередовища: %s"
@@ -2592,27 +2678,27 @@ msgstr "непідтримуваний тип контрольної Ñуми, %
msgid "%s: read error"
msgstr "%s: помилка читаннÑ"
-#: plugins/sudoers/group_plugin.c:83
+#: plugins/sudoers/group_plugin.c:169
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s має належати кориÑтувачеві з uid %d"
-#: plugins/sudoers/group_plugin.c:87
+#: plugins/sudoers/group_plugin.c:173
#, c-format
msgid "%s must only be writable by owner"
msgstr "%s має бути доÑтупним до запиÑу лише Ð´Ð»Ñ Ð²Ð»Ð°Ñника"
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:576
+#: plugins/sudoers/group_plugin.c:185 plugins/sudoers/sssd.c:576
#, c-format
msgid "unable to load %s: %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ %s: %s"
-#: plugins/sudoers/group_plugin.c:102
+#: plugins/sudoers/group_plugin.c:197
#, c-format
msgid "unable to find symbol \"group_plugin\" in %s"
msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñимвол «group_plugin» у %s"
-#: plugins/sudoers/group_plugin.c:107
+#: plugins/sudoers/group_plugin.c:202
#, c-format
msgid "%s: incompatible group plugin major version %d, expected %d"
msgstr "%s: неÑуміÑна оÑновна верÑÑ–Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ° обробки груп %d, мало бути — %d"
@@ -2635,10 +2721,10 @@ msgstr "Пари локальних IP-Ð°Ð´Ñ€ÐµÑ Ñ– маÑок мережі:\n"
msgid "unable to update sequence file"
msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файл поÑлідовноÑÑ‚Ñ–"
-#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:907
-#: plugins/sudoers/iolog.c:1069 plugins/sudoers/iolog.c:1076
-#: plugins/sudoers/iolog.c:1197 plugins/sudoers/iolog.c:1204
-#: plugins/sudoers/iolog.c:1303 plugins/sudoers/iolog.c:1310
+#: plugins/sudoers/iolog.c:719 plugins/sudoers/iolog.c:909
+#: plugins/sudoers/iolog.c:1071 plugins/sudoers/iolog.c:1078
+#: plugins/sudoers/iolog.c:1199 plugins/sudoers/iolog.c:1206
+#: plugins/sudoers/iolog.c:1305 plugins/sudoers/iolog.c:1312
#, c-format
msgid "unable to write to I/O log file: %s"
msgstr "не вдалоÑÑ Ð·Ð´Ñ–Ð¹Ñнити Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ файла журналу введеннÑ-виведеннÑ: %s"
@@ -2648,25 +2734,25 @@ msgstr "не вдалоÑÑ Ð·Ð´Ñ–Ð¹Ñнити Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ файла жур
msgid "unable to create %s/%s"
msgstr "не вдалоÑÑ Ñтворити %s/%s"
-#: plugins/sudoers/iolog.c:955
+#: plugins/sudoers/iolog.c:957
#, c-format
msgid "%s: internal error, I/O log file for event %d not open"
msgstr "%s: Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, файл журналу введеннÑ-Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ–Ñ— %d не відкрито"
-#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1182
-#: plugins/sudoers/iolog.c:1287 plugins/sudoers/timestamp.c:849
-#: plugins/sudoers/timestamp.c:941 plugins/sudoers/visudo.c:546
-#: plugins/sudoers/visudo.c:552
+#: plugins/sudoers/iolog.c:1056 plugins/sudoers/iolog.c:1184
+#: plugins/sudoers/iolog.c:1289 plugins/sudoers/timestamp.c:879
+#: plugins/sudoers/timestamp.c:971 plugins/sudoers/visudo.c:552
+#: plugins/sudoers/visudo.c:558
msgid "unable to read the clock"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñ‡Ð°Ñ Ð½Ð° годиннику"
-#: plugins/sudoers/iolog.c:1279 plugins/sudoers/log_client.c:1228
-#: plugins/sudoers/log_client.c:1238 plugins/sudoers/log_client.c:1242
+#: plugins/sudoers/iolog.c:1281 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/log_client.c:1203 plugins/sudoers/log_client.c:1207
#, c-format
msgid "%s: internal error, invalid signal %d"
msgstr "%s: Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, некоректний Ñигнал %d"
-#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:292
msgid "starttls not supported when using ldaps"
msgstr "підтримки starttls, Ñкщо викориÑтовуєтьÑÑ ldaps, не передбачено"
@@ -2689,7 +2775,7 @@ msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ LDAP: %s"
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:1886 plugins/sudoers/parse_ldif.c:747
+#: plugins/sudoers/ldap.c:1886 plugins/sudoers/parse_ldif.c:748
#, c-format
msgid "invalid sudoOrder attribute: %s"
msgstr "некоректний атрибут sudoOrder: %s"
@@ -2699,12 +2785,12 @@ msgstr "некоректний атрибут sudoOrder: %s"
msgid "%s: port too large"
msgstr "%s: порт є надто великим"
-#: plugins/sudoers/ldap_conf.c:260
+#: plugins/sudoers/ldap_conf.c:261
#, c-format
msgid "unsupported LDAP uri type: %s"
msgstr "непідтримуваний тип адреÑи LDAP: %s"
-#: plugins/sudoers/ldap_conf.c:287
+#: plugins/sudoers/ldap_conf.c:288
msgid "unable to mix ldap and ldaps URIs"
msgstr "не можна викориÑтовувати Ñуміш з Ð°Ð´Ñ€ÐµÑ ldap Ñ– ldaps"
@@ -2729,111 +2815,111 @@ msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ ÑиÑтему аудита"
msgid "unable to send audit message"
msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð°ÑƒÐ´Ð¸Ñ‚Ð°"
-#: plugins/sudoers/log_client.c:120 plugins/sudoers/log_client.c:407
-#: plugins/sudoers/log_client.c:1475 plugins/sudoers/log_client.c:2083
+#: plugins/sudoers/log_client.c:125 plugins/sudoers/log_client.c:412
+#: plugins/sudoers/log_client.c:1440 plugins/sudoers/log_client.c:2056
msgid "error in event loop"
msgstr "помилка у циклі обробки подій"
-#: plugins/sudoers/log_client.c:200
+#: plugins/sudoers/log_client.c:205
#, c-format
msgid "Creation of new SSL_CTX object failed: %s"
msgstr "Ðе вдалоÑÑ Ñтворити об'єкт SSL_CTX: %s"
-#: plugins/sudoers/log_client.c:225
+#: plugins/sudoers/log_client.c:230
#, c-format
msgid "unable to load certificate authority bundle %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ комплект Ñлужби Ñертифікації %s"
-#: plugins/sudoers/log_client.c:247
+#: plugins/sudoers/log_client.c:252
#, c-format
msgid "unable to load certificate %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñертифікат %s"
-#: plugins/sudoers/log_client.c:261
+#: plugins/sudoers/log_client.c:266
#, c-format
msgid "unable to load private key %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ закритий ключ %s"
-#: plugins/sudoers/log_client.c:270
+#: plugins/sudoers/log_client.c:275
#, c-format
msgid "Unable to allocate ssl object: %s"
msgstr "Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñтити об'єкт SSL у пам'ÑÑ‚Ñ–: %s"
-#: plugins/sudoers/log_client.c:359 plugins/sudoers/log_client.c:364
+#: plugins/sudoers/log_client.c:364 plugins/sudoers/log_client.c:369
#, c-format
msgid "TLS connection to %s:%s failed: %s"
msgstr "Ðе вдалоÑÑ Ð²Ñтановити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ TLS із %s:%s: %s"
-#: plugins/sudoers/log_client.c:538
+#: plugins/sudoers/log_client.c:543
msgid "TLS initialization was unsuccessful"
msgstr "Спроба ініціалізувати TLS завершилаÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾"
-#: plugins/sudoers/log_client.c:548
+#: plugins/sudoers/log_client.c:553
msgid "TLS handshake was unsuccessful"
msgstr "Спроба узгодити зв'Ñзок TLS завершилаÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾"
-#: plugins/sudoers/log_client.c:1246
+#: plugins/sudoers/log_client.c:1211
#, c-format
msgid "%s: internal error, invalid exit status %d"
msgstr "%s: Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, некоректний Ñтан виходу %d"
-#: plugins/sudoers/log_client.c:1775 plugins/sudoers/log_client.c:1799
+#: plugins/sudoers/log_client.c:1740 plugins/sudoers/log_client.c:1764
msgid "lost connection to log server"
msgstr "втрачено зв’Ñзок з Ñервером журналу"
-#: plugins/sudoers/log_client.c:1876
+#: plugins/sudoers/log_client.c:1841
msgid "missing write buffer"
msgstr "не вказано буфер запиÑу"
-#: plugins/sudoers/log_client.c:2024
+#: plugins/sudoers/log_client.c:1995
msgid "unable to connect to log server"
msgstr "не вдалоÑÑ Ð²Ñтановити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· Ñервером журналу"
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:290
msgid "user NOT in sudoers"
msgstr "кориÑтувача немає у ÑпиÑку sudoers"
-#: plugins/sudoers/logging.c:300
+#: plugins/sudoers/logging.c:292
msgid "user NOT authorized on host"
msgstr "кориÑтувача не уповноважено на дії на вузлі"
-#: plugins/sudoers/logging.c:302
+#: plugins/sudoers/logging.c:294
msgid "command not allowed"
msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ заборонено"
-#: plugins/sudoers/logging.c:323
+#: plugins/sudoers/logging.c:315
#, c-format
msgid "%s is not in the sudoers file.\n"
msgstr "%s немає у файлі sudoers.\n"
-#: plugins/sudoers/logging.c:326
+#: plugins/sudoers/logging.c:318
#, c-format
msgid "%s is not allowed to run sudo on %s.\n"
msgstr "%s не має права виконувати sudo на %s.\n"
-#: plugins/sudoers/logging.c:329
+#: plugins/sudoers/logging.c:321
#, c-format
msgid "Sorry, user %s may not run sudo on %s.\n"
msgstr "Вибачте, кориÑтувач %s не має права виконувати sudo на %s.\n"
-#: plugins/sudoers/logging.c:332
+#: plugins/sudoers/logging.c:324
#, 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:342
+#: plugins/sudoers/logging.c:334
msgid "This incident has been reported to the administrator.\n"
msgstr "Про цю подію подано звіт адмініÑтратору.\n"
-#: plugins/sudoers/logging.c:373 plugins/sudoers/sudoers.c:643
-#: plugins/sudoers/sudoers.c:645 plugins/sudoers/sudoers.c:647
-#: plugins/sudoers/sudoers.c:649 plugins/sudoers/sudoers.c:799
-#: plugins/sudoers/sudoers.c:801
+#: plugins/sudoers/logging.c:365 plugins/sudoers/sudoers.c:648
+#: plugins/sudoers/sudoers.c:650 plugins/sudoers/sudoers.c:652
+#: plugins/sudoers/sudoers.c:654 plugins/sudoers/sudoers.c:805
+#: plugins/sudoers/sudoers.c:807
#, c-format
msgid "%s: command not found"
msgstr "%s: команду не знайдено"
-#: plugins/sudoers/logging.c:375 plugins/sudoers/sudoers.c:639
+#: plugins/sudoers/logging.c:367 plugins/sudoers/sudoers.c:644
#, c-format
msgid ""
"ignoring \"%s\" found in '.'\n"
@@ -2842,7 +2928,7 @@ msgstr ""
"пропущено «%s» знайдений у «.»\n"
"СкориÑтайтеÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ «sudo ./%s», Ñкщо вам потрібно виконати Ñаме «%s»."
-#: plugins/sudoers/logging.c:395
+#: plugins/sudoers/logging.c:387
#, c-format
msgid "%u incorrect password attempt"
msgid_plural "%u incorrect password attempts"
@@ -2851,24 +2937,24 @@ msgstr[1] "%u невдалих Ñпроби Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"
msgstr[2] "%u невдалих Ñпроб Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"
msgstr[3] "одна невдала Ñпроба Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"
-#: plugins/sudoers/logging.c:485
+#: plugins/sudoers/logging.c:477
msgid "authentication failure"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби розпізнаваннÑ"
-#: plugins/sudoers/logging.c:524 plugins/sudoers/logging.c:543
+#: plugins/sudoers/logging.c:516 plugins/sudoers/logging.c:535
msgid "a password is required"
msgstr "Ñлід вказати пароль"
-#: plugins/sudoers/logging.c:806 plugins/sudoers/logging.c:818
+#: plugins/sudoers/logging.c:799 plugins/sudoers/logging.c:811
msgid "problem parsing sudoers"
msgstr "проблема із обробкою sudoers"
-#: plugins/sudoers/logging.c:879 plugins/sudoers/logging.c:891
+#: plugins/sudoers/logging.c:873 plugins/sudoers/logging.c:885
#, c-format
msgid "%s:%d:%d: %s"
msgstr "%s:%d:%d: %s"
-#: plugins/sudoers/logging.c:1068
+#: plugins/sudoers/logging.c:1062
#, c-format
msgid "unable to write log file: %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ файла журналу: %s"
@@ -2883,7 +2969,7 @@ msgstr "контрольна Ñума Ð´Ð»Ñ %s (%s) має помилкову Ð
msgid "digest for %s (%s) is not in %s form"
msgstr "контрольну Ñуму Ð´Ð»Ñ %s (%s) подано не у формі %s"
-#: plugins/sudoers/parse.c:585
+#: plugins/sudoers/parse.c:591
#, c-format
msgid ""
"\n"
@@ -2892,7 +2978,7 @@ msgstr ""
"\n"
"Роль LDAP: %s\n"
-#: plugins/sudoers/parse.c:588
+#: plugins/sudoers/parse.c:594
msgid ""
"\n"
"Sudoers entry:\n"
@@ -2900,110 +2986,110 @@ msgstr ""
"\n"
"Ð—Ð°Ð¿Ð¸Ñ sudoers:\n"
-#: plugins/sudoers/parse.c:590
+#: plugins/sudoers/parse.c:596
msgid " RunAsUsers: "
msgstr " КориÑтувачі Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку: "
-#: plugins/sudoers/parse.c:605
+#: plugins/sudoers/parse.c:611
msgid " RunAsGroups: "
msgstr " Групи Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку: "
-#: plugins/sudoers/parse.c:615
+#: plugins/sudoers/parse.c:621
msgid " Options: "
msgstr " Параметри: "
-#: plugins/sudoers/parse.c:679
+#: plugins/sudoers/parse.c:685
msgid " Commands:\n"
msgstr " Команди:\n"
-#: plugins/sudoers/parse.c:870
+#: plugins/sudoers/parse.c:876
#, c-format
msgid "Matching Defaults entries for %s on %s:\n"
msgstr "ВідповідніÑÑ‚ÑŒ запиÑів Defaults Ð´Ð»Ñ %s на %s:\n"
-#: plugins/sudoers/parse.c:888
+#: plugins/sudoers/parse.c:894
#, c-format
msgid "Runas and Command-specific defaults for %s:\n"
msgstr "Типові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку від імені Ñ– команд Ð´Ð»Ñ %s:\n"
-#: plugins/sudoers/parse.c:906
+#: plugins/sudoers/parse.c:912
#, c-format
msgid "User %s may run the following commands on %s:\n"
msgstr "КориÑтувач %s має право виконувати на %s такі команди:\n"
-#: plugins/sudoers/parse.c:921
+#: plugins/sudoers/parse.c:927
#, c-format
msgid "User %s is not allowed to run sudo on %s.\n"
msgstr "КориÑтувач %s не має права виконувати sudo на %s.\n"
-#: plugins/sudoers/parse_ldif.c:617
+#: plugins/sudoers/parse_ldif.c:618
#, c-format
msgid "ignoring incomplete sudoRole: cn: %s"
msgstr "ігноруємо неповний Ð·Ð°Ð¿Ð¸Ñ sudoRole: cn: %s"
-#: plugins/sudoers/parse_ldif.c:677
+#: plugins/sudoers/parse_ldif.c:678
#, c-format
msgid "invalid LDIF attribute: %s"
msgstr "некоректний атрибут LDIF: %s"
-#: plugins/sudoers/policy.c:80 plugins/sudoers/policy.c:111
+#: plugins/sudoers/policy.c:81 plugins/sudoers/policy.c:112
#, c-format
msgid "invalid %.*s set by sudo front-end"
msgstr "оболонкою sudo вÑтановлено некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %.*s"
-#: plugins/sudoers/policy.c:351 plugins/sudoers/testsudoers.c:268
+#: plugins/sudoers/policy.c:358 plugins/sudoers/testsudoers.c:268
msgid "unable to parse network address list"
msgstr "не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ ÑпиÑок мережевих адреÑ"
-#: plugins/sudoers/policy.c:508
+#: plugins/sudoers/policy.c:526
msgid "user name not set by sudo front-end"
msgstr "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не вÑтановлено за допомогою оболонки sudo"
-#: plugins/sudoers/policy.c:512
+#: plugins/sudoers/policy.c:530
msgid "user-ID not set by sudo front-end"
msgstr "ідентифікатор кориÑтувача не вÑтановлено за допомогою оболонки sudo"
-#: plugins/sudoers/policy.c:516
+#: plugins/sudoers/policy.c:534
msgid "group-ID not set by sudo front-end"
msgstr "ідентифікатор групи не вÑтановлено за допомогою оболонки sudo"
-#: plugins/sudoers/policy.c:520
+#: plugins/sudoers/policy.c:538
msgid "host name not set by sudo front-end"
msgstr "назву вузла не вÑтановлено за допомогою оболонки sudo"
-#: plugins/sudoers/policy.c:706
+#: plugins/sudoers/policy.c:730
#, c-format
msgid "invalid working directory: %s"
msgstr "некоректний робочий каталог: %s"
-#: plugins/sudoers/policy.c:886
+#: plugins/sudoers/policy.c:914
#, c-format
msgid "invalid chroot directory: %s"
msgstr "некоректний каталог chroot: %s"
-#: plugins/sudoers/policy.c:1071 plugins/sudoers/visudo.c:254
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/policy.c:1101 plugins/sudoers/visudo.c:259
+#: plugins/sudoers/visudo.c:902
#, c-format
msgid "unable to execute %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ %s"
-#: plugins/sudoers/policy.c:1141 plugins/sudoers/policy.c:1178
-#: plugins/sudoers/policy.c:1200 plugins/sudoers/policy.c:1226
+#: plugins/sudoers/policy.c:1171 plugins/sudoers/policy.c:1208
+#: plugins/sudoers/policy.c:1230 plugins/sudoers/policy.c:1256
#, c-format
msgid "%s: invalid mode flags from sudo front end: 0x%x"
msgstr "%s: некоректні прапорці режиму від оболонки sudo: 0x%x"
-#: plugins/sudoers/policy.c:1262
+#: plugins/sudoers/policy.c:1292
#, c-format
msgid "Sudoers policy plugin version %s\n"
msgstr "Додаток правил sudoers верÑÑ–Ñ— %s\n"
-#: plugins/sudoers/policy.c:1264
+#: plugins/sudoers/policy.c:1294
#, c-format
msgid "Sudoers file grammar version %d\n"
msgstr "Граматична перевірка файла sudoers верÑÑ–Ñ— %d\n"
-#: plugins/sudoers/policy.c:1268
+#: plugins/sudoers/policy.c:1298
#, c-format
msgid ""
"\n"
@@ -3012,27 +3098,27 @@ msgstr ""
"\n"
"ШлÑÑ… до sudoers: %s\n"
-#: plugins/sudoers/policy.c:1271
+#: plugins/sudoers/policy.c:1301
#, c-format
msgid "nsswitch path: %s\n"
msgstr "ШлÑÑ… до nsswitch: %s\n"
-#: plugins/sudoers/policy.c:1273
+#: plugins/sudoers/policy.c:1303
#, c-format
msgid "ldap.conf path: %s\n"
msgstr "ШлÑÑ… до ldap.conf: %s\n"
-#: plugins/sudoers/policy.c:1274
+#: plugins/sudoers/policy.c:1304
#, c-format
msgid "ldap.secret path: %s\n"
msgstr "ШлÑÑ… до ldap.secret: %s\n"
-#: plugins/sudoers/policy.c:1307
+#: plugins/sudoers/policy.c:1337
#, c-format
msgid "unable to register hook of type %d (version %d.%d)"
msgstr "неможливо зареєÑтрувати процедуру Ð¿ÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %d (верÑÑ–Ñ %d.%d)"
-#: plugins/sudoers/policy.c:1325
+#: plugins/sudoers/policy.c:1355
#, c-format
msgid "unable to deregister hook of type %d (version %d.%d)"
msgstr "неможливо ÑкаÑувати реєÑтрацію процедури Ð¿ÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %d (верÑÑ–Ñ %d.%d)"
@@ -3171,148 +3257,142 @@ msgstr "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ джерело SSS. ЧÐ
msgid "unable to find symbol \"%s\" in %s"
msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñимвол «%s» у %s"
-#: plugins/sudoers/sudoers.c:258
+#: plugins/sudoers/sudoers.c:263
#, c-format
msgid "unable to get defaults from %s"
msgstr "на вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ типові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s"
-#: plugins/sudoers/sudoers.c:265
+#: plugins/sudoers/sudoers.c:270
msgid "no valid sudoers sources found, quitting"
msgstr "не знайдено коректних джерел даних sudoers, Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸"
-#: plugins/sudoers/sudoers.c:341
+#: plugins/sudoers/sudoers.c:346
#, c-format
msgid "user not allowed to change root directory to %s"
msgstr "кориÑтувачеві заборонено змінювати кореневий каталог на %s"
-#: plugins/sudoers/sudoers.c:343
+#: plugins/sudoers/sudoers.c:348
#, c-format
msgid "you are not permitted to use the -R option with %s"
msgstr "вам не дозволено викориÑтовувати параметр -R з %s"
-#: plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:373
#, c-format
msgid "user not allowed to change directory to %s"
msgstr "кориÑтувачеві заборонено змінювати каталог на %s"
-#: plugins/sudoers/sudoers.c:369
+#: plugins/sudoers/sudoers.c:374
#, c-format
msgid "you are not permitted to use the -D option with %s"
msgstr "вам не дозволено викориÑтовувати параметр -D з %s"
-#: plugins/sudoers/sudoers.c:396
+#: plugins/sudoers/sudoers.c:401
msgid "no command specified"
msgstr "не вказано команду"
-#: plugins/sudoers/sudoers.c:421
+#: plugins/sudoers/sudoers.c:426
msgid "sudoers specifies that root is not allowed to sudo"
msgstr "sudoers вказує, що sudo не можна кориÑтуватиÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ від root"
-#: plugins/sudoers/sudoers.c:471
+#: plugins/sudoers/sudoers.c:476
msgid "user not allowed to override closefrom limit"
msgstr "кориÑтувачеві заборонено перевизначати Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ closefrom"
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:477
msgid "you are not permitted to use the -C option"
msgstr "вам не дозволено викориÑтовувати параметр -C"
-#: plugins/sudoers/sudoers.c:532
+#: plugins/sudoers/sudoers.c:537
#, c-format
msgid "timestamp owner (%s): No such user"
msgstr "влаÑник чаÑового штампа (%s): не знайдено кориÑтувача з таким іменем"
-#: plugins/sudoers/sudoers.c:547
+#: plugins/sudoers/sudoers.c:552
msgid "no tty"
msgstr "немає tty"
-#: plugins/sudoers/sudoers.c:548
+#: plugins/sudoers/sudoers.c:553
msgid "sorry, you must have a tty to run sudo"
msgstr "вибачте, Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ sudo вашому кориÑтувачеві потрібен tty"
-#: plugins/sudoers/sudoers.c:555
+#: plugins/sudoers/sudoers.c:560
#, c-format
msgid "invalid shell for user %s: %s"
msgstr "некоректний Ð·Ð°Ð¿Ð¸Ñ Ð¾Ð±Ð¾Ð»Ð¾Ð½ÐºÐ¸ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача %s: %s"
-#: plugins/sudoers/sudoers.c:638
+#: plugins/sudoers/sudoers.c:643
msgid "command in current directory"
msgstr "команда у поточному каталозі"
-#: plugins/sudoers/sudoers.c:653
+#: plugins/sudoers/sudoers.c:658
msgid "\"cd\" is a shell built-in command, it cannot be run directly."
msgstr "«cd» Ñ” вбудованою командою оболонки, Ñ—Ñ— не може бути запущено безпоÑередньо."
-#: plugins/sudoers/sudoers.c:655
+#: plugins/sudoers/sudoers.c:660
msgid "the -s option may be used to run a privileged shell."
msgstr "параметр -s може бути викориÑтано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку привілейованої оболонки."
-#: plugins/sudoers/sudoers.c:657
+#: plugins/sudoers/sudoers.c:662
msgid "the -D option may be used to run a command in a specific directory."
msgstr "параметр -D може бути викориÑтано Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку команди у вказаному каталозі."
-#: plugins/sudoers/sudoers.c:666
+#: plugins/sudoers/sudoers.c:671
msgid "user not allowed to set a command timeout"
msgstr "кориÑтувачеві заборонено вÑтановлювати Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
-#: plugins/sudoers/sudoers.c:668
+#: plugins/sudoers/sudoers.c:673
msgid "sorry, you are not allowed set a command timeout"
msgstr "вибачте, вам не дозволено вÑтановлювати Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
-#: plugins/sudoers/sudoers.c:676
+#: plugins/sudoers/sudoers.c:681
msgid "user not allowed to preserve the environment"
msgstr "кориÑтувачеві заборонено зберігати Ñередовище"
-#: plugins/sudoers/sudoers.c:678
+#: plugins/sudoers/sudoers.c:683
msgid "sorry, you are not allowed to preserve the environment"
msgstr "вибачте, вам не дозволено зберігати Ñередовище"
-#: plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoers.c:1073
msgid "sudoedit doesn't need to be run via sudo"
msgstr "Ðемає потреби у запуÑку sudoedit за допомогою sudo"
-#: plugins/sudoers/sudoers.c:1110 plugins/sudoers/sudoreplay.c:1584
+#: plugins/sudoers/sudoers.c:1118 plugins/sudoers/sudoreplay.c:1584
#: plugins/sudoers/tsdump.c:138
#, c-format
msgid "unable to read %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ %s"
-#: plugins/sudoers/sudoers.c:1135 plugins/sudoers/visudo.c:485
-#: plugins/sudoers/visudo.c:764
-#, c-format
-msgid "unable to stat %s"
-msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ stat Ð´Ð»Ñ %s"
-
-#: plugins/sudoers/sudoers.c:1139 plugins/sudoers/visudo.c:1058
+#: plugins/sudoers/sudoers.c:1147 plugins/sudoers/visudo.c:1064
#, c-format
msgid "%s is not a regular file"
msgstr "%s не є звичайним файлом"
-#: plugins/sudoers/sudoers.c:1143 plugins/sudoers/timestamp.c:252 toke.l:1247
+#: plugins/sudoers/sudoers.c:1151 plugins/sudoers/timestamp.c:263 toke.l:1247
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s належить uid %u, має належати %u"
-#: plugins/sudoers/sudoers.c:1147 toke.l:1252
+#: plugins/sudoers/sudoers.c:1155 plugins/sudoers/timestamp.c:270 toke.l:1252
#, c-format
msgid "%s is world writable"
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð´Ð¾ «%s» можливий Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð»ÑŒÐ½Ð¾Ð³Ð¾ кориÑтувача"
-#: plugins/sudoers/sudoers.c:1151 toke.l:1255
+#: plugins/sudoers/sudoers.c:1159 plugins/sudoers/timestamp.c:275 toke.l:1255
#, c-format
msgid "%s is owned by gid %u, should be %u"
msgstr "%s належить gid %u, має належати %u"
-#: plugins/sudoers/sudoers.c:1184
+#: plugins/sudoers/sudoers.c:1194
#, c-format
msgid "only root can use \"-c %s\""
msgstr "викориÑтовувати «-c %s» може лише root"
-#: plugins/sudoers/sudoers.c:1203
+#: plugins/sudoers/sudoers.c:1213
#, c-format
msgid "unknown login class %s"
msgstr "невідомий ÐºÐ»Ð°Ñ Ð²Ñ…Ð¾Ð´Ñƒ %s"
-#: plugins/sudoers/sudoers.c:1290 plugins/sudoers/sudoers.c:1305
+#: plugins/sudoers/sudoers.c:1300 plugins/sudoers/sudoers.c:1315
#, c-format
msgid "unable to resolve host %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ адреÑу вузла %s"
@@ -3410,17 +3490,17 @@ msgstr "помилкове завершальне «!»"
msgid "unknown search type %d"
msgstr "невідомий тип пошуку %d"
-#: plugins/sudoers/sudoreplay.c:1651
+#: plugins/sudoers/sudoreplay.c:1650
#, 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:1654
+#: plugins/sudoers/sudoreplay.c:1652
#, c-format
msgid "usage: %s [-h] [-d dir] -l [search expression]\n"
msgstr "викориÑтаннÑ: %s [-h] [-d каталог] -l [вираз Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ]\n"
-#: plugins/sudoers/sudoreplay.c:1663
+#: plugins/sudoers/sudoreplay.c:1666
#, c-format
msgid ""
"%s - replay sudo session logs\n"
@@ -3429,7 +3509,7 @@ msgstr ""
"%s — Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ–Ð² ÑеанÑів sudo\n"
"\n"
-#: plugins/sudoers/sudoreplay.c:1665
+#: plugins/sudoers/sudoreplay.c:1668
msgid ""
"\n"
"Options:\n"
@@ -3485,127 +3565,122 @@ msgstr ""
"\n"
"Ðе знайдено відповідника команди"
-#: plugins/sudoers/timestamp.c:260
-#, c-format
-msgid "%s is group writable"
-msgstr "%s доÑтупний до запиÑу учаÑниками групи"
-
-#: plugins/sudoers/timestamp.c:328 plugins/sudoers/timestamp.c:663
+#: plugins/sudoers/timestamp.c:354 plugins/sudoers/timestamp.c:693
#, c-format
msgid "unable to truncate time stamp file to %lld bytes"
msgstr "не вдалоÑÑ Ð¾Ð±Ñ€Ñ–Ð·Ð°Ñ‚Ð¸ файл чаÑової позначки до %lld байтів"
-#: plugins/sudoers/timestamp.c:860
+#: plugins/sudoers/timestamp.c:890
msgid "ignoring time stamp from the future"
msgstr "ігноруємо чаÑову позначку з майбутнього"
-#: plugins/sudoers/timestamp.c:883
+#: plugins/sudoers/timestamp.c:913
#, c-format
msgid "time stamp too far in the future: %20.20s"
msgstr "занадто далека чаÑова позначка у майбутньому: %20.20s"
-#: plugins/sudoers/timestamp.c:1005
+#: plugins/sudoers/timestamp.c:1042
#, c-format
msgid "unable to lock time stamp file %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ файл чаÑової позначки %s"
-#: plugins/sudoers/timestamp.c:1049 plugins/sudoers/timestamp.c:1069
-#, c-format
-msgid "lecture status path too long: %s/%s"
-msgstr "шлÑÑ… до даних щодо Ñтану Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½Ð°Ñтанов Ñ” занадто довгим: %s/%s"
-
#: plugins/sudoers/toke_util.c:156
msgid "sudoedit should not be specified with a path"
msgstr "sudoedit не Ñлід вказувати разом із шлÑхом"
-#: plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:254
msgid "the -x option will be removed in a future release"
msgstr "параметр -x буде вилучено у наÑтупному випуÑку"
-#: plugins/sudoers/visudo.c:251
+#: plugins/sudoers/visudo.c:256
msgid "please consider using the cvtsudoers utility instead"
msgstr "будь лаÑка, ÑкориÑтайтеÑÑ Ð·Ð°Ð¼Ñ–ÑÑ‚ÑŒ нього програмою cvtsudoers"
-#: plugins/sudoers/visudo.c:306 plugins/sudoers/visudo.c:692
+#: plugins/sudoers/visudo.c:311 plugins/sudoers/visudo.c:698
#, c-format
msgid "press return to edit %s: "
msgstr "натиÑніть Enter Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ %s: "
-#: plugins/sudoers/visudo.c:321
+#: plugins/sudoers/visudo.c:326
#, c-format
msgid "contents of edit session left in %s"
msgstr "дані ÑеанÑу Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¸ÑÑ Ñƒ %s"
-#: plugins/sudoers/visudo.c:397
+#: plugins/sudoers/visudo.c:402
#, c-format
msgid "specified editor (%s) doesn't exist"
msgstr "вказаного редактора (%s) не Ñ–Ñнує"
-#: plugins/sudoers/visudo.c:399
+#: plugins/sudoers/visudo.c:404
#, c-format
msgid "no editor found (editor path = %s)"
msgstr "не знайдено жодного редактора (шлÑÑ… до редактора = %s)"
-#: plugins/sudoers/visudo.c:505 plugins/sudoers/visudo.c:513
+#: plugins/sudoers/visudo.c:491 plugins/sudoers/visudo.c:770
+#, c-format
+msgid "unable to stat %s"
+msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ stat Ð´Ð»Ñ %s"
+
+#: plugins/sudoers/visudo.c:511 plugins/sudoers/visudo.c:519
msgid "write error"
msgstr "помилка запиÑу"
-#: plugins/sudoers/visudo.c:559
+#: plugins/sudoers/visudo.c:565
#, c-format
msgid "unable to stat temporary file (%s), %s unchanged"
msgstr "не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ stat файл тимчаÑових даних (%s), %s не змінено"
-#: plugins/sudoers/visudo.c:566
+#: plugins/sudoers/visudo.c:572
#, c-format
msgid "zero length temporary file (%s), %s unchanged"
msgstr "файл тимчаÑових даних має нульовий об’єм (%s), %s не змінено"
-#: plugins/sudoers/visudo.c:572
+#: plugins/sudoers/visudo.c:578
#, c-format
msgid "editor (%s) failed, %s unchanged"
msgstr "помилка редактора (%s), %s не змінено"
-#: plugins/sudoers/visudo.c:594
+#: plugins/sudoers/visudo.c:600
#, c-format
msgid "%s unchanged"
msgstr "%s не змінено"
-#: plugins/sudoers/visudo.c:639
+#: plugins/sudoers/visudo.c:645
#, c-format
msgid "unable to re-open temporary file (%s), %s unchanged."
msgstr "не вдалоÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ відкрити файл тимчаÑових даних (%s), %s не змінено."
-#: plugins/sudoers/visudo.c:652
+#: plugins/sudoers/visudo.c:658
#, c-format
msgid "unable to parse temporary file (%s), unknown error"
msgstr "не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ файл тимчаÑових даних (%s), невідома помилка"
-#: plugins/sudoers/visudo.c:738 plugins/sudoers/visudo.c:768
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:744 plugins/sudoers/visudo.c:774
+#: plugins/sudoers/visudo.c:781
#, c-format
msgid "unable to set (uid, gid) of %s to (%u, %u)"
msgstr "не вдалоÑÑ Ð²Ñтановити (uid, gid) %s у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (%u, %u)"
-#: plugins/sudoers/visudo.c:803
+#: plugins/sudoers/visudo.c:809
#, c-format
msgid "%s and %s not on the same file system, using mv to rename"
msgstr "%s Ñ– %s не перебувають у одній файловій ÑиÑтемі, викориÑтовуємо mv Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ"
-#: plugins/sudoers/visudo.c:814
+#: plugins/sudoers/visudo.c:820
#, c-format
msgid "command failed: '%s %s %s', %s unchanged"
msgstr "помилка команди: «%s %s %s», %s не змінено"
-#: plugins/sudoers/visudo.c:821
+#: plugins/sudoers/visudo.c:827
#, c-format
msgid "error renaming %s, %s unchanged"
msgstr "помилка Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ %s, %s не змінено"
-#: plugins/sudoers/visudo.c:841
+#: plugins/sudoers/visudo.c:847
msgid "What now? "
msgstr "Рзараз що? "
-#: plugins/sudoers/visudo.c:855
+#: plugins/sudoers/visudo.c:861
msgid ""
"Options are:\n"
" (e)dit sudoers file again\n"
@@ -3617,41 +3692,41 @@ msgstr ""
" (x) — вийти без внеÑÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ до файла sudoers\n"
" (Q) — вийти зі збереженнÑм файла sudoers (ÐЕБЕЗПЕЧÐО!)\n"
-#: plugins/sudoers/visudo.c:901
+#: plugins/sudoers/visudo.c:907
#, c-format
msgid "unable to run %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ %s"
-#: plugins/sudoers/visudo.c:932
+#: plugins/sudoers/visudo.c:938
#, c-format
msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
msgstr "%s: помилковий влаÑник (uid, gid), має бути (%u, %u)\n"
-#: plugins/sudoers/visudo.c:943
+#: plugins/sudoers/visudo.c:949
#, c-format
msgid "%s: bad permissions, should be mode 0%o\n"
msgstr "%s: помилкові права доÑтупу, режим доÑтупу має бути 0%o\n"
-#: plugins/sudoers/visudo.c:991 plugins/sudoers/visudo.c:998
+#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo.c:1004
#, c-format
msgid "%s: parsed OK\n"
msgstr "%s: вдала обробка\n"
-#: plugins/sudoers/visudo.c:1017
+#: plugins/sudoers/visudo.c:1023
#, c-format
msgid "%s busy, try again later"
msgstr "%s зайнÑто, повторіть Ñпробу пізніше"
-#: plugins/sudoers/visudo.c:1021
+#: plugins/sudoers/visudo.c:1027
msgid "Edit anyway? [y/N]"
msgstr "Редагувати попри уÑе? [y/N]"
-#: plugins/sudoers/visudo.c:1117
+#: plugins/sudoers/visudo.c:1128
#, c-format
msgid "Warning: %s:%d:%d: unused %s \"%s\""
msgstr "ПопередженнÑ: %s:%d:%d: не викориÑтано %s «%s»"
-#: plugins/sudoers/visudo.c:1229
+#: plugins/sudoers/visudo.c:1240
#, c-format
msgid ""
"%s - safely edit the sudoers file\n"
@@ -3660,13 +3735,14 @@ msgstr ""
"%s — безпечне Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° sudoers\n"
"\n"
-#: plugins/sudoers/visudo.c:1231
+#: plugins/sudoers/visudo.c:1242
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"
+" -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"
@@ -3676,6 +3752,7 @@ msgstr ""
" -c, --check режим лише перевірки\n"
" -f, --file=файл вказати Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° sudoers\n"
" -h, --help показати довідкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ– завершити роботу\n"
+" -I, --no-includes не редагувати включені файли\n"
" -q, --quiet ÑтиÑлі Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ ÑинтакÑичних помилок\n"
" -s, --strict Ñтрога перевірка ÑинтакÑиÑу\n"
" -V, --version показати дані щодо верÑÑ–Ñ— Ñ– завершити роботу\n"
@@ -3712,6 +3789,12 @@ msgstr "неочікуваний розрив Ñ€Ñдків у Ñ€Ñдку"
msgid "too many levels of includes"
msgstr "занадто виÑокий рівень вкладеноÑÑ‚Ñ–"
+#~ msgid "%s is group writable"
+#~ msgstr "%s доÑтупний до запиÑу учаÑниками групи"
+
+#~ msgid "lecture status path too long: %s/%s"
+#~ msgstr "шлÑÑ… до даних щодо Ñтану Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½Ð°Ñтанов Ñ” занадто довгим: %s/%s"
+
#~ msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
#~ msgstr "ПопередженнÑ: %s:%d:%d: цикл у %s «%s»"
diff --git a/plugins/sudoers/policy.c b/plugins/sudoers/policy.c
index 763894454..2a6a76e0a 100644
--- a/plugins/sudoers/policy.c
+++ b/plugins/sudoers/policy.c
@@ -84,11 +84,11 @@ parse_bool(const char *line, int varlen, int *flags, int fval)
}
}
-#define RUN_VALID_FLAGS (MODE_ASKPASS|MODE_PRESERVE_ENV|MODE_RESET_HOME|MODE_IMPLIED_SHELL|MODE_LOGIN_SHELL|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_PRESERVE_GROUPS|MODE_SHELL|MODE_RUN|MODE_POLICY_INTERCEPTED)
-#define EDIT_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_EDIT)
-#define LIST_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_LIST|MODE_CHECK)
-#define VALIDATE_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_VALIDATE)
-#define INVALIDATE_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_INVALIDATE)
+#define RUN_VALID_FLAGS (MODE_ASKPASS|MODE_PRESERVE_ENV|MODE_RESET_HOME|MODE_IMPLIED_SHELL|MODE_LOGIN_SHELL|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_UPDATE_TICKET|MODE_PRESERVE_GROUPS|MODE_SHELL|MODE_RUN|MODE_POLICY_INTERCEPTED)
+#define EDIT_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_UPDATE_TICKET|MODE_EDIT)
+#define LIST_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_UPDATE_TICKET|MODE_LIST|MODE_CHECK)
+#define VALIDATE_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_UPDATE_TICKET|MODE_VALIDATE)
+#define INVALIDATE_VALID_FLAGS (MODE_ASKPASS|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_UPDATE_TICKET|MODE_INVALIDATE)
/*
* Deserialize args, settings and user_info arrays.
@@ -102,7 +102,7 @@ sudoers_policy_deserialize_info(void *v, struct defaults_list *defaults)
const char *remhost = NULL;
unsigned char uuid[16];
char * const *cur;
- int flags = 0;
+ int flags = MODE_UPDATE_TICKET;
debug_decl(sudoers_policy_deserialize_info, SUDOERS_DEBUG_PLUGIN);
#define MATCHES(s, v) \
@@ -280,6 +280,12 @@ sudoers_policy_deserialize_info(void *v, struct defaults_list *defaults)
goto bad;
continue;
}
+ if (MATCHES(*cur, "update_ticket=")) {
+ if (parse_bool(*cur, sizeof("update_ticket") -1, &flags,
+ MODE_UPDATE_TICKET) == -1)
+ goto bad;
+ continue;
+ }
if (MATCHES(*cur, "noninteractive=")) {
if (parse_bool(*cur, sizeof("noninteractive") - 1, &flags,
MODE_NONINTERACTIVE) == -1)
@@ -331,12 +337,12 @@ sudoers_policy_deserialize_info(void *v, struct defaults_list *defaults)
#endif /* HAVE_SELINUX */
#ifdef HAVE_APPARMOR
if (MATCHES(*cur, "apparmor_profile=")) {
- CHECK(*cur, "apparmor_profile=");
- free(user_apparmor_profile);
- user_apparmor_profile = strdup(*cur + sizeof("apparmor_profile=") - 1);
- if (user_apparmor_profile == NULL)
+ CHECK(*cur, "apparmor_profile=");
+ free(user_apparmor_profile);
+ user_apparmor_profile = strdup(*cur + sizeof("apparmor_profile=") - 1);
+ if (user_apparmor_profile == NULL)
goto oom;
- continue;
+ continue;
}
#endif /* HAVE_APPARMOR */
#ifdef HAVE_BSD_AUTH_H
@@ -395,9 +401,11 @@ sudoers_policy_deserialize_info(void *v, struct defaults_list *defaults)
}
#endif
}
+ /* Ignore ticket trumps update. */
+ if (ISSET(flags, MODE_IGNORE_TICKET))
+ CLR(flags, MODE_UPDATE_TICKET);
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++) {
@@ -493,6 +501,15 @@ sudoers_policy_deserialize_info(void *v, struct defaults_list *defaults)
}
continue;
}
+ if (MATCHES(*cur, "tcpgid=")) {
+ p = *cur + sizeof("tcpgid=") - 1;
+ user_tcpgid = (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);
@@ -636,7 +653,7 @@ sudoers_policy_store_result(bool accepted, char *argv[], char *envp[],
}
/* Increase the length of command_info as needed, it is *not* checked. */
- command_info = calloc(71, sizeof(char *));
+ command_info = calloc(72, sizeof(char *));
if (command_info == NULL)
goto oom;
@@ -649,20 +666,26 @@ sudoers_policy_store_result(bool accepted, char *argv[], char *envp[],
if ((command_info[info_len++] = strdup("log_subcmds=true")) == NULL)
goto oom;
}
- if (def_log_input || def_log_output) {
+ if (iolog_enabled) {
if (iolog_path)
command_info[info_len++] = iolog_path; /* now owned */
- if (def_log_input) {
+ if (def_log_stdin) {
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 (def_log_stdout) {
if ((command_info[info_len++] = strdup("iolog_stdout=true")) == NULL)
goto oom;
+ }
+ if (def_log_stderr) {
if ((command_info[info_len++] = strdup("iolog_stderr=true")) == NULL)
goto oom;
+ }
+ if (def_log_ttyin) {
+ if ((command_info[info_len++] = strdup("iolog_ttyin=true")) == NULL)
+ goto oom;
+ }
+ if (def_log_ttyout) {
if ((command_info[info_len++] = strdup("iolog_ttyout=true")) == NULL)
goto oom;
}
@@ -812,6 +835,10 @@ sudoers_policy_store_result(bool accepted, char *argv[], char *envp[],
if ((command_info[info_len++] = strdup("use_ptrace=true")) == NULL)
goto oom;
}
+ if (def_intercept_verify) {
+ if ((command_info[info_len++] = strdup("intercept_verify=true")) == NULL)
+ goto oom;
+ }
if (def_noexec) {
if ((command_info[info_len++] = strdup("noexec=true")) == NULL)
goto oom;
@@ -970,7 +997,7 @@ sudoers_policy_store_result(bool accepted, char *argv[], char *envp[],
#endif /* HAVE_SELINUX */
#ifdef HAVE_APPARMOR
if (user_apparmor_profile != NULL) {
- if ((command_info[info_len++] = sudo_new_key_val("apparmor_profile", user_apparmor_profile)) == NULL)
+ if ((command_info[info_len++] = sudo_new_key_val("apparmor_profile", user_apparmor_profile)) == NULL)
goto oom;
}
#endif /* HAVE_APPARMOR */
@@ -1154,8 +1181,8 @@ sudoers_policy_check(int argc, char * const argv[], char *env_add[],
#ifndef NO_LEAKS
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_log_exit_status &&
- !def_use_pty && !sudo_auth_needs_end_session())
+ if (!iolog_enabled && !def_use_pty && !def_log_exit_status &&
+ SLIST_EMPTY(&def_log_servers) && !sudo_auth_needs_end_session())
sudoers_policy.close = NULL;
}
#endif
@@ -1171,7 +1198,7 @@ sudoers_policy_check(int argc, char * const argv[], char *env_add[],
static int
sudoers_policy_validate(const char **errstr)
{
- char *argv[] = { "validate", NULL };
+ char *argv[] = { (char *)"validate", NULL };
const int argc = 1;
int ret;
debug_decl(sudoers_policy_validate, SUDOERS_DEBUG_PLUGIN);
@@ -1213,7 +1240,7 @@ static int
sudoers_policy_list(int argc, char * const argv[], int verbose,
const char *list_user, const char **errstr)
{
- char *list_argv[] = { "list", NULL };
+ char *list_argv[] = { (char *)"list", NULL };
int ret;
debug_decl(sudoers_policy_list, SUDOERS_DEBUG_PLUGIN);
diff --git a/plugins/sudoers/pwutil.c b/plugins/sudoers/pwutil.c
index ca5e146b4..88c7a4192 100644
--- a/plugins/sudoers/pwutil.c
+++ b/plugins/sudoers/pwutil.c
@@ -686,7 +686,7 @@ sudo_mkgrent(const char *group, gid_t gid, ...)
}
gr = &gritem->gr;
gr->gr_gid = gid;
- gr->gr_passwd = "*";
+ gr->gr_passwd = (char *)"*";
cp = (char *)(gritem + 1);
gr->gr_mem = (char **)cp;
cp += sizeof(char *) * nmem;
diff --git a/plugins/sudoers/regress/editor/check_editor.c b/plugins/sudoers/regress/editor/check_editor.c
index 97585d66e..eef9d384e 100644
--- a/plugins/sudoers/regress/editor/check_editor.c
+++ b/plugins/sudoers/regress/editor/check_editor.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2021-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -29,12 +29,12 @@
/* Note hard-coded array lengths. */
struct test_data {
- char *editor_var;
+ const char *editor_var;
int nfiles;
- char *files[4];
- char *editor_path;
+ const char *files[4];
+ const char *editor_path;
int edit_argc;
- char *edit_argv[10];
+ const char *edit_argv[10];
} test_data[] = {
{
/* Bug #942 */
@@ -63,6 +63,15 @@ struct test_data {
3,
{ "/usr/bin/vi\\", "--", "/etc/hosts", "/bogus/file", NULL }
},
+ {
+ /* GitHub issue #179 */
+ "EDITOR=sed -rie s/^\\\\(foo\\\\)/waldo\\\\1/",
+ 1,
+ { "/etc/sudoers", NULL },
+ "/usr/bin/sed",
+ 5,
+ { "sed", "-rie", "s/^\\(foo\\)/waldo\\1/", "--", "/etc/sudoers", NULL }
+ },
{ NULL }
};
@@ -99,13 +108,13 @@ main(int argc, char *argv[])
int i, edit_argc = 0;
/* clear existing editor environment vars */
- putenv("VISUAL=");
- putenv("EDITOR=");
- putenv("SUDO_EDITOR=");
+ putenv((char *)"VISUAL=");
+ putenv((char *)"EDITOR=");
+ putenv((char *)"SUDO_EDITOR=");
- putenv(data->editor_var);
- editor_path = find_editor(data->nfiles, data->files, &edit_argc,
- &edit_argv, NULL, &env_editor);
+ putenv((char *)data->editor_var);
+ editor_path = find_editor(data->nfiles, (char **)data->files,
+ &edit_argc, &edit_argv, NULL, &env_editor);
ntests++;
if (strcmp(editor_path, data->editor_path) != 0) {
sudo_warnx("test %d: editor_path: expected \"%s\", got \"%s\"",
diff --git a/plugins/sudoers/regress/exptilde/check_exptilde.c b/plugins/sudoers/regress/exptilde/check_exptilde.c
index 093fb640c..93f9b4b65 100644
--- a/plugins/sudoers/regress/exptilde/check_exptilde.c
+++ b/plugins/sudoers/regress/exptilde/check_exptilde.c
@@ -34,9 +34,9 @@
struct sudo_user sudo_user;
struct test_data {
- char *input;
- char *output;
- char *user;
+ const char *input;
+ const char *output;
+ const char *user;
bool result;
} test_data[] = {
{ "foo/bar", NULL, NULL, false },
diff --git a/plugins/sudoers/regress/fuzz/fuzz_policy.c b/plugins/sudoers/regress/fuzz/fuzz_policy.c
index 9b0c8ea3e..a03fe67a5 100644
--- a/plugins/sudoers/regress/fuzz/fuzz_policy.c
+++ b/plugins/sudoers/regress/fuzz/fuzz_policy.c
@@ -39,7 +39,9 @@
#endif
#include "sudoers.h"
+#include "sudo_iolog.h"
#include "interfaces.h"
+#include "check.h"
extern char **environ;
extern sudo_dso_public struct policy_plugin sudoers_policy;
@@ -49,6 +51,8 @@ char *audit_msg;
static int pass;
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
static FILE *
open_data(const uint8_t *data, size_t size)
{
@@ -114,13 +118,13 @@ push(struct dynamic_array *arr, const char *entry)
}
if (arr->len + (entry != NULL) >= arr->size) {
- char **tmp = reallocarray(arr->entries, arr->size + 128, sizeof(char *));
+ char **tmp = reallocarray(arr->entries, arr->size + 1024, sizeof(char *));
if (tmp == NULL) {
free(copy);
return false;
}
arr->entries = tmp;
- arr->size += 128;
+ arr->size += 1024;
}
if (copy != NULL)
arr->entries[arr->len++] = copy;
@@ -161,7 +165,7 @@ fuzz_printf(int msg_type, const char *fmt, ...)
return 0;
}
-int
+static int
fuzz_hook_stub(struct sudo_hook *hook)
{
return 0;
@@ -368,7 +372,9 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
/* Additional environment variables to add. */
if (strncmp(line, "env=", sizeof("env=") - 1) == 0) {
- push(&env_add, line);
+ const char *cp = line + sizeof("env=") - 1;
+ if (strchr(cp, '=') != NULL)
+ push(&env_add, line);
continue;
}
@@ -380,8 +386,8 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
line = NULL;
/* Exercise code paths that use KRB5CCNAME and SUDO_PROMPT. */
- putenv("KRB5CCNAME=/tmp/krb5cc_123456");
- putenv("SUDO_PROMPT=[sudo] password for %p: ");
+ putenv((char *)"KRB5CCNAME=/tmp/krb5cc_123456");
+ putenv((char *)"SUDO_PROMPT=[sudo] password for %p: ");
sudoers_policy.register_hooks(SUDO_API_VERSION, fuzz_hook_stub);
@@ -820,7 +826,7 @@ expand_iolog_path(const char *inpath, char *path, size_t pathlen,
/* STUB */
bool
-iolog_nextid(char *iolog_dir, char sessid[7])
+iolog_nextid(const char *iolog_dir, char sessid[7])
{
strlcpy(sessid, "000001", 7);
return true;
diff --git a/plugins/sudoers/regress/fuzz/fuzz_stubs.c b/plugins/sudoers/regress/fuzz/fuzz_stubs.c
index f2147c578..27b26c095 100644
--- a/plugins/sudoers/regress/fuzz/fuzz_stubs.c
+++ b/plugins/sudoers/regress/fuzz/fuzz_stubs.c
@@ -41,6 +41,8 @@
#include "sudoers.h"
#include "interfaces.h"
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
struct interface_list *
get_interfaces(void)
{
diff --git a/plugins/sudoers/regress/fuzz/fuzz_sudoers.c b/plugins/sudoers/regress/fuzz/fuzz_sudoers.c
index 8a7caeaae..2ce2f87eb 100644
--- a/plugins/sudoers/regress/fuzz/fuzz_sudoers.c
+++ b/plugins/sudoers/regress/fuzz/fuzz_sudoers.c
@@ -43,6 +43,7 @@
static int fuzz_conversation(int num_msgs, const struct sudo_conv_message msgs[], struct sudo_conv_reply replies[], struct sudo_conv_callback *callback);
static int fuzz_printf(int msg_type, const char *fmt, ...);
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
/* Required to link with parser. */
struct sudo_user sudo_user;
@@ -134,6 +135,20 @@ cb_unused(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v)
return 0;
}
+bool
+cb_log_input(const char *file, int line, int column,
+ const union sudo_defs_val *sd_un, int op)
+{
+ return 0;
+}
+
+bool
+cb_log_output(const char *file, int line, int column,
+ const union sudo_defs_val *sd_un, int op)
+{
+ return 0;
+}
+
static FILE *
open_data(const uint8_t *data, size_t size)
{
@@ -161,9 +176,9 @@ open_data(const uint8_t *data, size_t size)
}
static struct user_data {
- char *user;
- char *runuser;
- char *rungroup;
+ const char *user;
+ const char *runuser;
+ const char *rungroup;
} user_data[] = {
{ "root", NULL, NULL },
{ "millert", "operator", NULL },
@@ -182,7 +197,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
struct interface_list *interfaces;
struct passwd *pw;
struct group *gr;
- char *gids[10];
+ const char *gids[10];
FILE *fp;
/* Don't waste time fuzzing tiny inputs. */
@@ -236,7 +251,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
gids[1] = "20";
gids[2] = "5";
gids[3] = NULL;
- if (sudo_set_gidlist(pw, gids, ENTRY_TYPE_FRONTEND) == -1)
+ if (sudo_set_gidlist(pw, (char **)gids, ENTRY_TYPE_FRONTEND) == -1)
goto done;
sudo_pw_delref(pw);
@@ -245,7 +260,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
goto done;
gids[0] = "5";
gids[1] = NULL;
- if (sudo_set_gidlist(pw, gids, ENTRY_TYPE_FRONTEND) == -1)
+ if (sudo_set_gidlist(pw, (char **)gids, ENTRY_TYPE_FRONTEND) == -1)
goto done;
sudo_pw_delref(pw);
@@ -257,17 +272,17 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
gids[2] = "5";
gids[3] = "100";
gids[4] = NULL;
- if (sudo_set_gidlist(pw, gids, ENTRY_TYPE_FRONTEND) == -1)
+ if (sudo_set_gidlist(pw, (char **)gids, ENTRY_TYPE_FRONTEND) == -1)
goto done;
sudo_pw_delref(pw);
/* The minimum needed to perform matching (user_cmnd must be dynamic). */
- user_host = user_shost = user_runhost = user_srunhost = "localhost";
+ user_host = user_shost = user_runhost = user_srunhost = (char *)"localhost";
user_cmnd = strdup("/usr/bin/id");
if (user_cmnd == NULL)
goto done;
- user_args = "-u";
- user_base = "id";
+ user_args = (char *)"-u";
+ user_base = (char *)"id";
/* Add a fake network interfaces. */
interfaces = get_interfaces();
@@ -300,7 +315,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
int cmnd_status;
/* Invoking user. */
- user_name = ud->user;
+ user_name = (char *)ud->user;
if (sudo_user.pw != NULL)
sudo_pw_delref(sudo_user.pw);
sudo_user.pw = sudo_getpwnam(user_name);
@@ -313,7 +328,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if (runas_pw != NULL)
sudo_pw_delref(runas_pw);
if (ud->runuser != NULL) {
- sudo_user.runas_user = ud->runuser;
+ sudo_user.runas_user = (char *)ud->runuser;
SET(sudo_user.flags, RUNAS_USER_SPECIFIED);
runas_pw = sudo_getpwnam(sudo_user.runas_user);
} else {
@@ -330,7 +345,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if (runas_gr != NULL)
sudo_gr_delref(runas_gr);
if (ud->rungroup != NULL) {
- sudo_user.runas_group = ud->rungroup;
+ sudo_user.runas_group = (char *)ud->rungroup;
SET(sudo_user.flags, RUNAS_GROUP_SPECIFIED);
runas_gr = sudo_getgrnam(sudo_user.runas_group);
if (runas_gr == NULL) {
diff --git a/plugins/sudoers/regress/fuzz/fuzz_sudoers_ldif.c b/plugins/sudoers/regress/fuzz/fuzz_sudoers_ldif.c
index e1f47399b..75a6d7dd7 100644
--- a/plugins/sudoers/regress/fuzz/fuzz_sudoers_ldif.c
+++ b/plugins/sudoers/regress/fuzz/fuzz_sudoers_ldif.c
@@ -29,6 +29,7 @@
#include "sudoers.h"
static int fuzz_printf(int msg_type, const char *fmt, ...);
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
/* Required to link with parser. */
struct sudo_user sudo_user;
diff --git a/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c b/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c
index 6f2ca732a..e4cc14166 100644
--- a/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c
+++ b/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c
@@ -155,7 +155,7 @@ validate_iolog_info(const char *log_dir, bool legacy)
return true;
}
-bool
+static bool
validate_timing(FILE *fp, int recno, int type, unsigned int p1, unsigned int p2)
{
struct timing_closure timing;
@@ -206,7 +206,7 @@ validate_timing(FILE *fp, int recno, int type, unsigned int p1, unsigned int p2)
/*
* Test sudoers I/O log plugin endpoints.
*/
-void
+static void
test_endpoints(int *ntests, int *nerrors, const char *iolog_dir, char *envp[])
{
int rc, cmnd_argc = 1;
@@ -214,11 +214,11 @@ test_endpoints(int *ntests, int *nerrors, const char *iolog_dir, char *envp[])
char buf[1024], iolog_path[PATH_MAX];
char runas_gid[64], runas_uid[64];
FILE *fp;
- char *cmnd_argv[] = {
+ const char *cmnd_argv[] = {
"/usr/bin/id",
NULL
};
- char *user_info[] = {
+ const char *user_info[] = {
"cols=80",
"lines=24",
"cwd=/",
@@ -227,7 +227,7 @@ test_endpoints(int *ntests, int *nerrors, const char *iolog_dir, char *envp[])
"user=nobody",
NULL
};
- char *command_info[] = {
+ const char *command_info[] = {
"command=/usr/bin/id",
iolog_path,
"iolog_stdin=true",
@@ -257,7 +257,8 @@ test_endpoints(int *ntests, int *nerrors, const char *iolog_dir, char *envp[])
/* 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, &errstr);
+ (char **)user_info, (char **)command_info, cmnd_argc,
+ (char **)cmnd_argv, envp, NULL, &errstr);
(*ntests)++;
if (rc != 1) {
sudo_warnx("I/O log open endpoint failed");
diff --git a/plugins/sudoers/regress/parser/check_gentime.c b/plugins/sudoers/regress/parser/check_gentime.c
index 2aed93dcb..a203bc67c 100644
--- a/plugins/sudoers/regress/parser/check_gentime.c
+++ b/plugins/sudoers/regress/parser/check_gentime.c
@@ -33,7 +33,7 @@
sudo_dso_public int main(int argc, char *argv[]);
const struct gentime_test {
- char *gentime;
+ const char *gentime;
time_t unixtime;
} tests[] = {
{ "199412161032ZZ", -1 },
@@ -65,7 +65,7 @@ main(int argc, char *argv[])
initprogname(argc > 0 ? argv[0] : "check_gentime");
/* Do local time tests in Eastern Standard Time. */
- putenv("TZ=EST5EST5");
+ putenv((char *)"TZ=EST5EST5");
tzset();
for (i = 0; i < ntests; i++) {
diff --git a/plugins/sudoers/regress/serialize_list/check_serialize_list.c b/plugins/sudoers/regress/serialize_list/check_serialize_list.c
index 7abf4761e..c27e0a190 100644
--- a/plugins/sudoers/regress/serialize_list/check_serialize_list.c
+++ b/plugins/sudoers/regress/serialize_list/check_serialize_list.c
@@ -38,9 +38,9 @@ test_serialize_list(int *ntests_out, int *errors_out)
struct list_member lm1, lm2, lm3;
char *result;
- lm1.value = "a value with spaces";
- lm2.value = "this,and,that";
- lm3.value = ",";
+ lm1.value = (char *)"a value with spaces";
+ lm2.value = (char *)"this,and,that";
+ lm3.value = (char *)",";
SLIST_INSERT_HEAD(&members, &lm3, entries);
SLIST_INSERT_HEAD(&members, &lm2, entries);
SLIST_INSERT_HEAD(&members, &lm1, entries);
diff --git a/plugins/sudoers/regress/testsudoers/test11.out.ok b/plugins/sudoers/regress/testsudoers/test11.out.ok
index 987ab6559..f030dc84d 100644
--- a/plugins/sudoers/regress/testsudoers/test11.out.ok
+++ b/plugins/sudoers/regress/testsudoers/test11.out.ok
@@ -3,7 +3,7 @@ Testing @include with garbage after the path name
sudoers:1:24: syntax error
@include sudoers.local womp womp
^~~~
-testsudoers: unable to stat sudoers.local: No such file or directory
+testsudoers: unable to open sudoers.local: No such file or directory
Entries for user root:
@@ -14,7 +14,7 @@ Testing #include with garbage after the path name
sudoers:1:24: syntax error
#include sudoers.local womp womp
^~~~
-testsudoers: unable to stat sudoers.local: No such file or directory
+testsudoers: unable to open sudoers.local: No such file or directory
Entries for user root:
diff --git a/plugins/sudoers/regress/testsudoers/test18.sh b/plugins/sudoers/regress/testsudoers/test18.sh
index c349aa26d..645b9a5cd 100755
--- a/plugins/sudoers/regress/testsudoers/test18.sh
+++ b/plugins/sudoers/regress/testsudoers/test18.sh
@@ -28,7 +28,7 @@ root ALL = /bin/*at ^/var/log/[^/]+$
EOF
# Command: path, args: args start with escaped ^
-$TESTSUDOERS root /usr/bin/grep ^foo$ <<'EOF'
+$TESTSUDOERS root /usr/bin/grep '^foo$' <<'EOF'
root ALL = /usr/bin/grep \^foo$
EOF
diff --git a/plugins/sudoers/regress/testsudoers/test19.out.ok b/plugins/sudoers/regress/testsudoers/test19.out.ok
new file mode 100644
index 000000000..a0de2408e
--- /dev/null
+++ b/plugins/sudoers/regress/testsudoers/test19.out.ok
@@ -0,0 +1,20 @@
+Parses OK
+
+Entries for user root:
+
+ALL = /bin/ls ""
+ host matched
+ runas matched
+ cmnd allowed
+
+Command allowed
+Parses OK
+
+Entries for user root:
+
+ALL = /bin/ls ""
+ host matched
+ runas matched
+ cmnd unmatched
+
+Command unmatched
diff --git a/plugins/sudoers/regress/testsudoers/test19.sh b/plugins/sudoers/regress/testsudoers/test19.sh
new file mode 100755
index 000000000..113eb2ad4
--- /dev/null
+++ b/plugins/sudoers/regress/testsudoers/test19.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# Verify that "" in sudoers does not match a literal "" on the command line.
+#
+
+: ${TESTSUDOERS=testsudoers}
+
+exec 2>&1
+
+# This should succeed
+$TESTSUDOERS root /bin/ls <<'EOF'
+root ALL = /bin/ls ""
+EOF
+
+# This should fail
+$TESTSUDOERS root /bin/ls '""' <<'EOF'
+root ALL = /bin/ls ""
+EOF
+
+exit 0
diff --git a/plugins/sudoers/regress/unescape/check_unesc.c b/plugins/sudoers/regress/unescape/check_unesc.c
index 6b97f5588..ebbe30734 100644
--- a/plugins/sudoers/regress/unescape/check_unesc.c
+++ b/plugins/sudoers/regress/unescape/check_unesc.c
@@ -27,8 +27,8 @@
#include "sudoers.h"
struct test_data {
- char *input;
- char *result;
+ const char *input;
+ const char *result;
size_t result_len;
size_t bufsize;
};
@@ -139,7 +139,7 @@ test_strvec_join(char sep, int *ntests_out, int *errors_out)
/* Simulate: sudoedit -s '\' `perl -e 'print "A" x 65536'` */
memset(buf, 'A', sizeof(buf));
buf[sizeof(buf) - 1] = '\0';
- argv[0] = "\\";
+ argv[0] = (char *)"\\";
argv[1] = buf;
argv[2] = NULL;
diff --git a/plugins/sudoers/strlcpy_unesc.c b/plugins/sudoers/strlcpy_unesc.c
index ee6276e76..c8c89ac69 100644
--- a/plugins/sudoers/strlcpy_unesc.c
+++ b/plugins/sudoers/strlcpy_unesc.c
@@ -29,6 +29,9 @@
#include "sudoers.h"
+/*
+ * Like strlcpy() but collapses non-space chars escaped with a backslash.
+ */
size_t
strlcpy_unescape(char *dst, const char *src, size_t size)
{
diff --git a/plugins/sudoers/stubs.c b/plugins/sudoers/stubs.c
index fcb0889d8..9aae59d41 100644
--- a/plugins/sudoers/stubs.c
+++ b/plugins/sudoers/stubs.c
@@ -35,6 +35,7 @@
#include <arpa/inet.h>
#include "sudoers.h"
+#include "cvtsudoers.h"
#include "interfaces.h"
/* STUB */
diff --git a/plugins/sudoers/sudoers.c b/plugins/sudoers/sudoers.c
index 71e8ba256..00114acf9 100644
--- a/plugins/sudoers/sudoers.c
+++ b/plugins/sudoers/sudoers.c
@@ -102,6 +102,7 @@ static struct rlimit nproclimit;
/* XXX - must be extern for audit bits of sudo_auth.c */
int NewArgc;
char **NewArgv;
+char **saved_argv;
#ifdef SUDOERS_LOG_CLIENT
# define remote_iologs (!SLIST_EMPTY(&def_log_servers))
@@ -185,6 +186,10 @@ sudoers_reinit_defaults(void)
/* Restore error logging. */
sudoers_error_hook = logger;
+ /* No need to check the admin flag file multiple times. */
+ if (ISSET(sudo_mode, MODE_POLICY_INTERCEPTED))
+ def_admin_flag = NULL;
+
debug_return_bool(true);
}
@@ -397,16 +402,16 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
debug_return_int(-1);
}
- /* Was previous command was intercepted? */
- if (def_intercept)
- SET(sudo_mode, MODE_POLICY_INTERCEPTED);
+ if (need_reinit) {
+ /* Was previous command intercepted? */
+ if (ISSET(sudo_mode, MODE_RUN) && def_intercept)
+ SET(sudo_mode, MODE_POLICY_INTERCEPTED);
- /* Only certain mode flags are legal for intercepted commands. */
- if (ISSET(sudo_mode, MODE_POLICY_INTERCEPTED))
- sudo_mode &= MODE_INTERCEPT_MASK;
+ /* Only certain mode flags are legal for intercepted commands. */
+ if (ISSET(sudo_mode, MODE_POLICY_INTERCEPTED))
+ sudo_mode &= MODE_INTERCEPT_MASK;
- /* Re-initialize defaults if we are called multiple times. */
- if (need_reinit) {
+ /* Re-initialize defaults if we are called multiple times. */
if (!sudoers_reinit_defaults())
debug_return_int(-1);
}
@@ -433,7 +438,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
* Make a local copy of argc/argv, with special handling for the
* '-i' option. We also allocate an extra slot for bash's --login.
*/
- if (NewArgv != NULL) {
+ if (NewArgv != NULL && NewArgv != saved_argv) {
sudoers_gc_remove(GC_PTR, NewArgv);
free(NewArgv);
}
@@ -684,13 +689,18 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
}
if (ISSET(sudo_mode, (MODE_RUN | MODE_EDIT)) && !remote_iologs) {
- if ((def_log_input || def_log_output) && def_iolog_file && def_iolog_dir) {
+ if (iolog_enabled && def_iolog_file && def_iolog_dir) {
if ((iolog_path = format_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;
+ def_log_stdin = false;
+ def_log_stdout = false;
+ def_log_stderr = false;
+ def_log_ttyin = false;
+ def_log_ttyout = false;
}
}
}
@@ -698,15 +708,16 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
switch (sudo_mode & MODE_MASK) {
case MODE_CHECK:
ret = display_cmnd(snl, list_pw ? list_pw : sudo_user.pw);
- break;
+ goto done;
case MODE_LIST:
ret = display_privs(snl, list_pw ? list_pw : sudo_user.pw, verbose);
- break;
+ goto done;
case MODE_VALIDATE:
+ ret = true;
+ goto done;
case MODE_RUN:
case MODE_EDIT:
- /* ret may be overridden by "goto bad" later */
- ret = true;
+ /* ret will not be set until the very end. */
break;
default:
/* Should not happen. */
@@ -714,11 +725,6 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
goto done;
}
- 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
@@ -749,7 +755,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
strcmp(NewArgv[1], "-c") == 0) {
/* We allocated extra space for the --login above. */
memmove(&NewArgv[2], &NewArgv[1], sizeof(char *) * NewArgc);
- NewArgv[1] = "--login";
+ NewArgv[1] = (char *)"--login";
NewArgc++;
}
@@ -803,8 +809,10 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
goto bad;
}
/* find_editor() already g/c'd edit_argv[] */
- sudoers_gc_remove(GC_PTR, NewArgv);
- free(NewArgv);
+ if (NewArgv != saved_argv) {
+ sudoers_gc_remove(GC_PTR, NewArgv);
+ free(NewArgv);
+ }
NewArgv = edit_argv;
NewArgc = edit_argc;
@@ -812,6 +820,17 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
env_swap_old();
}
+ /* Save the initial command and argv so we have it for exit logging. */
+ if (saved_cmnd == NULL) {
+ saved_cmnd = strdup(safe_cmnd);
+ if (saved_cmnd == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+ saved_argv = NewArgv;
+ }
+
+ ret = true;
goto done;
bad:
@@ -1028,6 +1047,7 @@ set_cmnd(void)
* 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.
+ * TODO: move escaping to the policy plugin instead
*/
user_args = strvec_join(NewArgv + 1, ' ', strlcpy_unescape);
} else {
@@ -1074,52 +1094,41 @@ set_cmnd(void)
FILE *
open_sudoers(const char *file, bool doedit, bool *keepopen)
{
- struct stat sb;
FILE *fp = NULL;
- bool perm_root = false;
+ struct stat sb;
+ int error, fd;
debug_decl(open_sudoers, SUDOERS_DEBUG_PLUGIN);
if (!set_perms(PERM_SUDOERS))
debug_return_ptr(NULL);
again:
- switch (sudo_secure_file(file, 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 file and make sure we can read it so we can present
- * the user with a reasonable error message (unlike the lexer).
- */
- if ((fp = fopen(file, "r")) == NULL) {
- log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), file);
+ fd = sudo_secure_open_file(file, sudoers_uid, sudoers_gid, &sb, &error);
+ if (fd != -1) {
+ /*
+ * Make sure we can read the file so we can present the
+ * user with a reasonable error message (unlike the lexer).
+ */
+ if ((fp = fdopen(fd, "r")) == NULL) {
+ log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), file);
+ close(fd);
+ } else {
+ if (sb.st_size != 0 && fgetc(fp) == EOF) {
+ log_warning(SLOG_SEND_MAIL,
+ N_("unable to read %s"), file);
+ fclose(fp);
+ fp = NULL;
} else {
- if (sb.st_size != 0 && fgetc(fp) == EOF) {
- log_warning(SLOG_SEND_MAIL,
- N_("unable to read %s"), file);
- fclose(fp);
- fp = NULL;
- } else {
- /* Rewind fp and set close on exec flag. */
- rewind(fp);
- (void) fcntl(fileno(fp), F_SETFD, 1);
- }
+ /* Rewind fp and set close on exec flag. */
+ rewind(fp);
+ (void) fcntl(fileno(fp), F_SETFD, 1);
}
- break;
+ }
+ } else {
+ switch (error) {
case SUDO_PATH_MISSING:
/*
- * If we tried to stat() sudoers as non-root but got EACCES,
+ * If we tried to open sudoers as non-root but got EACCES,
* try again as root.
*/
if (errno == EACCES && geteuid() != ROOT_UID) {
@@ -1127,12 +1136,11 @@ again:
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"), file);
+ log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), file);
break;
case SUDO_PATH_BAD_TYPE:
log_warningx(SLOG_SEND_MAIL,
@@ -1152,8 +1160,10 @@ again:
(unsigned int) sb.st_gid, (unsigned int) sudoers_gid);
break;
default:
- /* NOTREACHED */
+ sudo_warnx("%s: internal error, unexpected error %d",
+ __func__, error);
break;
+ }
}
if (!restore_perms()) {
@@ -1188,8 +1198,8 @@ set_loginclass(struct passwd *pw)
} else {
login_class = pw->pw_class;
if (!login_class || !*login_class)
- login_class =
- (pw->pw_uid == 0) ? LOGIN_DEFROOTCLASS : LOGIN_DEFCLASS;
+ login_class = (char *)
+ ((pw->pw_uid == 0) ? LOGIN_DEFROOTCLASS : LOGIN_DEFCLASS);
}
/* Make sure specified login class is valid. */
@@ -1666,6 +1676,31 @@ cb_intercept_allow_setid(const char *file, int line, int column,
debug_return_bool(true);
}
+bool
+cb_log_input(const char *file, int line, int column,
+ const union sudo_defs_val *sd_un, int op)
+{
+ debug_decl(cb_log_input, SUDOERS_DEBUG_PLUGIN);
+
+ def_log_stdin = op;
+ def_log_ttyin = op;
+
+ debug_return_bool(true);
+}
+
+bool
+cb_log_output(const char *file, int line, int column,
+ const union sudo_defs_val *sd_un, int op)
+{
+ debug_decl(cb_log_output, SUDOERS_DEBUG_PLUGIN);
+
+ def_log_stdout = op;
+ def_log_stderr = op;
+ def_log_ttyout = op;
+
+ debug_return_bool(true);
+}
+
/*
* Set parse Defaults callbacks.
* We do this here instead in def_data.in so we don't have to
@@ -1727,6 +1762,8 @@ set_callbacks(void)
sudo_defs_table[I_PASSPROMPT_REGEX].callback = cb_passprompt_regex;
sudo_defs_table[I_INTERCEPT_TYPE].callback = cb_intercept_type;
sudo_defs_table[I_INTERCEPT_ALLOW_SETID].callback = cb_intercept_allow_setid;
+ sudo_defs_table[I_LOG_INPUT].callback = cb_log_input;
+ sudo_defs_table[I_LOG_OUTPUT].callback = cb_log_output;
debug_return;
}
@@ -1764,6 +1801,7 @@ sudoers_cleanup(void)
/* Clear globals */
list_pw = NULL;
+ saved_argv = NULL;
NewArgv = NULL;
NewArgc = 0;
prev_user = NULL;
@@ -1776,7 +1814,8 @@ tty_present(void)
{
debug_decl(tty_present, SUDOERS_DEBUG_PLUGIN);
- if (user_ttypath == NULL) {
+ if (user_tcpgid == 0 && user_ttypath == NULL) {
+ /* No job control or terminal, check /dev/tty. */
int fd = open(_PATH_TTY, O_RDWR);
if (fd == -1)
debug_return_bool(false);
@@ -1820,6 +1859,7 @@ sudo_user_free(void)
free(user_cmnd);
free(user_args);
free(safe_cmnd);
+ free(saved_cmnd);
free(user_stat);
#ifdef HAVE_SELINUX
free(user_role);
diff --git a/plugins/sudoers/sudoers.h b/plugins/sudoers/sudoers.h
index a6718ccac..cd9270744 100644
--- a/plugins/sudoers/sudoers.h
+++ b/plugins/sudoers/sudoers.h
@@ -103,6 +103,7 @@ struct sudo_user {
char *cmnd_args;
char *cmnd_base;
char *cmnd_safe;
+ char *cmnd_saved;
char *class_name;
char *krb5_ccname;
struct gid_list *gid_list;
@@ -133,6 +134,7 @@ struct sudo_user {
uid_t uid;
uid_t gid;
pid_t sid;
+ pid_t tcpgid;
char uuid_str[37];
};
@@ -200,7 +202,8 @@ struct sudo_user {
#define MODE_PRESERVE_ENV 0x00400000
#define MODE_NONINTERACTIVE 0x00800000
#define MODE_IGNORE_TICKET 0x01000000
-#define MODE_POLICY_INTERCEPTED 0x02000000
+#define MODE_UPDATE_TICKET 0x02000000
+#define MODE_POLICY_INTERCEPTED 0x04000000
/* Mode bits allowed for intercepted commands. */
#define MODE_INTERCEPT_MASK (MODE_RUN|MODE_NONINTERACTIVE|MODE_IGNORE_TICKET|MODE_POLICY_INTERCEPTED)
@@ -224,6 +227,7 @@ struct sudo_user {
#define user_uid (sudo_user.uid)
#define user_gid (sudo_user.gid)
#define user_sid (sudo_user.sid)
+#define user_tcpgid (sudo_user.tcpgid)
#define user_umask (sudo_user.umask)
#define user_passwd (sudo_user.pw->pw_passwd)
#define user_dir (sudo_user.pw->pw_dir)
@@ -245,6 +249,7 @@ struct sudo_user {
#define user_srunhost (sudo_user.srunhost)
#define user_ccname (sudo_user.krb5_ccname)
#define safe_cmnd (sudo_user.cmnd_safe)
+#define saved_cmnd (sudo_user.cmnd_saved)
#define cmnd_fd (sudo_user.execfd)
#define login_class (sudo_user.class_name)
#define runas_pw (sudo_user._runas_pw)
@@ -408,16 +413,18 @@ 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);
+void register_env_file(void * (*ef_open)(const char *), void (*ef_close)(void *), char * (*ef_next)(void *, int *), bool sys);
/* 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 *);
+bool cb_log_input(const char *file, int line, int column, const union sudo_defs_val *sd_un, int op);
+bool cb_log_output(const char *file, int line, int column, const union sudo_defs_val *sd_un, int op);
int set_cmnd_path(const char *runchroot);
int sudoers_init(void *info, sudoers_logger_t logger, char * const envp[]);
-int sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], bool verbose, void *closure);
+int sudoers_policy_main(int argc, char *const argv[], int pwflag, char *env_add[], bool verbose, void *closure);
void sudoers_cleanup(void);
void sudo_user_free(void);
extern struct sudo_user sudo_user;
@@ -442,7 +449,7 @@ extern const char *path_ldap_conf;
extern const char *path_ldap_secret;
/* group_plugin.c */
-int group_plugin_load(char *plugin_info);
+int group_plugin_load(const char *plugin_info);
void group_plugin_unload(void);
int group_plugin_query(const char *user, const char *group,
const struct passwd *pwd);
@@ -450,8 +457,8 @@ bool cb_group_plugin(const char *file, int line, int column, const union sudo_de
extern const char *path_plugin_dir;
/* editor.c */
-char *find_editor(int nfiles, char **files, int *argc_out, char ***argv_out,
- char * const *allowlist, const char **env_editor);
+char *find_editor(int nfiles, char * const *files, int *argc_out,
+ char ***argv_out, char * const *allowlist, const char **env_editor);
/* exptilde.c */
bool expand_tilde(char **path, const char *user);
diff --git a/plugins/sudoers/sudoers_hooks.c b/plugins/sudoers/sudoers_hooks.c
index d0610e0e1..738f93b38 100644
--- a/plugins/sudoers/sudoers_hooks.c
+++ b/plugins/sudoers/sudoers_hooks.c
@@ -101,7 +101,7 @@ sudoers_hook_getenv(const char *name, char **value, void *closure)
goto done;
}
if (strcmp(name, "LC_ALL") == 0 || strcmp(name, "LC_MESSAGES") == 0) {
- *value = def_sudoers_locale;
+ *value = (char *)def_sudoers_locale;
goto done;
}
}
diff --git a/plugins/sudoers/sudoreplay.c b/plugins/sudoers/sudoreplay.c
index 5b8ebe501..f7c3743c3 100644
--- a/plugins/sudoers/sudoreplay.c
+++ b/plugins/sudoers/sudoreplay.c
@@ -175,12 +175,12 @@ extern time_t get_date(char *);
static int list_sessions(int, char **, const char *, const char *, const char *);
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 sudo_noreturn void help(void);
+static sudo_noreturn void usage(void);
static int replay_session(int iolog_dir_fd, const char *iolog_dir,
struct timespec *offset, 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 eventlog *evlog, bool interactive, bool resize);
@@ -302,7 +302,7 @@ main(int argc, char *argv[])
exitcode = EXIT_SUCCESS;
goto done;
default:
- usage(1);
+ usage();
/* NOTREACHED */
}
@@ -316,7 +316,7 @@ main(int argc, char *argv[])
}
if (argc != 1)
- usage(1);
+ usage();
/* By default we replay stdout, stderr and ttyout. */
if (def_filter) {
@@ -1129,7 +1129,7 @@ write_output(int fd, int what, void *v)
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_base = (char *)"\r\n";
iov[1].iov_len = 2;
iovcnt = 2;
nbytes = iov[0].iov_len + iov[1].iov_len;
@@ -1645,23 +1645,26 @@ read_keyboard(int fd, int what, void *v)
}
static void
-usage(int fatal)
+print_usage(FILE *fp)
{
- fprintf(fatal ? stderr : stdout,
- _("usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n"),
+ fprintf(fp, _("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"),
+ fprintf(fp, _("usage: %s [-h] [-d dir] -l [search expression]\n"),
getprogname());
- if (fatal)
- exit(EXIT_FAILURE);
+}
+
+static void
+usage(void)
+{
+ print_usage(stderr);
+ exit(EXIT_FAILURE);
}
static void
help(void)
{
(void) printf(_("%s - replay sudo session logs\n\n"), getprogname());
- usage(0);
+ print_usage(stdout);
(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"
diff --git a/plugins/sudoers/testsudoers.c b/plugins/sudoers/testsudoers.c
index d83bdb0c7..3af5636d9 100644
--- a/plugins/sudoers/testsudoers.c
+++ b/plugins/sudoers/testsudoers.c
@@ -61,7 +61,7 @@ enum sudoers_formats {
* Function Prototypes
*/
static void dump_sudoers(struct sudo_lbuf *lbuf);
-static void usage(void) __attribute__((__noreturn__));
+static sudo_noreturn void usage(void);
static void set_runaspw(const char *);
static void set_runasgr(const char *);
static bool cb_runas_default(const char *file, int line, int column, const union sudo_defs_val *, int);
@@ -202,8 +202,8 @@ main(int argc, char *argv[])
if (argc < 2) {
if (!dflag)
usage();
- user_name = argc ? *argv++ : "root";
- user_cmnd = user_base = "true";
+ user_name = argc ? *argv++ : (char *)"root";
+ user_cmnd = user_base = (char *)"true";
argc = 0;
} else {
user_name = *argv++;
@@ -442,16 +442,21 @@ open_sudoers(const char *file, bool doedit, bool *keepopen)
struct stat sb;
FILE *fp = NULL;
const char *base;
+ int error, fd;
debug_decl(open_sudoers, SUDOERS_DEBUG_UTIL);
/* Report errors using the basename for consistent test output. */
base = sudo_basename(file);
- switch (sudo_secure_file(file, sudoers_uid, sudoers_gid, &sb)) {
- case SUDO_PATH_SECURE:
- fp = fopen(file, "r");
- break;
+ fd = sudo_secure_open_file(file, sudoers_uid, sudoers_gid, &sb, &error);
+ if (fd != -1) {
+ if ((fp = fdopen(fd, "r")) == NULL) {
+ sudo_warn("unable to open %s", base);
+ close(fd);
+ }
+ } else {
+ switch (error) {
case SUDO_PATH_MISSING:
- sudo_warn("unable to stat %s", base);
+ sudo_warn("unable to open %s", base);
break;
case SUDO_PATH_BAD_TYPE:
sudo_warnx("%s is not a regular file", base);
@@ -468,8 +473,10 @@ open_sudoers(const char *file, bool doedit, bool *keepopen)
base, (unsigned int) sudoers_gid);
break;
default:
- /* NOTREACHED */
+ sudo_warnx("%s: internal error, unexpected error %d",
+ __func__, error);
break;
+ }
}
debug_return_ptr(fp);
diff --git a/plugins/sudoers/timestamp.c b/plugins/sudoers/timestamp.c
index 0de792b61..825eec6b7 100644
--- a/plugins/sudoers/timestamp.c
+++ b/plugins/sudoers/timestamp.c
@@ -181,87 +181,113 @@ ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entr
/*
* 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.
+ * Returns an fd usable with the *at() functions on success.
+ * Returns -1 on failure, setting errno.
*/
-static bool
+static int
ts_mkdirs(const char *path, uid_t owner, gid_t group, mode_t mode,
mode_t parent_mode, bool quiet)
{
- bool ret;
+ int parentfd, fd = -1;
+ const char *base;
mode_t omask;
debug_decl(ts_mkdirs, SUDOERS_DEBUG_AUTH);
+ /* Child directory we will create. */
+ base = sudo_basename(path);
+
/* 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) {
+ parentfd = sudo_open_parent_dir(path, owner, group, parent_mode, quiet);
+ if (parentfd != -1) {
/* 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 (mkdirat(parentfd, base, mode) != 0 && errno != EEXIST) {
if (!quiet)
sudo_warn(U_("unable to mkdir %s"), path);
- ret = false;
} else {
- if (chown(path, owner, group) != 0) {
+ fd = openat(parentfd, base, O_RDONLY|O_NONBLOCK, 0);
+ if (fd == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to open %s", __func__, path);
+ } else if (fchown(fd, 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);
}
}
+ close(parentfd);
}
umask(omask);
- debug_return_bool(ret);
+ debug_return_int(fd);
}
/*
* 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.
+ *
+ * Returns an fd usable with the *at() functions on success.
+ * Returns -1 on failure, setting errno.
*/
-static bool
-ts_secure_dir(char *path, bool make_it, bool quiet)
+static int
+ts_secure_opendir(const char *path, bool make_it, bool quiet)
{
+ int error, fd;
struct stat sb;
- bool ret = false;
- debug_decl(ts_secure_dir, SUDOERS_DEBUG_AUTH);
+ debug_decl(ts_secure_opendir, 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;
+ fd = sudo_secure_open_dir(path, timestamp_uid, timestamp_gid, &sb, &error);
+ if (fd == -1) {
+ switch (error) {
+ case SUDO_PATH_MISSING:
+ if (make_it) {
+ fd = ts_mkdirs(path, timestamp_uid, timestamp_gid, S_IRWXU,
+ S_IRWXU|S_IXGRP|S_IXOTH, quiet);
+ if (fd != -1)
+ break;
+ }
+ if (!quiet)
+ sudo_warn("%s", path);
+ 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_WORLD_WRITABLE:
+ if (!quiet)
+ sudo_warnx(U_("%s is world writable"), path);
+ errno = EACCES;
+ break;
+ case SUDO_PATH_GROUP_WRITABLE:
+ if (!quiet) {
+ sudo_warnx(U_("%s is owned by gid %u, should be %u"),
+ path, (unsigned int)sb.st_gid, (unsigned int)timestamp_gid);
+ }
+ errno = EACCES;
+ break;
+ default:
+ if (!quiet) {
+ sudo_warnx("%s: internal error, unexpected error %d",
+ __func__, error);
+ errno = EINVAL;
+ }
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);
+
+ debug_return_int(fd);
}
/*
@@ -271,15 +297,15 @@ ts_secure_dir(char *path, bool make_it, bool quiet)
* Returns TIMESTAMP_OPEN_ERROR or TIMESTAMP_PERM_ERROR on error.
*/
static int
-ts_open(const char *path, int flags)
+ts_openat(int dfd, const char *path, int flags)
{
bool uid_changed = false;
int fd;
- debug_decl(ts_open, SUDOERS_DEBUG_AUTH);
+ debug_decl(ts_openat, SUDOERS_DEBUG_AUTH);
if (timestamp_uid != 0)
uid_changed = set_perms(PERM_TIMESTAMP);
- fd = open(path, flags, S_IRUSR|S_IWUSR);
+ fd = openat(dfd, path, flags, S_IRUSR|S_IWUSR);
if (uid_changed && !restore_perms()) {
/* Unable to restore permissions, should not happen. */
if (fd != -1) {
@@ -406,7 +432,7 @@ timestamp_open(const char *user, pid_t sid)
{
struct ts_cookie *cookie;
char *fname = NULL;
- int tries, fd = -1;
+ int tries, dfd = -1, fd = -1;
debug_decl(timestamp_open, SUDOERS_DEBUG_AUTH);
/* Zero timeout means don't use the time stamp file. */
@@ -416,7 +442,8 @@ timestamp_open(const char *user, pid_t sid)
}
/* Check the validity of timestamp dir and create if missing. */
- if (!ts_secure_dir(def_timestampdir, true, false))
+ dfd = ts_secure_opendir(def_timestampdir, true, false);
+ if (dfd == -1)
goto bad;
/* Open time stamp file. */
@@ -427,7 +454,7 @@ timestamp_open(const char *user, pid_t sid)
for (tries = 1; ; tries++) {
struct stat sb;
- fd = ts_open(fname, O_RDWR|O_CREAT);
+ fd = ts_openat(dfd, user, O_RDWR|O_CREAT);
switch (fd) {
case TIMESTAMP_OPEN_ERROR:
log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), fname);
@@ -453,7 +480,7 @@ timestamp_open(const char *user, pid_t sid)
sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
"removing time stamp file that predates boot time");
close(fd);
- unlink(fname);
+ unlinkat(dfd, user, 0);
continue;
}
}
@@ -473,9 +500,12 @@ timestamp_open(const char *user, pid_t sid)
cookie->sid = sid;
cookie->pos = -1;
+ close(dfd);
debug_return_ptr(cookie);
bad:
- if (fd != -1)
+ if (dfd != -1)
+ close(dfd);
+ if (fd >= 0)
close(fd);
free(fname);
debug_return_ptr(NULL);
@@ -591,7 +621,7 @@ done:
/*
* Write a TS_LOCKEXCL record at the beginning of the time stamp file.
*/
-bool
+static bool
timestamp_lock_write(struct ts_cookie *cookie)
{
struct timestamp_entry entry;
@@ -962,7 +992,7 @@ int
timestamp_remove(bool unlink_it)
{
struct timestamp_entry key, entry;
- int fd = -1, ret = true;
+ int dfd = -1, fd = -1, ret = true;
char *fname = NULL;
debug_decl(timestamp_remove, SUDOERS_DEBUG_AUTH);
@@ -976,6 +1006,13 @@ timestamp_remove(bool unlink_it)
}
#endif
+ dfd = open(def_timestampdir, O_RDONLY|O_NONBLOCK);
+ if (dfd == -1) {
+ if (errno != ENOENT)
+ ret = -1;
+ goto done;
+ }
+
if (asprintf(&fname, "%s/%s", def_timestampdir, user_name) == -1) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
ret = -1;
@@ -984,12 +1021,12 @@ timestamp_remove(bool unlink_it)
/* For "sudo -K" simply unlink the time stamp file. */
if (unlink_it) {
- ret = unlink(fname) ? -1 : true;
+ ret = unlinkat(dfd, user_name, 0) ? -1 : true;
goto done;
}
/* Open time stamp file and lock it for exclusive access. */
- fd = ts_open(fname, O_RDWR);
+ fd = ts_openat(dfd, user_name, O_RDWR);
switch (fd) {
case TIMESTAMP_OPEN_ERROR:
if (errno != ENOENT)
@@ -1023,7 +1060,9 @@ timestamp_remove(bool unlink_it)
}
done:
- if (fd != -1)
+ if (dfd != -1)
+ close(dfd);
+ if (fd >= 0)
close(fd);
free(fname);
debug_return_int(ret);
@@ -1035,21 +1074,17 @@ done:
bool
already_lectured(void)
{
- char status_file[PATH_MAX];
+ bool ret = false;
struct stat sb;
- int len;
+ int dfd;
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);
+ dfd = ts_secure_opendir(def_lecture_status_dir, false, true);
+ if (dfd != -1) {
+ ret = fstatat(dfd, user_name, &sb, AT_SYMLINK_NOFOLLOW) == 0;
+ close(dfd);
}
- debug_return_bool(false);
+ debug_return_bool(ret);
}
/*
@@ -1059,24 +1094,16 @@ already_lectured(void)
int
set_lectured(void)
{
- char lecture_status[PATH_MAX];
- int len, fd, ret = false;
+ int dfd, 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;
- }
-
- /* Check the validity of lecture dir and create if missing. */
- if (!ts_secure_dir(def_lecture_status_dir, true, false))
+ /* Check the validity of timestamp dir and create if missing. */
+ dfd = ts_secure_opendir(def_lecture_status_dir, true, false);
+ if (dfd == -1)
goto done;
/* Create lecture file. */
- fd = ts_open(lecture_status, O_WRONLY|O_CREAT|O_EXCL);
+ fd = ts_openat(dfd, user_name, O_WRONLY|O_CREAT|O_EXCL);
switch (fd) {
case TIMESTAMP_OPEN_ERROR:
/* Failed to open, not a fatal error. */
@@ -1091,6 +1118,7 @@ set_lectured(void)
ret = true;
break;
}
+ close(dfd);
done:
debug_return_int(ret);
diff --git a/plugins/sudoers/timestr.c b/plugins/sudoers/timestr.c
index 8eb223afc..d208215fb 100644
--- a/plugins/sudoers/timestr.c
+++ b/plugins/sudoers/timestr.c
@@ -26,9 +26,7 @@
#include <time.h>
-#include "sudo_compat.h"
-#include "sudo_debug.h"
-#include "parse.h"
+#include "sudoers.h"
/*
* Return a static buffer with the current date + time.
diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c
index 44365bc60..82c8423dc 100644
--- a/plugins/sudoers/toke.c
+++ b/plugins/sudoers/toke.c
@@ -3085,7 +3085,7 @@ char *sudoerstext;
#endif
// PVS Studio suppression
-// -V::519, 1004, 1037
+// -V::519, 547, 1004, 1037, 1048
int sudolineno; /* current sudoers line number. */
char *sudoers; /* sudoers file being parsed. */
diff --git a/plugins/sudoers/toke.h b/plugins/sudoers/toke.h
index d20cb458f..2b9f111b2 100644
--- a/plugins/sudoers/toke.h
+++ b/plugins/sudoers/toke.h
@@ -36,7 +36,7 @@ bool fill_cmnd(const char *, size_t);
bool fill(const char *, size_t);
bool ipv6_valid(const char *s);
int sudoers_trace_print(const char *);
-void sudoerserrorf(const char *, ...) __printf0like(1, 2);
+void sudoerserrorf(const char *, ...) sudo_printf0like(1, 2);
void sudoerserror(const char *);
bool push_include(const char *, bool);
diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l
index 3cd4eecb8..c843162d3 100644
--- a/plugins/sudoers/toke.l
+++ b/plugins/sudoers/toke.l
@@ -51,7 +51,7 @@
#endif
// PVS Studio suppression
-// -V::519, 1004, 1037
+// -V::519, 547, 1004, 1037, 1048
int sudolineno; /* current sudoers line number. */
char *sudoers; /* sudoers file being parsed. */
diff --git a/plugins/sudoers/tsdump.c b/plugins/sudoers/tsdump.c
index 8abe667fa..db15f7b63 100644
--- a/plugins/sudoers/tsdump.c
+++ b/plugins/sudoers/tsdump.c
@@ -50,7 +50,7 @@ union timestamp_entry_storage {
sudo_dso_public int main(int argc, char *argv[]);
-static void usage(void) __attribute__((__noreturn__));
+static sudo_noreturn void usage(void);
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);
diff --git a/plugins/sudoers/tsgetgrpw.c b/plugins/sudoers/tsgetgrpw.c
index 27439e97b..481cb3370 100644
--- a/plugins/sudoers/tsgetgrpw.c
+++ b/plugins/sudoers/tsgetgrpw.c
@@ -23,8 +23,8 @@
*/
/*
- * Trivial replacements for the libc get{gr,pw}{uid,nam}() routines
- * for use by testsudoers in the sudo test harness.
+ * Trivial replacements for the libc getgrent() and getpwent() family
+ * of functions for use by testsudoers in the sudo test harness.
* We need our own since many platforms don't provide set{pw,gr}file().
*/
diff --git a/plugins/sudoers/tsgetgrpw.h b/plugins/sudoers/tsgetgrpw.h
index a893cbac3..826189b39 100644
--- a/plugins/sudoers/tsgetgrpw.h
+++ b/plugins/sudoers/tsgetgrpw.h
@@ -17,8 +17,8 @@
*/
/*
- * Trivial replacements for the libc get{gr,pw}{uid,nam}() routines
- * for use by testsudoers in the sudo test harness.
+ * Trivial replacements for the libc getgrent() and getpwent() family
+ * of functions for use by testsudoers in the sudo test harness.
* We need our own since many platforms don't provide set{pw,gr}file().
*/
@@ -40,3 +40,6 @@ void testsudoers_endpwent(void);
struct passwd *testsudoers_getpwent(void);
struct passwd *testsudoers_getpwnam(const char *);
struct passwd *testsudoers_getpwuid(uid_t);
+
+int testsudoers_getgrouplist2_v1(const char *name, GETGROUPS_T basegid,
+ GETGROUPS_T **groupsp, int *ngroupsp);
diff --git a/plugins/sudoers/unesc_str.c b/plugins/sudoers/unesc_str.c
index 763e1ceac..2b5e24271 100644
--- a/plugins/sudoers/unesc_str.c
+++ b/plugins/sudoers/unesc_str.c
@@ -21,8 +21,12 @@
* PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
*/
+#include <config.h>
+
#include <string.h>
+#include "sudoers.h"
+
/*
* Remove backslash escape chars.
*/
diff --git a/plugins/sudoers/visudo.c b/plugins/sudoers/visudo.c
index 679d39da8..734118bac 100644
--- a/plugins/sudoers/visudo.c
+++ b/plugins/sudoers/visudo.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 1996, 1998-2005, 2007-2018
+ * Copyright (c) 1996, 1998-2005, 2007-2022
* Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -90,14 +90,14 @@ static char *get_editor(int *editor_argc, char ***editor_argv);
static bool check_syntax(const char *, bool, bool, bool, bool);
static bool edit_sudoers(struct sudoersfile *, char *, int, char **, int);
static bool install_sudoers(struct sudoersfile *, bool, bool);
-static bool visudo_track_error(const char *file, int line, int column, const char *fmt, va_list args);
+static bool visudo_track_error(const char *file, int line, int column, const char *fmt, va_list args) sudo_printf0like(4, 0);
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 int run_command(const char *, char *const *);
static void parse_sudoers_options(void);
static void setup_signals(void);
-static void help(void) __attribute__((__noreturn__));
-static void usage(int);
+static sudo_noreturn void help(void);
+static sudo_noreturn void usage(void);
static void visudo_cleanup(void);
extern void get_hostname(void);
@@ -109,13 +109,15 @@ struct sudo_user sudo_user;
struct passwd *list_pw;
static struct sudoersfile_list sudoerslist = TAILQ_HEAD_INITIALIZER(sudoerslist);
static bool checkonly;
+static bool edit_includes = true;
static unsigned int errors;
-static const char short_opts[] = "cf:hOPqsVx:";
+static const char short_opts[] = "cf:hIOPqsVx:";
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' },
+ { "no-includes", no_argument, NULL, 'I' },
{ "owner", no_argument, NULL, 'O' },
{ "perms", no_argument, NULL, 'P' },
{ "quiet", no_argument, NULL, 'q' },
@@ -151,7 +153,7 @@ main(int argc, char *argv[])
textdomain("sudoers");
if (argc < 1)
- usage(1);
+ usage();
/* Register fatal/fatalx callback. */
sudo_fatal_callback_register(visudo_cleanup);
@@ -192,6 +194,9 @@ main(int argc, char *argv[])
case 'h':
help();
break;
+ case 'I':
+ edit_includes = false;
+ break;
case 'O':
use_owner = true; /* check/set owner */
break;
@@ -208,7 +213,7 @@ main(int argc, char *argv[])
export_path = optarg;
break;
default:
- usage(1);
+ usage();
}
}
argc -= optind;
@@ -226,7 +231,7 @@ main(int argc, char *argv[])
}
break;
default:
- usage(1);
+ usage();
}
if (fflag) {
@@ -255,7 +260,7 @@ main(int argc, char *argv[])
}
/* Mock up a fake sudo_user struct. */
- user_cmnd = user_base = "";
+ user_cmnd = user_base = (char *)"";
if (geteuid() == 0) {
const char *user = getenv("SUDO_USER");
if (user != NULL && *user != '\0')
@@ -361,7 +366,7 @@ get_editor(int *editor_argc, char ***editor_argv)
{
char *editor_path = NULL, **allowlist = NULL;
const char *env_editor;
- static char *files[] = { "+1", "sudoers" };
+ static const char *files[] = { "+1", "sudoers" };
unsigned int allowlist_len = 0;
debug_decl(get_editor, SUDOERS_DEBUG_UTIL);
@@ -389,8 +394,8 @@ get_editor(int *editor_argc, char ***editor_argv)
allowlist[allowlist_len] = NULL;
}
- editor_path = find_editor(2, files, editor_argc, editor_argv, allowlist,
- &env_editor);
+ editor_path = find_editor(2, (char **)files, editor_argc, editor_argv,
+ allowlist, &env_editor);
if (editor_path == NULL) {
if (def_env_editor && env_editor != NULL) {
/* We are honoring $EDITOR so this is a fatal error. */
@@ -413,12 +418,13 @@ get_editor(int *editor_argc, char ***editor_argv)
* If an entry starts with '*' the tail end of the string is matched.
* No other wild cards are supported.
*/
-static char *lineno_editors[] = {
+static const char *lineno_editors[] = {
"ex",
"nex",
"vi",
"nvi",
"vim",
+ "nvim",
"elvis",
"*macs",
"mg",
@@ -440,7 +446,7 @@ static bool
editor_supports_plus(const char *editor)
{
const char *cp, *editor_base;
- char **av;
+ const char **av;
debug_decl(editor_supports_plus, SUDOERS_DEBUG_UTIL);
editor_base = sudo_basename(editor);
@@ -532,7 +538,7 @@ edit_sudoers(struct sudoersfile *sp, char *editor, int editor_argc,
(void)snprintf(linestr, sizeof(linestr), "+%d", lineno);
editor_argv[ac++] = linestr; // -V507
}
- editor_argv[ac++] = "--";
+ editor_argv[ac++] = (char *)"--";
editor_argv[ac++] = sp->tpath;
editor_argv[ac++] = NULL;
@@ -655,7 +661,7 @@ reparse_sudoers(char *editor, int editor_argc, char **editor_argv,
}
fclose(sudoersin);
if (!parse_error) {
- (void) update_defaults(&parsed_policy, NULL,
+ parse_error = !update_defaults(&parsed_policy, NULL,
SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true);
check_defaults_and_aliases(strict, quiet);
}
@@ -885,7 +891,7 @@ setup_signals(void)
}
static int
-run_command(char *path, char **argv)
+run_command(const char *path, char *const *argv)
{
int status;
pid_t pid, rv;
@@ -975,7 +981,7 @@ check_syntax(const char *file, bool quiet, bool strict, bool check_owner,
parse_error = true;
}
if (!parse_error) {
- (void) update_defaults(&parsed_policy, NULL,
+ parse_error = !update_defaults(&parsed_policy, NULL,
SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true);
check_defaults_and_aliases(strict, quiet);
}
@@ -1086,6 +1092,11 @@ open_sudoers(const char *path, bool doedit, bool *keepopen)
break;
}
if (entry == NULL) {
+ if (doedit && !edit_includes) {
+ /* Only edit the main sudoers file. */
+ if (strcmp(path, sudoers_file) != 0)
+ doedit = false;
+ }
if ((entry = new_sudoers(path, doedit)) == NULL)
debug_return_ptr(NULL);
if ((fp = fdopen(entry->fd, "r")) == NULL)
@@ -1204,34 +1215,35 @@ quit(int signo)
#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_base = (char *)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_base = (char *)"\n";
iov[3].iov_len = 1;
ignore_result(writev(STDERR_FILENO, iov, 4));
_exit(signo);
}
+#define VISUDO_USAGE "usage: %s [-chqsV] [[-f] sudoers ]\n"
+
static void
-usage(int fatal)
+usage(void)
{
- (void) fprintf(fatal ? stderr : stdout,
- "usage: %s [-chqsV] [[-f] sudoers ]\n", getprogname());
- if (fatal)
- exit(EXIT_FAILURE);
+ (void) fprintf(stderr, VISUDO_USAGE, getprogname());
+ exit(EXIT_FAILURE);
}
static void
help(void)
{
(void) printf(_("%s - safely edit the sudoers file\n\n"), getprogname());
- usage(0);
+ (void) printf(VISUDO_USAGE, getprogname());
(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"
+ " -I, --no-includes do not edit include files\n"
" -q, --quiet less verbose (quiet) syntax error messages\n"
" -s, --strict strict syntax checking\n"
" -V, --version display version information and exit\n"));
diff --git a/po/cs.mo b/po/cs.mo
index 426ae8463..bc3aaacf8 100644
--- a/po/cs.mo
+++ b/po/cs.mo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index c95334d66..6c8d5d754 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -6,10 +6,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-06-03 20:39+02:00\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-11 20:57+02:00\n"
"Last-Translator: Petr Pisar <petr.pisar@atlas.cz>\n"
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
"Language: cs\n"
@@ -32,76 +32,75 @@ msgid "unable to restore registry"
msgstr "registr nelze obnovit"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "nelze alokovat paměť"
@@ -115,23 +114,23 @@ msgstr "nelze získat údaje o %.*s"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s existuje, ale nejedná se o adresář (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "%s nelze otevřít"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "%.*s nelze otevřít"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "adresář %.*s nelze vytvořit"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "%.*s nelze otevřít"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "regulární výraz je příliš dlouhý"
@@ -140,8 +139,8 @@ msgstr "regulární výraz je příliš dlouhý"
msgid "Unknown signal"
msgstr "Neznámý signál"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "neplatná hodnota"
@@ -153,87 +152,87 @@ msgstr "hodnota je příliš velká"
msgid "value too small"
msgstr "hodnota je příliš malá"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, 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:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, 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:440
+#: lib/util/sudo_conf.c:441
#, 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:456
+#: lib/util/sudo_conf.c:457
#, 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:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "nelze získat údaje o %s"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s není obyÄejný soubor"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, 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:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s je zapisovatelný pro všechny"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s je zapisovatelný pro skupinu"
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr "nepodaÅ™ilo se urÄit uzavÅ™ení AppArmoru"
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr "profil AppArmoru nelze změnit na %s"
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: zkrátit %s na nula bajtů? (y pro ano / n pro ne) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "%s nebude přepsáno"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "z %s nelze Äíst"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "do %s nelze zapsat"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "nelze získat údaje o %s"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: nejedná se o obyÄejný soubor"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: chybná práva souboru: 0%o"
@@ -243,61 +242,60 @@ msgid "unable to restore current working directory"
msgstr "souÄasný pracovní adresář nelze obnovit"
# This sets an inhertiable set of Solaris process privileges.
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr "nelze nastavit množinu děditelných oprávnění"
# This sets a limit set of Solaris process privileges.
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr "nelze nastavit množinu omezující oprávnění"
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "neznámá přihlašovací třída %s"
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "nelze nastavit kontext uživatele"
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "nelze nastavit prioritu procesu"
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "kořenový adresář nelze změnit na %s"
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "nelze změnit UID na (%u, %u)"
-#: src/exec.c:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "pracovní adresář nelze změnit na %s"
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "zaÄíná se od %s"
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "obsluhu pro signál %d nelze nastavit"
-#: src/exec.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr "režim zachytávání není na tomto systému se selinuxovým RBAC podporován"
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr "na tomto systému se selinuxovým RBAC nelze zaznamenávat podpříkazy"
@@ -305,58 +303,84 @@ msgstr "na tomto systému se selinuxovým RBAC nelze zaznamenávat podpříkazy"
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "z PRIV_LIMIT nelze odstranit PRIV_PROC_EXEC"
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "událost nelze přidat do fronty"
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "příkaz nenastaven bezpeÄnostní politikou"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "příkaz zamítnut politikou"
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "chyba schvalovacího modulu"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "chyba modulu s politikou"
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr "neplatný požadavek PolicyCheckRequest"
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "požadavek od klienta je příliš dlouhý: %zu"
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "nelze rozbalit %s o velikosti %zu"
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "neÄekaná hodnota type_case %d v %s od %s"
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "zpráva serveru je příliš dlouhá: %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "chyba vstupně-výstupního modulu"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "příkaz zamítnut vstupně-výstupním modulem"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "chyba pozastavování protokolu"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "chyba při měnění velikosti okna"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "chyba pÅ™i Ätení z dvojice socketů"
@@ -366,224 +390,213 @@ msgstr "chyba pÅ™i Ätení z dvojice socketů"
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:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "řídicí terminál nelze nastavit"
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "nelze vytvořit rouru"
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "od rodiÄe nelze pÅ™ijmout zprávu"
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "nelze vytvořit potomka"
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "nelze obnovit znaÄku TTY"
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "%s nelze spustit"
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "modul s politikami zrušil inicializaci relace"
-#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "nelze vytvořit sockety"
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "chyba ve smyÄce s událostmi"
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr "nedostatek místa pro argumenty volání execve"
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
-msgstr "nelze pÅ™eÄíst %s volání execve pro proces %d"
+msgid "internal error, %s overflow"
+msgstr "vnitÅ™ní chyba, pÅ™eteÄení v %s"
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr "nelze nastavit registry pro proces %d"
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr "proces %d neÄekanÄ› skonÄil"
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr "nelze nastavit filtr seccomp"
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "argument interpretru, oÄekáváno „%s“, obdrženo „%s“"
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr "cesta neodpovídá, oÄekáváno „%s“, obdrženo „%s“"
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr "%s[%d] neodpovídá, oÄekáváno „%s“, obdrženo „%s“"
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "proces %d má neÄekaný stav 0x%x"
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr "nelze získat zprávu o události v procesu %d"
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr "nelze získat registry procesu %d"
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr "nelze alokovat PTY"
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr "chyba vstupně-výstupního modulu"
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr "příkaz zamítnut vstupně-výstupním modulem"
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr "chyba pozastavování protokolu"
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr "chyba při měnění velikosti okna"
-
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, c-format
msgid "unable to restore handler for signal %d"
msgstr "nelze obnovit obsluhu signálu %d"
-#: src/exec_pty.c:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "dohlížejícímu procesu nelze odeslat zprávu"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, 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:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s musí být vlastněn UID %d"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%s musí být zapisovatelný jen vlastníkem"
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "ignoruje je opakovaný modul „%s“ v %s na řádku %d"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "%s nelze zavést: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "v %s nelze nalézt symbol „%s“"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, 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:317
+#: src/load_plugins.c:319
#, 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:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "lze zadat pouze jeden modul s politikou"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "v %2$s nalezen neznámý druh modulu %1$d"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, 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:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "vnitÅ™ní chyba, pÅ™eteÄení v %s"
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "neplatný název proměnné prostředí: %s"
-#: src/parse_args.c:314
+#: src/parse_args.c:317
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:545
+#: src/parse_args.c:554
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:550
+#: src/parse_args.c:559
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:560
+#: src/parse_args.c:569
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:563
+#: src/parse_args.c:572
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:573
+#: src/parse_args.c:582
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:577
+#: src/parse_args.c:586
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:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "na této platformě není sudoedit podporován"
-#: src/parse_args.c:757
+#: src/parse_args.c:767
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:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "Smí být zadán pouze jeden z pÅ™epínaÄů -K, -k nebo -N"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -592,7 +605,7 @@ msgstr ""
"%s – upraví soubory jako jiný uživatel\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -601,7 +614,7 @@ msgstr ""
"%s – vykoná příkaz jako jiný uživatel\n"
"\n"
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -609,131 +622,131 @@ msgstr ""
"\n"
"PÅ™epínaÄe:\n"
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "dotazuje se na heslo prostřednictvím pomocného programu"
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "použije zadaný druh BSD autentizace"
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "spustí příkaz na pozadí"
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "při výzvě vydá zvukové znamení"
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "uzavÅ™e vÅ¡echny deskriptory souboru >= Äíslu"
-#: src/parse_args.c:798
+#: src/parse_args.c:821
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:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "změní pracovní adresář před spuštěním příkazu"
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "při spuštění příkazu zachová uživatelské prostředí"
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "zachová urÄité promÄ›nné prostÅ™edí"
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "místo spuštění příkazu upraví soubory"
-#: src/parse_args.c:811
+#: src/parse_args.c:834
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:814
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "nastaví proměnnou HOME na domovský adresář uživatele"
-#: src/parse_args.c:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "zobrazí nápovÄ›du a skonÄí"
-#: src/parse_args.c:819
+#: src/parse_args.c:842
msgid "run command on host (if supported by plugin)"
msgstr "spustí příkaz na stroji (je-li podporováno modulem)"
-#: src/parse_args.c:822
+#: src/parse_args.c:845
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:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "úplnÄ› odstraní soubor s Äasovými údaji"
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "zneplatní soubor s Äasovými údaji"
-#: src/parse_args.c:830
+#: src/parse_args.c:853
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:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "neinteraktivní režim, nepoužijí se žádné dotazy"
-#: src/parse_args.c:836
+#: src/parse_args.c:859
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:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "použije urÄený dotaz na heslo"
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "změní kořenový adresář přes spuštěním příkazu"
-#: src/parse_args.c:844
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "vytvoří selinuxový bezpeÄnostní kontext se zadanou rolí"
-#: src/parse_args.c:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "naÄte heslo ze standardní vstupu"
-#: src/parse_args.c:850
+#: src/parse_args.c:873
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:854
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "vytvoří selinuxový bezpeÄnostní kontext se zadaným typem"
-#: src/parse_args.c:857
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "po uplynutí zadaného Äasu ukonÄí příkaz"
-#: src/parse_args.c:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "v režimu výpisu zobrazí oprávnění uživatele"
-#: src/parse_args.c:863
+#: src/parse_args.c:886
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:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "zobrazí údaje o verzi a skonÄí"
-#: src/parse_args.c:868
+#: src/parse_args.c:891
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:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "přestane zpracovávat argumenty příkazového řádku"
@@ -833,37 +846,42 @@ msgstr "nepodařilo se nastavit kontext pro spuštění na %s"
msgid "unable to set key creation context to %s"
msgstr "nepodaÅ™ilo se nastavit kontext pro vytváření klíÄů na %s"
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "je třeba alespoň jeden argument"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "Smí být zadán pouze jeden z pÅ™epínaÄů -c nebo -i"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "neplatné Äíslo deskriptoru souboru: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "%s nelze spustit jako přihlašovací shell"
+msgid "The -%c option may not be used in edit mode."
+msgstr "PÅ™epínaÄ -%c nesmí být použit v režimu úprav."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:184 src/sesh.c:189
+#, c-format
+msgid "The -%c option may only be used in edit mode."
+msgstr "PÅ™epínaÄ -%c smí být použit v režimu úprav."
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: úprava symbolických odkazů není dovolena"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, 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/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "obsah relace s úpravami ponechán v %s"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "nelze získat seznam skupin"
@@ -947,118 +965,122 @@ msgstr "neexistujete v databázi %s"
msgid "unable to determine tty"
msgstr "nelze urÄit terminál"
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "Je nastaven příznak „žádná další oprávnění“, což brání sudu, aby běželo jako root"
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "Běží-li sudo v kontejneru, můžete potřebovat upravit nastavení kontejneru, aby se tento příznak vypnul."
-#: src/sudo.c:961
+#: src/sudo.c:954
#, 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:964
+#: src/sudo.c:957
#, 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:970
+#: src/sudo.c:963
#, 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:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "nelze nastavit ID doplňkových skupin"
-#: src/sudo.c:993
+#: src/sudo.c:986
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr "efektivní GID nelze nastavit na %u"
-#: src/sudo.c:999
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "GID nelze nastavit na %u"
-#: src/sudo.c:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "pole argumentů nenastaveno bezpeÄnostní politikou"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "pole promÄ›nných prostÅ™edí nenastaveno bezpeÄnostní politikou"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "neoÄekávaný důvod ukonÄení potomka: %d"
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "modul s politikami nelze inicializovat"
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "modulu s politikami %s chybí metoda „check_policy“"
-#: src/sudo.c:1257
+#: src/sudo.c:1269
#, 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:1301
+#: src/sudo.c:1313
#, 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:1339
+#: src/sudo.c:1351
#, 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.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "chyba při inicializaci vstupně-výstupního modulu %s"
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "chyba při inicializaci vstupně-výstupního modulu"
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "chyba při inicializaci auditního modulu %s"
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s nelze zaznamenat chybovou událost%s%s"
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s nelze zaznamenat přijímací událost%s%s "
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "chyba auditního modulu"
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s nelze zaznamenat zamítací událost%s%s "
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "chyba při inicializaci schvalovacího modulu %s"
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "příkaz zamítnut schvalovatelem"
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr "chyba schvalovacího modulu"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "nenalezen žádný doÄasný adresář, do kterého lze zapisovat"
@@ -1068,7 +1090,7 @@ msgstr "nenalezen žádný doÄasný adresář, do kterého lze zapisovat"
msgid "%s left unmodified"
msgstr "%s ponechán nezměněn"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s nezměněn"
@@ -1081,37 +1103,37 @@ msgstr "sesh: vnitÅ™ní chyba: lichý poÄet cest"
msgid "sesh: unable to create temporary files"
msgstr "sesh: nelze vytvoÅ™it doÄasné soubory"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: zabit signálem"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: neznámá chyba %d"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
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:606
+#: src/sudo_edit.c:601
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:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "UID nelze změnit na roota (%u)"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "chyba modulu: programu sudoedit chybí seznam souborů"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "nelze pÅ™eÄíst hodiny"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "zachytávací port nenastaven"
@@ -1162,6 +1184,18 @@ msgstr "standardní vstup nelze zduplikovat voláním dup2"
msgid "unable to restore stdin"
msgstr "standardní vstup nelze obnovit"
+#~ msgid "insufficient space for execve arguments"
+#~ msgstr "nedostatek místa pro argumenty volání execve"
+
+#~ msgid "unable to read execve %s for process %d"
+#~ msgstr "nelze pÅ™eÄíst %s volání execve pro proces %d"
+
+#~ msgid "requires at least one argument"
+#~ msgstr "je třeba alespoň jeden argument"
+
+#~ msgid "unable to run %s as a login shell"
+#~ msgstr "%s nelze spustit jako přihlašovací shell"
+
#~ msgid "unable to dup intercept fd"
#~ msgstr "zachycený deskriptor souboru nelze zduplikovat"
diff --git a/po/de.mo b/po/de.mo
index 1ffb3872a..2fa91ba9c 100644
--- a/po/de.mo
+++ b/po/de.mo
Binary files differ
diff --git a/po/de.po b/po/de.po
index 0c5d4ee5f..ee2307aa1 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,10 +4,10 @@
# Mario Blättermann <mario.blaettermann@gmail.com>, 2012, 2014-2017, 2019-2022.
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 11:15+0200\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-12 20:10+0200\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
"Language: de\n"
@@ -16,7 +16,7 @@ msgstr ""
"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 22.04.1\n"
+"X-Generator: Lokalize 22.08.1\n"
#: lib/util/aix.c:89 lib/util/aix.c:169
msgid "unable to open userdb"
@@ -32,76 +32,75 @@ msgid "unable to restore registry"
msgstr "Registrierungsdatenbank konnte nicht wiederhergestellt werden"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "Speicher konnte nicht zugewiesen werden"
@@ -115,23 +114,23 @@ msgstr "stat konnte nicht auf %.*s angewendet werden"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s existiert, aber ist kein Verzeichnis (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "%s konnte nicht geöffnet werden"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "%.*s konnte nicht geöffnet werden"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "Verzeichnis %.*s konnte nicht erstellt werden"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "%.*s konnte nicht geöffnet werden"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "regulärer Ausdruck ist zu groß"
@@ -140,8 +139,8 @@ msgstr "regulärer Ausdruck ist zu groß"
msgid "Unknown signal"
msgstr "Unbekanntes Signal"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "ungültiger Wert"
@@ -153,86 +152,86 @@ msgstr "Wert zu groß"
msgid "value too small"
msgstr "Wert zu klein"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, 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:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, 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:440
+#: lib/util/sudo_conf.c:441
#, 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:456
+#: lib/util/sudo_conf.c:457
#, 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:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "stat konnte nicht auf %s angewendet werden"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s ist keine reguläre Datei"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, 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:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s kann von allen verändert werden"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s kann von der Gruppe verändert werden"
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr "AppArmor-Zugriffskontrolle konnte nicht bestimmt werden."
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr "AppArmor-Profil konnte nicht zu %s geändert werden"
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
-msgstr "%s: %s auf null Byte kürzen? (j/n) [n] "
+msgstr "%s: %s auf null Byte kürzen? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "%s wird nicht überschrieben"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "Aus %s konnte nicht gelesen werden"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "%s konnte nicht beschrieben werden"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "stat konnte nicht auf %s angewendet werden"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: Keine reguläre Datei"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: falscher Dateimodus: 0%o"
@@ -241,60 +240,59 @@ msgstr "%s: falscher Dateimodus: 0%o"
msgid "unable to restore current working directory"
msgstr "Aktueller Arbeitsordner konnte nicht wiederhergestellt werden"
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr "Privilegien konnten nicht gesetzt werden"
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr "Privilegien konnten nicht eingeschränkt werden"
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "Unbekannte Anmeldungsklasse %s"
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "Benutzerkontext konnte nicht gesetzt werden"
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "Prozesspriorität konnte nicht gesetzt werden"
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "Wurzelverzeichnis konnte nicht zu %s geändert werden"
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, 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:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "In Verzeichnis »%s« konnte nicht gewechselt werden"
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "beginnend mit %s"
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "Handler für Signal %d konnte nicht gesetzt werden"
-#: src/exec.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr "Abfangmodus wird mit SELinux RBAC auf diesem System nicht unterstützt"
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr "Unterbefehle können mit SELinux RBAC auf diesem System nicht protokolliert werden"
@@ -302,58 +300,84 @@ msgstr "Unterbefehle können mit SELinux RBAC auf diesem System nicht protokolli
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "PRIV_PROC_EXEC konnte nicht von PRIV_LIMIT entfernt werden"
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "Ereignis konnte nicht zur Warteschlange hinzugefügt werden"
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "Befehl wurde durch Sicherheitsregelwerk nicht gesetzt"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "Befehl wurde durch Regelwerk abgewiesen"
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "Genehmigungs-Plugin-Fehler"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "Regelwerk-Plugin-Fehler"
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr "ungültige PolicyCheckRequest"
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "Client-Anfrage ist zu groß: %zu"
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "%s, Größe %zu, kann nicht entpackt werden"
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "unerwarteter Wert %d für type_case in %s aus %s"
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "Server-Meldung ist zu groß: %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "E/A-Pluginfehler"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "Befehl wurde vom E/A-Plugin abgewiesen"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "Fehler bei der Aussetzung der Protokollierung"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "Fehler beim Ändern der Fenstergröße"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "Fehler beim Lesen des Socket-Paars"
@@ -363,224 +387,213 @@ msgstr "Fehler beim Lesen des Socket-Paars"
msgid "unexpected reply type on backchannel: %d"
msgstr "Unerwarteter Antworttyp auf Rückmeldungskanal: %d"
-#: src/exec_monitor.c:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "Kontrollierendes TTY konnte nicht gesetzt werden"
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "Weiterleitung konnte nicht erstellt werden"
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "Die Nachricht konnte nicht empfangen werden"
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "Es konnte nicht geforkt werden"
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "TTY-Kennzeichnung konnte nicht wiederhergestellt werden"
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "%s konnte nicht ausgeführt werden"
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "Regelwerks-Plugin konnte Sitzung nicht initialisieren"
-#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "Sockets konnten nicht hergestellt werden"
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "Fehler in Ereignisschleife"
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr "Ungenügender Speicher für execve-Argumente"
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
-msgstr "execve %s konnte für Prozess %d nicht gelesen werden"
+msgid "internal error, %s overflow"
+msgstr "Interner Fehler: %s-Ãœberlauf"
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr "Register konnten für Prozess %d nicht gesetzt werden"
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr "Prozess %d wurde unerwartet beendet"
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr "seccomp-Filter konnte nicht gesetzt werden"
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "Interpreter-Argument: »%s« wurde erwartet, »%s« erhalten"
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr "Pfadname passt nicht, »%s« wurde erwartet, »%s« erhalten"
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr "%s[%d] passt nicht, »%s« wurde erwartet, »%s« erhalten"
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "Prozess %d hat den unerwarteten Status 0x%x"
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr "Ereignismeldung für Prozess %d konnte nicht erhalten werden"
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr "Register konnten für Prozess %d nicht erhalten werden"
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr "PTY konnte nicht vergeben werden"
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr "E/A-Pluginfehler"
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr "Befehl wurde vom E/A-Plugin abgewiesen"
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr "Fehler bei der Aussetzung der Protokollierung"
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr "Fehler beim Ändern der Fenstergröße"
-
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, c-format
msgid "unable to restore handler for signal %d"
msgstr "Handler für Signal %d konnte nicht wiederhergestellt werden"
-#: src/exec_pty.c:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "Die Nachricht konnte nicht an den überwachenden Prozess verschickt werden"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, 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:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s muss Benutzer mit UID %d gehören"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%s darf nur vom Besitzer beschreibbar sein"
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "Doppelt vorhandenes Plugin »%s« in %s, Zeile %d, wird ignoriert"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "»%s« konnte nicht geladen werden: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "Symbol »%s« konnte in %s nicht gefunden werden"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, 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:317
+#: src/load_plugins.c:319
#, 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:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "Nur ein einziges Regelwerks-Plugin kann geladen werden"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "Unbekannter Plugintyp %d wurde in %s gefunden"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, 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:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "Interner Fehler: %s-Ãœberlauf"
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "Unzulässiger Name der Umgebungsvariable: %s"
-#: src/parse_args.c:314
+#: src/parse_args.c:317
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:545
+#: src/parse_args.c:554
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:550
+#: src/parse_args.c:559
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:560
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "Die Option -E ist im Bearbeiten-Modus ungültig"
-#: src/parse_args.c:563
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr "Im Bearbeiten-Modus können keine Umgebungsvariablen gesetzt werden"
-#: src/parse_args.c:573
+#: src/parse_args.c:582
msgid "the -U option may only be used with the -l option"
msgstr "Die Option -U kann nur zusammen mit -l benutzt werden"
-#: src/parse_args.c:577
+#: src/parse_args.c:586
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:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "sudoedit ist auf dieser Plattform nicht verfügbar"
-#: src/parse_args.c:757
+#: src/parse_args.c:767
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:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "Nur eine der Optionen -K, -k oder -N darf angegeben werden"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -589,7 +602,7 @@ msgstr ""
"%s - Dateien als anderer Benutzer verändern\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -598,7 +611,7 @@ msgstr ""
"%s - Einen Befehl als anderer Benutzer ausführen\n"
"\n"
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -606,131 +619,131 @@ msgstr ""
"\n"
"Optionen:\n"
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "Hilfsprogramm zum Eingeben des Passworts verwenden"
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "Angegebenen BSD-Legitimierungstypen verwenden"
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "Befehl im Hintergrund ausführen"
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "Bei Eingabeaufforderung Systemklang abspielen"
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "Alle Dateideskriptoren >= num schließen"
-#: src/parse_args.c:798
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "Befehl unter angegebener Login-Klasse ausführen"
-#: src/parse_args.c:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "Arbeitsverzeichnis vor der Ausführung des Befehls wechseln"
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "Benutzerumgebung beim Starten des Befehls beibehalten"
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "Spezifische Umgebungsvariablen beibehalten"
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "Dateien bearbeiten, statt einen Befehl auszuführen"
-#: src/parse_args.c:811
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "Befehl unter angegebenem Gruppennamen oder Gruppen-ID ausführen"
-#: src/parse_args.c:814
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "HOME-Variable als Home-Verzeichnis des Zielbenutzers setzen"
-#: src/parse_args.c:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "Hilfe ausgeben und beenden"
-#: src/parse_args.c:819
+#: src/parse_args.c:842
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:822
+#: src/parse_args.c:845
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:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "Zeitstempeldateien komplett entfernen"
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "Zeitstempeldatei ungültig machen"
-#: src/parse_args.c:830
+#: src/parse_args.c:853
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:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "Nicht-interaktiver Modus, es werden keine Eingabeaufforderungen verwendet"
-#: src/parse_args.c:836
+#: src/parse_args.c:859
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:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "Angegebene Passwort-Eingabeaufforderung benutzen"
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "Wurzelverzeichnis vor der Ausführung des Befehls wechseln"
-#: src/parse_args.c:844
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "SELinux-Sicherheitskontext mit angegebener Funktion erstellen"
-#: src/parse_args.c:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "Passwort von der Standardeingabe lesen"
-#: src/parse_args.c:850
+#: src/parse_args.c:873
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:854
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "SELinux-Sicherheitskontext mit angegebenem Typ erstellen"
-#: src/parse_args.c:857
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "Befehlausführung nach der angegebenen Zeitbegrenzung abbrechen"
-#: src/parse_args.c:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "im Aufzählungsmodus, Rechte des Benutzers anzeigen"
-#: src/parse_args.c:863
+#: src/parse_args.c:886
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:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "Versionsinformation anzeigen und beenden"
-#: src/parse_args.c:868
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr "Den Zeitstempel des Benutzers erneuern, ohne einen Befehl auszuführen"
-#: src/parse_args.c:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "Aufhören, die Befehlszeilenargumente zu verarbeiten"
@@ -834,37 +847,42 @@ msgstr "Ausführungskontext konnte nicht auf »%s« gesetzt werden"
msgid "unable to set key creation context to %s"
msgstr "Kontext der Schüsselerstellung konnte nicht auf %s festgelegt werden."
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "Benötigt mindestens ein Argument"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "Nur eine der Optionen -c oder -i darf angegeben werden"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "Unzulässige Dateideskriptornummer: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "%s konnte nicht als Anmeldeshell ausgeführt werden"
+msgid "The -%c option may not be used in edit mode."
+msgstr "Die Option -%c darf im Bearbeiten-Modus nicht verwendet werden."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:184 src/sesh.c:189
+#, c-format
+msgid "The -%c option may only be used in edit mode."
+msgstr "Die Option -%c darf nur im Bearbeiten-Modus verwendet werden."
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: Bearbeiten symbolischer Links ist nicht erlaubt"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, 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/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "Bearbeitungssitzung wurden in %s gelassen"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "Gruppenliste konnte nicht geholt werden"
@@ -948,118 +966,122 @@ msgstr "Sie sind in der %s-Datenbank nicht enthalten"
msgid "unable to determine tty"
msgstr "TTY konnte nicht ermittelt werden"
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "Der Schalter »no new privileges« ist gesetzt, welcher sudo daran hindert, als Root ausgeführt zu werden."
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "Falls sudo in einem Container ausgeführt wird, könnte es nötig sein, die Containerkonfiguration anzupassen, um diesen Schalter zu deaktivieren."
-#: src/sudo.c:961
+#: src/sudo.c:954
#, 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:964
+#: src/sudo.c:957
#, 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:970
+#: src/sudo.c:963
#, 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:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "Zusätzliche Gruppenkennungen konnten nicht gesetzt werden"
-#: src/sudo.c:993
+#: src/sudo.c:986
#, 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:999
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "GID konnte nicht auf »runas«-GID %u gesetzt werden"
-#: src/sudo.c:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "argv wurde durch Sicherheitsregelwerk nicht gesetzt"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "envp wurde durch Sicherheitsregelwerk nicht gesetzt"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "Unerwartete Abbruchbedingung eines Unterprozesses: %d"
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "Regelwerks-Plugin konnte nicht initialisiert werden"
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, 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:1257
+#: src/sudo.c:1269
#, 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:1301
+#: src/sudo.c:1313
#, 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:1339
+#: src/sudo.c:1351
#, 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.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "E/A-Plugin %s konnte nicht initialisiert werden"
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "E/A-Plugin konnte nicht initialisiert werden"
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "Audit-Plugin %s konnte nicht initialisiert werden"
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: Fehlerereignis%s%s konnte nicht protokolliert werden"
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: Ereignis%s%s konnte für das Protokoll nicht akzeptiert werden"
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "Audit-Pluginfehler"
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: Ereignis%s%s wurde vom Protokoll abgewiesen"
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "Genehmigungs-Plugin %s konnte nicht initialisiert werden"
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "Befehl wurde vom Genehmigenden abgewiesen"
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr "Genehmigungs-Plugin-Fehler"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "Kein beschreibbares temporäres Verzeichnis gefunden"
@@ -1069,7 +1091,7 @@ msgstr "Kein beschreibbares temporäres Verzeichnis gefunden"
msgid "%s left unmodified"
msgstr "%s blieb unverändert"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s unverändert"
@@ -1082,37 +1104,37 @@ msgstr "sesh: interner Fehler: seltsame Anzahl an Pfaden"
msgid "sesh: unable to create temporary files"
msgstr "sesh: Temporäre Dateien konnten nicht angelegt werden"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: von einem Signal getötet"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: unbekannter Fehler %d"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
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:606
+#: src/sudo_edit.c:601
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:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "UID konnte nicht zu Root (%u) geändert werden"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "Plugin-Fehler: Fehlende Dateiliste für sudoedit"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "Die Uhr konnte nicht gelesen werden"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "Intercept-Port ist nicht gesetzt"
@@ -1162,15 +1184,3 @@ msgstr "dup2 konnte nicht auf die Standardeingabe angewendet werden"
#: src/utmp.c:293
msgid "unable to restore stdin"
msgstr "Standardeingabe konnte nicht wiederhergestellt werden"
-
-#~ msgid "%s%s: %s"
-#~ msgstr "%s%s: %s"
-
-#~ msgid "unable to set tty context to %s"
-#~ msgstr "TTY-Kontext konnte nicht auf %s gesetzt werden"
-
-#~ msgid "%s: short write"
-#~ msgstr "%s: Zu kurzer Schreibvorgang"
-
-#~ msgid "unable to read temporary file"
-#~ msgstr "Temporäre Datei konnte nicht gelesen werden"
diff --git a/po/fr.mo b/po/fr.mo
index e31a94728..1179a391c 100644
--- a/po/fr.mo
+++ b/po/fr.mo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index 63170ea1e..ee484c11e 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -6,10 +6,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 11:22+0200\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-12 13:31+0200\n"
"Last-Translator: Frédéric Marchal <fmarchal@perso.be>\n"
"Language-Team: French <traduc@traduc.org>\n"
"Language: fr\n"
@@ -33,76 +33,75 @@ msgid "unable to restore registry"
msgstr "impossible de rétablir le registre"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "impossible d'allouer la mémoire"
@@ -116,23 +115,23 @@ msgstr "impossible d'évaluer par stat() %.*s"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s existe mais il n'est pas un répertoire (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "impossible d'ouvrir %s"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "impossible d'ouvrir %.*s"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "impossible d'exécuter mkdir %.*s"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "impossible d'ouvrir %.*s"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "l'expression régulière est trop grande"
@@ -141,8 +140,8 @@ msgstr "l'expression régulière est trop grande"
msgid "Unknown signal"
msgstr "Signal inconnu"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "valeur incorrecte"
@@ -154,86 +153,86 @@ msgstr "valeur trop grande"
msgid "value too small"
msgstr "valeur trop petite"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, 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:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, 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:440
+#: lib/util/sudo_conf.c:441
#, 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:456
+#: lib/util/sudo_conf.c:457
#, 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:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "impossible d'évaluer par stat() %s"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s n'est pas un fichier régulier"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, 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:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s peut être écrit par tout le monde"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s peut être écrit par le groupe"
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr "impossible de déterminer le confinement de AppArmor"
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr "impossible de changer le profil de AppArmor en %s"
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: tronquer %s à zéro octets ? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "n'écrase pas %s"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "impossible de lire depuis %s"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "impossible d'écrire dans %s"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "impossible d'évaluer par stat() %s"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: pas un fichier régulier"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: mauvais mode de fichier : 0%o"
@@ -242,60 +241,59 @@ msgstr "%s: mauvais mode de fichier : 0%o"
msgid "unable to restore current working directory"
msgstr "impossible de rétablir le répertoire de travail actuel"
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr "impossible de définir les privilèges"
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr "impossible de définir la limite des privilèges"
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "classe de login %s inconnue"
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "impossible de changer le contexte utilisateur"
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "impossible de changer la priorité du processus"
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "impossible de changer root en %s"
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "impossible de changer vers runas uid (%u, %u)"
-#: src/exec.c:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "impossible de changer le répertoire vers %s"
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "au départ de %s"
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "impossible de spécifier le gestionnaire pour le signal %d"
-#: src/exec.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr "le mode d'interception n'est pas supporté avec SELinux RBAC sur ce système"
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr "impossible d'écrire les sous-commandes dans le journal avec SELinux RBAC sur ce système"
@@ -303,58 +301,84 @@ msgstr "impossible d'écrire les sous-commandes dans le journal avec SELinux RBA
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "impossible de supprimer PRIV_PROC_EXEC de PRIV_LIMIT"
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "impossible d'ajouter l'événement à la queue"
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "commande pas définie par la politique de sécurité"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "commande rejetée par la politique"
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "erreur du greffon d'approbation"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "erreur du greffon de politique"
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr "PolicyCheckRequest invalide"
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "demande client trop grand : %zu"
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "impossible de décompresser %s avec une taille de %zu"
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "valeur %d inattendue pour type_case dans %s de %s"
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "message serveur trop grand : %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "erreur du greffon d'E/S"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "commande rejetée par le greffon d'E/S"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "l'enregistrement des erreurs est suspendu"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "erreur lors du changement de la taille de la fenêtre"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "erreur de lecture sur la paire de sockets"
@@ -364,224 +388,213 @@ msgstr "erreur de lecture sur la paire de sockets"
msgid "unexpected reply type on backchannel: %d"
msgstr "réponse inattendue sur le backchannel : %d"
-#: src/exec_monitor.c:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "impossible de choisir le tty de contrôle"
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "impossible de créer le tube"
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "impossible de recevoir un message du parent"
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "erreur de fork"
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "impossible de rétablir l'étiquette du tty"
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "impossible d'exécuter %s"
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
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:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "impossible de créer des sockets"
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "erreur dans la boucle des événements"
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr "espace insuffisant pour les arguments de execve"
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
-msgstr "impossible de lire execve %s pour le processus %d"
+msgid "internal error, %s overflow"
+msgstr "erreur interne, débordement %s"
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr "impossible de définir les registres pour le processus %d"
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr "le processus %d s'est terminé de manière inattendue"
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr "impossible de définir le filtre seccomp"
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "interpréteur d'argument, « %s » attendu, « %s » obtenu"
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr "désaccord dans le nom du chemin, « %s » attendu, « %s » obtenu"
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr "désaccord dans %s[%d], « %s » attendu, « %s » obtenu"
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "le processus %d a retourné le statut inattendu 0x%x"
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr "impossible d'obtenir le message de l'événement pour le processus %d"
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr "impossible d'obtenir les registres pour le processus %d"
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr "impossible d'allouer le pty"
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr "erreur du greffon d'E/S"
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr "commande rejetée par le greffon d'E/S"
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr "l'enregistrement des erreurs est suspendu"
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr "erreur lors du changement de la taille de la fenêtre"
-
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, 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:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "impossible d'envoyer le message au processus de monitoring"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, 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:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s doit être la propriété du uid %d"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, 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:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "ignore le greffon en double « %s » dans %s, ligne %d"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "impossible de charger %s : %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "impossible de trouver le symbole « %s » dans %s"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, 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:317
+#: src/load_plugins.c:319
#, 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:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "un seul greffon de règles peut être spécifié"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "type de greffon %d inconnu dans %s"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, 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:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "erreur interne, débordement %s"
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "nom de variable d'environnement invalide: %s"
-#: src/parse_args.c:314
+#: src/parse_args.c:317
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:545
+#: src/parse_args.c:554
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:550
+#: src/parse_args.c:559
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:560
+#: src/parse_args.c:569
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:563
+#: src/parse_args.c:572
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:573
+#: src/parse_args.c:582
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:577
+#: src/parse_args.c:586
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:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "sudoedit n'est pas pris en charge sur cette plate-forme"
-#: src/parse_args.c:757
+#: src/parse_args.c:767
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:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "Seule une des options -K, -k ou -N peut être spécifiée"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -590,7 +603,7 @@ msgstr ""
"%s – édite les fichiers en tant qu'un autre utilisateur\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -599,7 +612,7 @@ msgstr ""
"%s – exécute une commande en tant qu'un autre utilisateur\n"
"\n"
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -607,131 +620,131 @@ msgstr ""
"\n"
"Options:\n"
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "utiliser un programme adjoint pour demander le mot de passe"
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "utiliser le type d'authentification BSD spécifié"
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "exécuter la commande en arrière-plan"
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "émettre un signal sonore lors d'une demande"
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "fermer tous les descripteurs de fichiers >= n°"
-#: src/parse_args.c:798
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "exécuter la commande avec la classe de login BSD"
-#: src/parse_args.c:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "changer le répertoire de travail avant d'exécuter la commande"
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "préserver l'environnement de l'utilisateur en exécutant la commande"
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "préserver les variables d'environnement spécifiques"
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "éditer les fichiers au lieu d'exécuter une commande"
-#: src/parse_args.c:811
+#: src/parse_args.c:834
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:814
+#: src/parse_args.c:837
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:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "afficher le message d'aide et terminer"
-#: src/parse_args.c:819
+#: src/parse_args.c:842
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:822
+#: src/parse_args.c:845
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:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "supprime complètement le fichier d'horodatage"
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "invalide le fichier d'horodatage"
-#: src/parse_args.c:830
+#: src/parse_args.c:853
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:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "mode non interactif, aucune invite utilisée"
-#: src/parse_args.c:836
+#: src/parse_args.c:859
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:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "utiliser l'invite de mot de passe spécifié"
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "changer le répertoire racine avant d'exécuter la commande"
-#: src/parse_args.c:844
+#: src/parse_args.c:867
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:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "lire le mot de passe depuis l'entrée standard"
-#: src/parse_args.c:850
+#: src/parse_args.c:873
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:854
+#: src/parse_args.c:877
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:857
+#: src/parse_args.c:880
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:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "en mode liste, afficher les privilèges de l'utilisateur"
-#: src/parse_args.c:863
+#: src/parse_args.c:886
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:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "afficher les informations de version et terminer"
-#: src/parse_args.c:868
+#: src/parse_args.c:891
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:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "arrêter de traiter les arguments en ligne de commande"
@@ -831,37 +844,42 @@ msgstr "impossible de changer le contexte exec en %s"
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:72
-msgid "requires at least one argument"
-msgstr "exige au moins un argument"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "Seule une des options -c ou -i peut être spécifiée"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "numéro de descripteur de fichier invalide: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "impossible d'exécuter %s comme un shell de login"
+msgid "The -%c option may not be used in edit mode."
+msgstr "L'option -%c n'est pas valable en mode édition."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:184 src/sesh.c:189
+#, c-format
+msgid "The -%c option may only be used in edit mode."
+msgstr "L'option -%c ne peut être utilisée qu'en mode édition."
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: l'édition de liens symboliques n'est pas permise"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, 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/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "contenu de la session d'édition laissé dans %s"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "impossible d'obtenir la liste des groupes"
@@ -945,118 +963,122 @@ msgstr "vous n'existez pas dans la base de données %s"
msgid "unable to determine tty"
msgstr "impossible de déterminer le tty"
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "Le fanion « no new privileges » (« pas de nouveau privilèges ») est défini. Il empêche sudo de s'exécuter en tant que root."
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "Si sudo est exécuté dans un conteneur, vous devrez ajuster la configuration du conteneur pour désactiver ce fanion."
-#: src/sudo.c:961
+#: src/sudo.c:954
#, 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:964
+#: src/sudo.c:957
#, 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:970
+#: src/sudo.c:963
#, 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:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "impossible d'attribuer les ID de groupe supplémentaires"
-#: src/sudo.c:993
+#: src/sudo.c:986
#, 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:999
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "impossible de changer le gid à runas gid %u"
-#: src/sudo.c:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "argv pas défini par la politique de sécurité"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "envp pas défini par la politique de sécurité"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "condition de fin de l'enfant inconnue: %d"
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "impossible d'initialiser le greffon de règles"
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, 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:1257
+#: src/sudo.c:1269
#, 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:1301
+#: src/sudo.c:1313
#, 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:1339
+#: src/sudo.c:1351
#, 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.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "erreur à l'initialisation du greffon E/S %s"
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "erreur à l'initialisation du greffon E/S"
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "erreur à l'initialisation du greffon d'audit %s"
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: impossible d'enregistrer dans le journal l'événement d'erreur%s%s"
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: impossible d'enregistrer dans le journal l'événement d'acceptation%s%s"
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "erreur du greffon d'audit"
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: impossible d'enregistrer dans le journal l'événement de rejet%s%s"
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "erreur à l'initialisation du greffon d'approbation %s"
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "commande rejetée par l'approbateur"
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr "erreur du greffon d'approbation"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "aucun répertoire temporaire est disponible en écriture"
@@ -1066,7 +1088,7 @@ msgstr "aucun répertoire temporaire est disponible en écriture"
msgid "%s left unmodified"
msgstr "%s laissé tel quel"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s non modifié"
@@ -1079,37 +1101,37 @@ msgstr "sesh: erreur interne: nombre impaire de chemins"
msgid "sesh: unable to create temporary files"
msgstr "sesh: impossible de créer des fichiers temporaires"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: tué par un signal"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: erreur %d inconnue"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
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:606
+#: src/sudo_edit.c:601
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:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "impossible de changer le uid en root (%u)"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "erreur de greffon : liste de fichiers manquantes pour sudoedit"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "impossible de lire l'horloge"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "port d'interception non défini"
@@ -1160,6 +1182,18 @@ msgstr "impossible d'exécuter dup2 sur stdin"
msgid "unable to restore stdin"
msgstr "impossible de rétablir stdin"
+#~ msgid "insufficient space for execve arguments"
+#~ msgstr "espace insuffisant pour les arguments de execve"
+
+#~ msgid "unable to read execve %s for process %d"
+#~ msgstr "impossible de lire execve %s pour le processus %d"
+
+#~ msgid "requires at least one argument"
+#~ msgstr "exige au moins un argument"
+
+#~ msgid "unable to run %s as a login shell"
+#~ msgstr "impossible d'exécuter %s comme un shell de login"
+
#~ msgid "unable to dup intercept fd"
#~ msgstr "impossible de dupliquer le fd intercepté"
diff --git a/po/ja.mo b/po/ja.mo
index 937db2f1a..b33813f29 100644
--- a/po/ja.mo
+++ b/po/ja.mo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index 4cb496470..f5f4e86f6 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -5,10 +5,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.10b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-02-12 09:31-0700\n"
-"PO-Revision-Date: 2022-02-14 23:27+0900\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-15 08:13+0900\n"
"Last-Translator: Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>\n"
"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
"Language: ja\n"
@@ -18,7 +18,7 @@ msgstr ""
"X-Bugs: Report translation errors to the Language-Team address.\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 2.4.2\n"
-"X-Poedit-Basepath: sudo-1.9.8b2\n"
+"X-Poedit-Basepath: sudo-1.9.12b2\n"
"X-Poedit-SearchPath-0: .\n"
#: lib/util/aix.c:89 lib/util/aix.c:169
@@ -35,75 +35,75 @@ msgid "unable to restore registry"
msgstr "レジストリーを復元ã§ãã¾ã›ã‚“"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:206 src/exec_monitor.c:456
-#: src/exec_monitor.c:462 src/exec_monitor.c:470 src/exec_monitor.c:478
-#: src/exec_monitor.c:485 src/exec_monitor.c:492 src/exec_monitor.c:499
-#: src/exec_monitor.c:506 src/exec_monitor.c:513 src/exec_monitor.c:520
-#: src/exec_monitor.c:527 src/exec_nopty.c:219 src/exec_nopty.c:228
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:306 src/exec_nopty.c:503
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_pty.c:840
-#: src/exec_pty.c:849 src/exec_pty.c:906 src/exec_pty.c:1059
-#: src/exec_pty.c:1231 src/exec_pty.c:1240 src/exec_pty.c:1247
-#: src/exec_pty.c:1254 src/exec_pty.c:1261 src/exec_pty.c:1268
-#: src/exec_pty.c:1275 src/exec_pty.c:1282 src/exec_pty.c:1289
-#: src/exec_pty.c:1296 src/exec_pty.c:1303 src/exec_pty.c:1311
-#: src/exec_pty.c:1774 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:192 src/parse_args.c:213 src/parse_args.c:287
-#: src/parse_args.c:632 src/parse_args.c:654 src/parse_args.c:679
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:483 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:709 src/sudo.c:719 src/sudo.c:744 src/sudo.c:767
-#: src/sudo.c:776 src/sudo.c:785 src/sudo.c:802 src/sudo.c:844 src/sudo.c:854
-#: src/sudo.c:883 src/sudo.c:1083 src/sudo.c:1104 src/sudo.c:1397
-#: src/sudo.c:1566 src/sudo.c:1793 src/sudo.c:2127 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:100
-#: src/exec_intercept.c:330 src/exec_intercept.c:354 src/exec_intercept.c:377
-#: src/exec_intercept.c:385 src/exec_intercept.c:410 src/exec_intercept.c:416
-#: src/exec_intercept.c:425 src/exec_intercept.c:431 src/exec_intercept.c:565
-#: src/exec_intercept.c:706 src/exec_monitor.c:456 src/exec_monitor.c:462
-#: src/exec_monitor.c:470 src/exec_monitor.c:478 src/exec_monitor.c:485
-#: src/exec_monitor.c:492 src/exec_monitor.c:499 src/exec_monitor.c:506
-#: src/exec_monitor.c:513 src/exec_monitor.c:520 src/exec_monitor.c:527
-#: src/exec_nopty.c:219 src/exec_nopty.c:228 src/exec_nopty.c:235
-#: src/exec_nopty.c:242 src/exec_nopty.c:249 src/exec_nopty.c:256
-#: src/exec_nopty.c:263 src/exec_nopty.c:270 src/exec_nopty.c:277
-#: src/exec_nopty.c:284 src/exec_nopty.c:291 src/exec_nopty.c:298
-#: src/exec_nopty.c:306 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_pty.c:840 src/exec_pty.c:849 src/exec_pty.c:906
-#: src/exec_pty.c:1231 src/exec_pty.c:1240 src/exec_pty.c:1247
-#: src/exec_pty.c:1254 src/exec_pty.c:1261 src/exec_pty.c:1268
-#: src/exec_pty.c:1275 src/exec_pty.c:1282 src/exec_pty.c:1289
-#: src/exec_pty.c:1296 src/exec_pty.c:1303 src/exec_pty.c:1311
-#: src/exec_pty.c:1774 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:192 src/parse_args.c:214 src/parse_args.c:287
-#: src/parse_args.c:632 src/parse_args.c:654 src/parse_args.c:679
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:483 src/sesh.c:113
-#: src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:883 src/sudo.c:1083
-#: src/sudo.c:1104 src/sudo.c:1397 src/sudo.c:1566 src/sudo.c:1793
-#: src/sudo.c:2127 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
-#: src/sudo_edit.c:438 src/sudo_edit.c:539 src/sudo_edit.c:546
-#: src/sudo_edit.c:677 src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "メモリ割り当ã¦ã‚’è¡Œãˆã¾ã›ã‚“ã§ã—ãŸ"
@@ -117,23 +117,23 @@ msgstr "%.*s ã®çŠ¶æ…‹å–å¾— (stat) ãŒã§ãã¾ã›ã‚“"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“ (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "%s ã‚’é–‹ã‘ã¾ã›ã‚“"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "%.*s ã‚’é–‹ã‘ã¾ã›ã‚“"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "%.*s ã‚’ mkdir ã§ãã¾ã›ã‚“"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "%.*s ã‚’é–‹ã‘ã¾ã›ã‚“"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "æ­£è¦è¡¨ç¾ãŒé•·ã™ãŽã¾ã™ã€‚"
@@ -142,8 +142,8 @@ msgstr "æ­£è¦è¡¨ç¾ãŒé•·ã™ãŽã¾ã™ã€‚"
msgid "Unknown signal"
msgstr "ä¸æ˜Žãªã‚·ã‚°ãƒŠãƒ«ã§ã™"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "無効ãªå€¤"
@@ -155,77 +155,86 @@ msgstr "値ãŒå¤§ãéŽãŽã¾ã™"
msgid "value too small"
msgstr "値ãŒå°ã•éŽãŽã¾ã™"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, c-format
msgid "invalid Path value \"%s\" in %s, line %u"
msgstr "無効㪠Path ã®å€¤ \"%s\" ㌠%s ã® %u 行目 ã«ã‚ã‚Šã¾ã™"
-#: lib/util/sudo_conf.c:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, c-format
msgid "invalid value for %s \"%s\" in %s, line %u"
msgstr "無効㪠%s ã®å€¤ \"%s\" ㌠%s ã® %u 行目 ã«ã‚ã‚Šã¾ã™"
-#: lib/util/sudo_conf.c:440
+#: lib/util/sudo_conf.c:441
#, c-format
msgid "unsupported group source \"%s\" in %s, line %u"
msgstr "サãƒãƒ¼ãƒˆã—ã¦ã„ãªã„グループソース \"%s\" ㌠%s ã® %u 行目ã§æŒ‡å®šã•ã‚Œã¦ã„ã¾ã™"
-#: lib/util/sudo_conf.c:456
+#: lib/util/sudo_conf.c:457
#, c-format
msgid "invalid max groups \"%s\" in %s, line %u"
msgstr "無効ãªæœ€å¤§ã‚°ãƒ«ãƒ¼ãƒ—ã®å€¤ \"%s\" ㌠%s ã® %u 行目 ã«ã‚ã‚Šã¾ã™"
-#: lib/util/sudo_conf.c:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "%s ã®çŠ¶æ…‹å–å¾— (stat) ãŒã§ãã¾ã›ã‚“"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s ã¯é€šå¸¸ãƒ•ã‚¡ã‚¤ãƒ«ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ID %u ã«ã‚ˆã£ã¦æ‰€æœ‰ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“れ㯠%u ã§ã‚ã‚‹ã¹ãã§ã™"
-#: lib/util/sudo_conf.c:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s ã¯èª°ã§ã‚‚書ãè¾¼ã¿å¯èƒ½ã§ã™"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã‚ˆã‚‹æ›¸ãè¾¼ã¿ãŒå¯èƒ½ã§ã™"
-#: src/copy_file.c:93
+#: src/apparmor.c:85
+msgid "failed to determine AppArmor confinement"
+msgstr "AppArmor ã®åˆ¶é™ã‚’決定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。"
+
+#: src/apparmor.c:93
+#, c-format
+msgid "unable to change AppArmor profile to %s"
+msgstr "AppArmor ã®ãƒ—ロファイルを %s ã¸å¤‰æ›´ã§ãã¾ã›ã‚“"
+
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: %s をゼロãƒã‚¤ãƒˆã«åˆ‡ã‚Šè©°ã‚ã¾ã™ã‹? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "%s を上書ãã—ã¾ã›ã‚“"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "%s ã‹ã‚‰èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "%s ã¸æ›¸ã込むã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "%s ã®çŠ¶æ…‹å–å¾— (stat) ãŒã§ãã¾ã›ã‚“"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: 通常ファイルã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: ファイルã®ãƒ¢ãƒ¼ãƒ‰ãŒç•°å¸¸ã§ã™: 0%o"
@@ -234,99 +243,144 @@ msgstr "%s: ファイルã®ãƒ¢ãƒ¼ãƒ‰ãŒç•°å¸¸ã§ã™: 0%o"
msgid "unable to restore current working directory"
msgstr "カレントディレクトリを復元ã§ãã¾ã›ã‚“"
-#: src/exec.c:130
+#: src/exec.c:111
+msgid "unable to set privileges"
+msgstr "権é™ã‚’設定ã§ãã¾ã›ã‚“"
+
+#: src/exec.c:117 src/exec.c:122
+msgid "unable to set limit privileges"
+msgstr "制é™ã—ãŸæ¨©é™ã‚’設定ã§ãã¾ã›ã‚“"
+
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "ä¸æ˜Žãªãƒ­ã‚°ã‚¤ãƒ³ã‚¯ãƒ©ã‚¹ %s ã§ã™"
-#: src/exec.c:142
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "ユーザーコンテキストを設定ã§ãã¾ã›ã‚“"
-#: src/exec.c:158
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "プロセス優先度を設定ã§ãã¾ã›ã‚“"
-#: src/exec.c:175
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "root ã‚’ %s ã¸å¤‰æ›´ã§ãã¾ã›ã‚“"
-#: src/exec.c:188 src/exec.c:194 src/exec.c:201
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "実行時ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ID (uid) (%u, %u) ã¸å¤‰æ›´ã§ãã¾ã›ã‚“"
-#: src/exec.c:219
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "ディレクトリーを %s ã«å¤‰æ›´ã§ãã¾ã›ã‚“"
-#: src/exec.c:223
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "%s ã‹ã‚‰å§‹ã‚ã¾ã™"
-#: src/exec.c:305 src/exec_monitor.c:565 src/exec_monitor.c:567
-#: src/exec_nopty.c:561 src/exec_pty.c:581 src/exec_pty.c:1411
-#: src/exec_pty.c:1413 src/signal.c:144 src/signal.c:151 src/signal.c:165
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "シグナル %d ã®ãƒãƒ³ãƒ‰ãƒ©ã‚’設定ã§ãã¾ã›ã‚“"
+#: src/exec.c:422
+msgid "intercept mode is not supported with SELinux RBAC on this system"
+msgstr "SELinux RBAC ã§ã®ã‚¤ãƒ³ã‚¿ãƒ¼ã‚»ãƒ—トモードã¯ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: src/exec.c:427
+msgid "unable to log sub-commands with SELinux RBAC on this system"
+msgstr "SELinux RBAC ã§ã®ã‚µãƒ–コマンドログã¯ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
#: src/exec_common.c:56
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "PRIV_LIMIT ã‹ã‚‰ PRIV_PROC_EXEC ã‚’å–り除ãã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/exec_intercept.c:112 src/exec_intercept.c:116 src/exec_intercept.c:667
-#: src/exec_intercept.c:671 src/exec_intercept.c:857 src/exec_intercept.c:861
-#: src/exec_intercept.c:872 src/exec_intercept.c:876 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:221 src/exec_nopty.c:230 src/exec_nopty.c:237
-#: src/exec_nopty.c:244 src/exec_nopty.c:251 src/exec_nopty.c:258
-#: src/exec_nopty.c:265 src/exec_nopty.c:272 src/exec_nopty.c:279
-#: src/exec_nopty.c:286 src/exec_nopty.c:293 src/exec_nopty.c:300
-#: src/exec_nopty.c:308 src/exec_pty.c:706 src/exec_pty.c:711
-#: src/exec_pty.c:808 src/exec_pty.c:815 src/exec_pty.c:912
-#: src/exec_pty.c:1233 src/exec_pty.c:1242 src/exec_pty.c:1249
-#: src/exec_pty.c:1256 src/exec_pty.c:1263 src/exec_pty.c:1270
-#: src/exec_pty.c:1277 src/exec_pty.c:1284 src/exec_pty.c:1291
-#: src/exec_pty.c:1298 src/exec_pty.c:1305 src/exec_pty.c:1727
-#: src/exec_pty.c:1737 src/exec_pty.c:1782 src/exec_pty.c:1789
-#: src/exec_pty.c:1816
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "キューã«ã‚¤ãƒ™ãƒ³ãƒˆã‚’追加ã§ãã¾ã›ã‚“"
-#: src/exec_intercept.c:314
-msgid "invalid PolicyCheckRequest"
-msgstr "無効㪠PolicyCheckRequest"
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "セキュリティーãƒãƒªã‚·ãƒ¼ã«ã‚ˆã‚Šã‚³ãƒžãƒ³ãƒ‰ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: src/exec_intercept.c:362 src/sudo.c:1209 src/sudo.c:1254 src/sudo.c:1298
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "ãƒãƒªã‚·ãƒ¼ã«ã‚ˆã‚Šã‚³ãƒžãƒ³ãƒ‰ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"
-#: src/exec_intercept.c:455 src/sudo.c:1214 src/sudo.c:1259 src/sudo.c:1303
-#: src/sudo.c:1377
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "承èªãƒ—ラグイン エラー"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグインエラー"
-#: src/exec_intercept.c:561
+#: src/exec_intercept.c:543
+msgid "invalid PolicyCheckRequest"
+msgstr "無効㪠PolicyCheckRequest"
+
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "クライアントリクエストãŒå¤§ãéŽãŽã¾ã™: %zu"
-#: src/exec_intercept.c:659
+#: src/exec_intercept.c:720
+#, c-format
+msgid "unable to unpack %s size %zu"
+msgstr "%s を伸長ã§ãã¾ã›ã‚“ (é•·ã• %zu )"
+
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "予期ã—ãªã„ type_case ã®å€¤ %d ㌠%s ã®ä¸­ã«ã‚ã‚Šã¾ã™ã€ %s ã‹ã‚‰å‡ºã¦ããŸã‚‚ã®ã§ã™ã€‚"
-#: src/exec_intercept.c:694
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "サーãƒãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¤§ãéŽãŽã¾ã™: %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "I/O プラグインエラー"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "I/O プラグインã«ã‚ˆã‚Šã‚³ãƒžãƒ³ãƒ‰ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "エラーã®è¨˜éŒ²ãŒä¸€æ™‚中断ã—ã¦ã„ã¾ã™"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "ウィンドウサイズã®å¤‰æ›´ã§ã‚¨ãƒ©ãƒ¼"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "ソケットペアã‹ã‚‰ã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -336,180 +390,213 @@ msgstr "ソケットペアã‹ã‚‰ã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—
msgid "unexpected reply type on backchannel: %d"
msgstr "ãƒãƒƒã‚¯ãƒãƒ£ãƒ³ãƒãƒ«ã«é–¢ã™ã‚‹äºˆæœŸã—ãªã„リプレイタイプã§ã™: %d"
-#: src/exec_monitor.c:583
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "tty ã®åˆ¶å¾¡è¨­å®šãŒã§ãã¾ã›ã‚“"
-#: src/exec_monitor.c:591 src/exec_nopty.c:369 src/exec_pty.c:1490
-#: src/exec_pty.c:1511 src/exec_pty.c:1531 src/tgetpass.c:307
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "パイプを作æˆã§ãã¾ã›ã‚“"
-#: src/exec_monitor.c:601
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "親ã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/exec_monitor.c:617 src/exec_nopty.c:407 src/exec_pty.c:1569
-#: src/sudo_edit.c:361 src/tgetpass.c:311
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
+#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "fork ã§ãã¾ã›ã‚“"
-#: src/exec_monitor.c:621 src/exec_monitor.c:722 src/exec_nopty.c:471
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "tty ラベルを復旧ã§ãã¾ã›ã‚“"
-#: src/exec_monitor.c:637 src/sesh.c:123 src/sudo.c:1160
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "%s を実行ã§ãã¾ã›ã‚“"
-#: src/exec_nopty.c:363 src/exec_pty.c:1420
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグインãŒã‚»ãƒƒã‚·ãƒ§ãƒ³ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ"
-#: src/exec_nopty.c:377 src/exec_pty.c:1391 src/exec_pty.c:1399
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "ソケットを作æˆã§ãã¾ã›ã‚“"
-#: src/exec_nopty.c:459 src/exec_pty.c:1666
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "イベントループã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: src/exec_nopty.c:569 src/exec_pty.c:619 src/signal.c:101
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to restore handler for signal %d"
-msgstr "シグナル %d ã®ãƒãƒ³ãƒ‰ãƒ©ã‚’復元ã§ãã¾ã›ã‚“"
+msgid "internal error, %s overflow"
+msgstr "内部エラー〠%s ãŒã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒ­ãƒ¼ã—ã¾ã—ãŸ"
-#: src/exec_pty.c:158
-msgid "unable to allocate pty"
-msgstr "pty を割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“"
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
+#, c-format
+msgid "unable to set registers for process %d"
+msgstr "プロセス %d ã®ãƒ¬ã‚¸ã‚¹ã‚¿ãƒ¼ã‚’設定ã§ãã¾ã›ã‚“"
-#: src/exec_pty.c:222 src/exec_pty.c:262 src/exec_pty.c:302 src/exec_pty.c:353
-#: src/exec_pty.c:404
-msgid "I/O plugin error"
-msgstr "I/O プラグインエラー"
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
+#, c-format
+msgid "process %d exited unexpectedly"
+msgstr "プロセス %d ãŒäºˆæœŸã›ã¬çµ‚了をã—ã¾ã—ãŸ"
-#: src/exec_pty.c:226 src/exec_pty.c:266 src/exec_pty.c:306 src/exec_pty.c:357
-#: src/exec_pty.c:408
-msgid "command rejected by I/O plugin"
-msgstr "I/O プラグインã«ã‚ˆã‚Šã‚³ãƒžãƒ³ãƒ‰ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"
+#: src/exec_ptrace.c:1207
+msgid "unable to set seccomp filter"
+msgstr "seccomp フィルターを設定ã§ãã¾ã›ã‚“"
-#: src/exec_pty.c:455
-msgid "error logging suspend"
-msgstr "エラーã®è¨˜éŒ²ãŒä¸€æ™‚中断ã—ã¦ã„ã¾ã™"
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "インタープリターã®å¼•æ•°ã¯ã€ \"%s\" ã®ã¯ãšã§ã™ãŒã€\"%s\" ã§ã™"
-#: src/exec_pty.c:489
-msgid "error changing window size"
-msgstr "ウィンドウサイズã®å¤‰æ›´ã§ã‚¨ãƒ©ãƒ¼"
+#: src/exec_ptrace.c:1503
+#, c-format
+msgid "pathname mismatch, expected \"%s\", got \"%s\""
+msgstr "パスåãŒä¸€è‡´ã—ã¾ã›ã‚“〠\"%s\" ã®ã¯ãšã§ã™ãŒã€\"%s\" ã§ã™"
+
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
+#, c-format
+msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
+msgstr "%s[%d] ãŒä¸€è‡´ã—ã¾ã›ã‚“〠\"%s\" ã®ã¯ãšã§ã™ãŒã€\"%s\" ã§ã™"
+
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "プロセス %d ãŒäºˆæœŸã›ã¬çµ‚了ステータス 0x %x ã‚’è¿”ã—ã¾ã—ãŸ"
+
+#: src/exec_ptrace.c:1711
+#, c-format
+msgid "unable to get event message for process %d"
+msgstr "プロセス %d ã®ã‚¤ãƒ™ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã§ãã¾ã›ã‚“"
+
+#: src/exec_ptrace.c:1718
+#, c-format
+msgid "unable to get registers for process %d"
+msgstr "プロセス %d ã®ãƒ¬ã‚¸ã‚¹ã‚¿ãƒ¼ã‚’å–å¾—ã§ãã¾ã›ã‚“"
+
+#: src/exec_pty.c:103
+msgid "unable to allocate pty"
+msgstr "pty を割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“"
+
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
+#, c-format
+msgid "unable to restore handler for signal %d"
+msgstr "シグナル %d ã®ãƒãƒ³ãƒ‰ãƒ©ã‚’復元ã§ãã¾ã›ã‚“"
-#: src/exec_pty.c:1615
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "監視プロセスã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, c-format
msgid "error in %s, line %d while loading plugin \"%s\""
msgstr "%s, %d 行目 プラグイン \"%s\" をロード中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: src/load_plugins.c:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s ã®æ‰€æœ‰è€…㯠uid %d ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%s ã¯æ‰€æœ‰è€…ã®ã¿æ›¸ãè¾¼ã¿å¯èƒ½ã§ç„¡ã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "é‡è¤‡ã—ã¦ã„るプラグイン \"%s\" を無視ã—ã¾ã™ã€‚%s ã® %d 行目"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "%s をロードã§ãã¾ã›ã‚“: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "シンボル \"%s\" ㌠%s ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, c-format
msgid "incompatible plugin major version %d (expected %d) found in %s"
msgstr "互æ›æ€§ã®ç„¡ã„ãƒãƒªã‚·ãƒ¼ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d (予期ã•ã‚Œã‚‹ã®ã¯ %d)㌠%s ã§è¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
-#: src/load_plugins.c:317
+#: src/load_plugins.c:319
#, c-format
msgid "ignoring policy plugin \"%s\" in %s, line %d"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグイン \"%s\" を無視ã—ã¾ã™ã€‚%s ã® %d 行目"
-#: src/load_plugins.c:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "1ã¤ã®ãƒãƒªã‚·ãƒ¼ãƒ—ラグインã®ã¿æŒ‡å®šã§ãã¾ã™"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "ä¸æ˜Žãªãƒ—ラグインタイプ %d ㌠%s ã§è¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, c-format
msgid "policy plugin %s does not include a check_policy method"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグイン %s ã«ã¯ check_policy メソッドãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“"
-#: src/net_ifs.c:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "内部エラー〠%s ãŒã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒ­ãƒ¼ã—ã¾ã—ãŸ"
-
-#: src/parse_args.c:234
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "無効ãªç’°å¢ƒå¤‰æ•°åã§ã™: %s"
-#: src/parse_args.c:337
+#: src/parse_args.c:317
msgid "the argument to -C must be a number greater than or equal to 3"
msgstr "-C ã®å¼•æ•°ã¯ 3 以上ã®æ•°å€¤ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
-#: src/parse_args.c:568
+#: src/parse_args.c:554
msgid "you may not specify both the -i and -s options"
msgstr "-i 㨠-s オプションをåŒæ™‚ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
-#: src/parse_args.c:573
+#: src/parse_args.c:559
msgid "you may not specify both the -i and -E options"
msgstr "-i 㨠-E オプションをåŒæ™‚ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
-#: src/parse_args.c:583
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "-E オプションã¯ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã§ã¯ç„¡åŠ¹ã§ã™"
-#: src/parse_args.c:586
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr "編集モードã§ã¯ç’°å¢ƒå¤‰æ•°ã‚’指定ã§ãã¾ã›ã‚“"
-#: src/parse_args.c:596
+#: src/parse_args.c:582
msgid "the -U option may only be used with the -l option"
msgstr "-U オプションを使ã†ã«ã¯ -l オプションも必è¦ã§ã™"
-#: src/parse_args.c:600
+#: src/parse_args.c:586
msgid "the -A and -S options may not be used together"
msgstr "-A 㨠-S オプションã¯åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“"
-#: src/parse_args.c:693
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "sudoedit ã¯ã“ã®ãƒ—ラットフォームã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: src/parse_args.c:776
+#: src/parse_args.c:767
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:792
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "-K, -k ã¾ãŸã¯ -N ã®ã†ã¡ä¸€ã¤ã®ã¿æŒ‡å®šã§ãã¾ã™"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -518,7 +605,7 @@ msgstr ""
"%s - 別ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’編集ã—ã¾ã™\n"
"\n"
-#: src/parse_args.c:794
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -527,7 +614,7 @@ msgstr ""
"%s - 別ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¾ã™\n"
"\n"
-#: src/parse_args.c:800
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -535,131 +622,131 @@ msgstr ""
"\n"
"オプション:\n"
-#: src/parse_args.c:802
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "パスワードè¦æ±‚ã®ãŸã‚ã«è£œåŠ©ãƒ—ログラムを使用ã™ã‚‹"
-#: src/parse_args.c:805
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "指定ã—㟠BSD èªè¨¼ã‚¿ã‚¤ãƒ—を使用ã™ã‚‹"
-#: src/parse_args.c:809
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "コマンドをãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã™ã‚‹"
-#: src/parse_args.c:812
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "プロンプトã¨åŒæ™‚ã«ãƒ™ãƒ«ã‚’鳴らã™"
-#: src/parse_args.c:814
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "num 以上ã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã‚’é–‰ã˜ã‚‹"
-#: src/parse_args.c:817
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "指定ã—㟠BSD ログインクラスã§ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹"
-#: src/parse_args.c:820
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "コマンド実行å‰ã«ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’変更ã™ã‚‹"
-#: src/parse_args.c:823
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "コマンドを実行ã™ã‚‹æ™‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ç’°å¢ƒå¤‰æ•°ã‚’維æŒã™ã‚‹"
-#: src/parse_args.c:825
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "指定ã®ç’°å¢ƒå¤‰æ•°ã‚’維æŒã™ã‚‹"
-#: src/parse_args.c:827
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "コマンドを実行ã™ã‚‹ã®ã§ã¯ãªãファイルを編集ã™ã‚‹"
-#: src/parse_args.c:830
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "指定ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—åã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—IDã§ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹"
-#: src/parse_args.c:833
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "HOME 変数を変更先ã¨ãªã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¨­å®šã™ã‚‹"
-#: src/parse_args.c:836
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了ã™ã‚‹"
-#: src/parse_args.c:838
+#: src/parse_args.c:842
msgid "run command on host (if supported by plugin)"
msgstr "host ã§ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹(プラグインãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹å ´åˆ)"
-#: src/parse_args.c:841
+#: src/parse_args.c:845
msgid "run login shell as the target user; a command may also be specified"
msgstr "変更先ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ãƒ­ã‚°ã‚¤ãƒ³ã‚·ã‚§ãƒ«ã‚’実行ã™ã‚‹; コマンドを指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™"
-#: src/parse_args.c:843
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "タイムスタンプファイルを完全ã«å‰Šé™¤ã™ã‚‹"
-#: src/parse_args.c:846
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "無効ãªã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ファイルã§ã™"
-#: src/parse_args.c:849
+#: src/parse_args.c:853
msgid "list user's privileges or check a specific command; use twice for longer format"
msgstr "ユーザーã®æ¨©é™ã‚’一覧表示ã™ã‚‹ã¾ãŸã¯æŒ‡å®šã—ãŸã‚³ãƒžãƒ³ãƒ‰ã«ã¤ã„ã¦ç¢ºèªã™ã‚‹ ;é•·ã„表示ã«ã™ã‚‹ã«ã¯2回指定ã™ã‚‹ã“ã¨"
-#: src/parse_args.c:852
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "éžå¯¾è©±ãƒ¢ãƒ¼ãƒ‰ã§å®Ÿè¡Œã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«å…¥åŠ›ã‚’求ã‚ãªã„"
-#: src/parse_args.c:855
+#: src/parse_args.c:859
msgid "preserve group vector instead of setting to target's"
msgstr "グループベクトルをä¿è­·ã™ã‚‹ (変更先ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã‚‚ã®ã«è¨­å®šã—ãªã„)"
-#: src/parse_args.c:858
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "指定ã—ãŸãƒ‘スワードプロンプトを使用ã™ã‚‹"
-#: src/parse_args.c:860
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "コマンド実行å‰ã«ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’変更ã™ã‚‹"
-#: src/parse_args.c:863
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "指定ã—ãŸå½¹å‰²ã§ SELinux セキュリティーコンテキストを作æˆã™ã‚‹"
-#: src/parse_args.c:866
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "標準入力ã‹ã‚‰ãƒ‘スワードを読ã¿è¾¼ã‚€"
-#: src/parse_args.c:869
+#: src/parse_args.c:873
msgid "run shell as the target user; a command may also be specified"
msgstr "変更先ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ã‚·ã‚§ãƒ«ã‚’実行ã™ã‚‹; コマンドを指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™"
-#: src/parse_args.c:873
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "指定ã—ãŸã‚¿ã‚¤ãƒ—㧠SELinux セキュリティーコンテキストを作æˆã™ã‚‹"
-#: src/parse_args.c:876
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "指定ã—ãŸåˆ¶é™æ™‚é–“ã§ã‚³ãƒžãƒ³ãƒ‰ã®å®Ÿè¡Œã‚’中止ã™ã‚‹"
-#: src/parse_args.c:879
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "リストモードã§ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ¨©é™ã‚’表示ã™ã‚‹"
-#: src/parse_args.c:882
+#: src/parse_args.c:886
msgid "run command (or edit file) as specified user name or ID"
msgstr "指定ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼åã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã§ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ (ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’編集ã™ã‚‹)"
-#: src/parse_args.c:884
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了ã™ã‚‹"
-#: src/parse_args.c:887
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr "コマンドを実行ã›ãšã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã‚’æ›´æ–°ã™ã‚‹"
-#: src/parse_args.c:890
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "コマンドライン引数ã®å‡¦ç†ã‚’終了ã™ã‚‹"
@@ -759,37 +846,42 @@ msgstr "実行コンテキストを %s ã«è¨­å®šã§ãã¾ã›ã‚“"
msgid "unable to set key creation context to %s"
msgstr "キー作æˆã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’ %s ã¸è¨­å®šã§ãã¾ã›ã‚“"
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "最低ã§ã‚‚一ã¤ä»¥ä¸ŠãŠã®å¼•æ•°ãŒå¿…è¦ã§ã™"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "-c ã¾ãŸã¯ -i ã®ã†ã¡ä¸€ã¤ã®ã¿æŒ‡å®šã§ãã¾ã™"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "無効ãªãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã®ç•ªå·: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
+#, c-format
+msgid "The -%c option may not be used in edit mode."
+msgstr "-%c オプションã¯ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã§ã¯ç„¡åŠ¹ã§ã™ã€‚"
+
+#: src/sesh.c:184 src/sesh.c:189
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "%s をログインシェルã¨ã—ã¦å®Ÿè¡Œã§ãã¾ã›ã‚“"
+msgid "The -%c option may only be used in edit mode."
+msgstr "-%c オプションã¯ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿æœ‰åŠ¹ã§ã™ã€‚"
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: シンボリックリンクã®ç·¨é›†ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, c-format
msgid "%s: editing files in a writable directory is not permitted"
msgstr "%s: 書ãè¾¼ã¿å¯èƒ½ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ç·¨é›†ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-#: src/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "編集セッションã®å†…容㌠%s 内ã«æ®‹ã£ã¦ã„ã¾ã™"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "グループリストをå–å¾—ã§ãã¾ã›ã‚“"
@@ -873,118 +965,122 @@ msgstr "ã‚ãªãŸã¯ %s データベースã«å­˜åœ¨ã—ã¾ã›ã‚“"
msgid "unable to determine tty"
msgstr "tty を特定ã§ãã¾ã›ã‚“"
-#: src/sudo.c:908
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "権é™å¤‰æ›´ä¸å¯ãƒ•ãƒ©ã‚°ãŒã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ã¦ã€sudo ã‚’ root ã¨ã—ã¦å®Ÿè¡Œã§ãã¾ã›ã‚“。"
-#: src/sudo.c:910
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "sudo をコンテナーã§å®Ÿè¡Œã—ã¦ã„ã‚‹ãªã‚‰ã€ã‚³ãƒ³ãƒ†ãƒŠãƒ¼ã®æ§‹æˆã§ãƒ•ãƒ©ã‚°ã‚’無効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。"
-#: src/sudo.c:944
+#: src/sudo.c:954
#, c-format
msgid "%s must be owned by uid %d and have the setuid bit set"
msgstr "%s ã¯æ‰€æœ‰è€…㌠uid %d ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã€ã‹ã¤ setuid ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-#: src/sudo.c:947
+#: src/sudo.c:957
#, 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:953
+#: src/sudo.c:963
#, c-format
msgid "effective uid is not %d, is sudo installed setuid root?"
msgstr "実効 uid ㌠%d ã§ã¯ã‚ã‚Šã¾ã›ã‚“ã€sudo 㯠setuid root を設定ã—ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ"
-#: src/sudo.c:969 src/tgetpass.c:333
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "追加ã®ã‚°ãƒ«ãƒ¼ãƒ—IDを設定ã§ãã¾ã›ã‚“"
-#: src/sudo.c:976
+#: src/sudo.c:986
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr "実行時ã®ã‚°ãƒ«ãƒ¼ãƒ—ID (gid) %u を実効グループIDã«è¨­å®šã§ãã¾ã›ã‚“"
-#: src/sudo.c:982
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "実行時ã®ã‚°ãƒ«ãƒ¼ãƒ—ID (gid) %u をグループIDã«è¨­å®šã§ãã¾ã›ã‚“"
-#: src/sudo.c:1025
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "セキュリティーãƒãƒªã‚·ãƒ¼ã«ã‚ˆã‚Š argv ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "セキュリティーãƒãƒªã‚·ãƒ¼ã«ã‚ˆã‚Š envp ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "予期ã—ãªã„å­ãƒ—ロセスã®çµ‚了コードã§ã™: %d"
-#: src/sudo.c:1132
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグインをåˆæœŸåŒ–ã§ãã¾ã›ã‚“"
-#: src/sudo.c:1194
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグイン %s ã«ã¯ check_policy メソッドãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“"
-#: src/sudo.c:1240
+#: src/sudo.c:1269
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグイン %s ã¯æ¨©é™ã®ä¸€è¦§è¡¨ç¤ºã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
-#: src/sudo.c:1284
+#: src/sudo.c:1313
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグイン %s 㯠-v オプションをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“"
-#: src/sudo.c:1322
+#: src/sudo.c:1351
#, c-format
msgid "policy plugin %s does not support the -k/-K options"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ラグイン %s 㯠-k/-K オプションをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“"
-#: src/sudo.c:1451
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "I/O プラグイン %s ã‚’åˆæœŸåŒ–中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: src/sudo.c:1454
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "I/O プラグインをåˆæœŸåŒ–中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: src/sudo.c:1603
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "èªè¨¼ãƒ—ラグイン %s ã‚’åˆæœŸåŒ–中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: src/sudo.c:1682
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: ログã«ã‚¨ãƒ©ãƒ¼ã‚¤ãƒ™ãƒ³ãƒˆã‚’書ã込むã“ã¨ãŒã§ãã¾ã›ã‚“%s%s"
-#: src/sudo.c:1718
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: ログ㫠accept イベントを書ã込むã“ã¨ãŒã§ãã¾ã›ã‚“%s%s"
-#: src/sudo.c:1723 src/sudo.c:1761
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "èªè¨¼ãƒ—ラグインエラー"
-#: src/sudo.c:1756
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: ログ㫠reject イベントを書ã込むã“ã¨ãŒã§ãã¾ã›ã‚“%s%s"
-#: src/sudo.c:1816
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "承èªãƒ—ラグイン %s ã‚’åˆæœŸåŒ–中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: src/sudo.c:1886
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "承èªè€…ã«ã‚ˆã‚Šã‚³ãƒžãƒ³ãƒ‰ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"
-#: src/sudo.c:1896
-msgid "approval plugin error"
-msgstr "承èªãƒ—ラグイン エラー"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "書ãè¾¼ã¿å¯èƒ½ãªä¸€æ™‚ディレクトリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
@@ -994,7 +1090,7 @@ msgstr "書ãè¾¼ã¿å¯èƒ½ãªä¸€æ™‚ディレクトリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "%s left unmodified"
msgstr "%s を修正ã—ãªã„ã¾ã¾ã«ã—ã¾ã™"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s を変更ã—ã¾ã›ã‚“"
@@ -1007,37 +1103,37 @@ msgstr "sesh: 内部エラー: パスã®æ•°ãŒãŠã‹ã—ã„ã§ã™"
msgid "sesh: unable to create temporary files"
msgstr "sesh: 一時ファイルを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: シグナルã«ã‚ˆã‚Š kill ã•ã‚Œã¾ã—ãŸ"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ %d"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
msgid "unable to copy temporary files back to their original location"
msgstr "一時ファイルを元ã®å ´æ‰€ã«æˆ»ã™ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/sudo_edit.c:606
+#: src/sudo_edit.c:601
msgid "unable to copy some of the temporary files back to their original location"
msgstr "一時ファイルã®ã„ãã¤ã‹ã‚’å…ƒã®å ´æ‰€ã«æˆ»ã™ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/sudo_edit.c:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "ユーザーID (uid) ã‚’ root (%u) ã«å¤‰æ›´ã§ãã¾ã›ã‚“"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "プラグインエラー: sudoedit 用ã®ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ãŒã‚ã‚Šã¾ã›ã‚“"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "時刻を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "å‚å—ãƒãƒ¼ãƒˆãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
@@ -1061,17 +1157,17 @@ msgstr "パスワードを読ã¿å–ã‚‹ãŸã‚ã«ç«¯æœ«ãŒå¿…è¦ã§ã™ã€‚ -S オãƒ
msgid "no askpass program specified, try setting SUDO_ASKPASS"
msgstr "パスワードを尋ã­ã‚‹ (askpass) プログラムãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 SUDO_ASKPASS を設定ã—ã€ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„"
-#: src/tgetpass.c:328
+#: src/tgetpass.c:326
#, c-format
msgid "unable to set gid to %u"
msgstr "グループIDã‚’ %u ã«è¨­å®šã§ãã¾ã›ã‚“"
-#: src/tgetpass.c:338
+#: src/tgetpass.c:336
#, c-format
msgid "unable to set uid to %u"
msgstr "ユーザーIDã‚’ %u ã«è¨­å®šã§ãã¾ã›ã‚“"
-#: src/tgetpass.c:343
+#: src/tgetpass.c:341
#, c-format
msgid "unable to run %s"
msgstr "%s を実行ã§ãã¾ã›ã‚“"
@@ -1088,6 +1184,18 @@ msgstr "標準入力㸠dup2 を実行ã§ãã¾ã›ã‚“"
msgid "unable to restore stdin"
msgstr "標準入力を復元ã§ãã¾ã›ã‚“"
+#~ msgid "insufficient space for execve arguments"
+#~ msgstr "execve ã®å¼•æ•°ã®ãŸã‚ã®ã‚¹ãƒšãƒ¼ã‚¹ãŒè¶³ã‚Šã¾ã›ã‚“"
+
+#~ msgid "unable to read execve %s for process %d"
+#~ msgstr "execve ã® %s を読ã¿å–ã‚Œã¾ã›ã‚“(プロセス %d)"
+
+#~ msgid "requires at least one argument"
+#~ msgstr "最低ã§ã‚‚一ã¤ä»¥ä¸ŠãŠã®å¼•æ•°ãŒå¿…è¦ã§ã™"
+
+#~ msgid "unable to run %s as a login shell"
+#~ msgstr "%s をログインシェルã¨ã—ã¦å®Ÿè¡Œã§ãã¾ã›ã‚“"
+
#~ msgid "unable to dup intercept fd"
#~ msgstr "å‚å—fdã® dup を実行ã§ãã¾ã›ã‚“"
diff --git a/po/ka.mo b/po/ka.mo
index 8b7ba0fd9..d88c22169 100644
--- a/po/ka.mo
+++ b/po/ka.mo
Binary files differ
diff --git a/po/ka.po b/po/ka.po
index 2a021deb2..d48f5e949 100644
--- a/po/ka.po
+++ b/po/ka.po
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.10b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-02-12 09:31-0700\n"
-"PO-Revision-Date: 2022-04-27 15:21+0200\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-17 09:43+0200\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <(nothing)>\n"
"Language: ka\n"
@@ -15,8 +15,8 @@ msgstr ""
"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: Poedit 3.0.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
#: lib/util/aix.c:89 lib/util/aix.c:169
msgid "unable to open userdb"
@@ -32,75 +32,75 @@ msgid "unable to restore registry"
msgstr "რეესტრის áƒáƒ¦áƒ“გენის შედáƒáƒ›áƒ"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:206 src/exec_monitor.c:456
-#: src/exec_monitor.c:462 src/exec_monitor.c:470 src/exec_monitor.c:478
-#: src/exec_monitor.c:485 src/exec_monitor.c:492 src/exec_monitor.c:499
-#: src/exec_monitor.c:506 src/exec_monitor.c:513 src/exec_monitor.c:520
-#: src/exec_monitor.c:527 src/exec_nopty.c:219 src/exec_nopty.c:228
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:306 src/exec_nopty.c:503
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_pty.c:840
-#: src/exec_pty.c:849 src/exec_pty.c:906 src/exec_pty.c:1059
-#: src/exec_pty.c:1231 src/exec_pty.c:1240 src/exec_pty.c:1247
-#: src/exec_pty.c:1254 src/exec_pty.c:1261 src/exec_pty.c:1268
-#: src/exec_pty.c:1275 src/exec_pty.c:1282 src/exec_pty.c:1289
-#: src/exec_pty.c:1296 src/exec_pty.c:1303 src/exec_pty.c:1311
-#: src/exec_pty.c:1774 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:192 src/parse_args.c:213 src/parse_args.c:287
-#: src/parse_args.c:632 src/parse_args.c:654 src/parse_args.c:679
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:483 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:709 src/sudo.c:719 src/sudo.c:744 src/sudo.c:767
-#: src/sudo.c:776 src/sudo.c:785 src/sudo.c:802 src/sudo.c:844 src/sudo.c:854
-#: src/sudo.c:883 src/sudo.c:1083 src/sudo.c:1104 src/sudo.c:1397
-#: src/sudo.c:1566 src/sudo.c:1793 src/sudo.c:2127 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:100
-#: src/exec_intercept.c:330 src/exec_intercept.c:354 src/exec_intercept.c:377
-#: src/exec_intercept.c:385 src/exec_intercept.c:410 src/exec_intercept.c:416
-#: src/exec_intercept.c:425 src/exec_intercept.c:431 src/exec_intercept.c:565
-#: src/exec_intercept.c:706 src/exec_monitor.c:456 src/exec_monitor.c:462
-#: src/exec_monitor.c:470 src/exec_monitor.c:478 src/exec_monitor.c:485
-#: src/exec_monitor.c:492 src/exec_monitor.c:499 src/exec_monitor.c:506
-#: src/exec_monitor.c:513 src/exec_monitor.c:520 src/exec_monitor.c:527
-#: src/exec_nopty.c:219 src/exec_nopty.c:228 src/exec_nopty.c:235
-#: src/exec_nopty.c:242 src/exec_nopty.c:249 src/exec_nopty.c:256
-#: src/exec_nopty.c:263 src/exec_nopty.c:270 src/exec_nopty.c:277
-#: src/exec_nopty.c:284 src/exec_nopty.c:291 src/exec_nopty.c:298
-#: src/exec_nopty.c:306 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_pty.c:840 src/exec_pty.c:849 src/exec_pty.c:906
-#: src/exec_pty.c:1231 src/exec_pty.c:1240 src/exec_pty.c:1247
-#: src/exec_pty.c:1254 src/exec_pty.c:1261 src/exec_pty.c:1268
-#: src/exec_pty.c:1275 src/exec_pty.c:1282 src/exec_pty.c:1289
-#: src/exec_pty.c:1296 src/exec_pty.c:1303 src/exec_pty.c:1311
-#: src/exec_pty.c:1774 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:192 src/parse_args.c:214 src/parse_args.c:287
-#: src/parse_args.c:632 src/parse_args.c:654 src/parse_args.c:679
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:483 src/sesh.c:113
-#: src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:883 src/sudo.c:1083
-#: src/sudo.c:1104 src/sudo.c:1397 src/sudo.c:1566 src/sudo.c:1793
-#: src/sudo.c:2127 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
-#: src/sudo_edit.c:438 src/sudo_edit.c:539 src/sudo_edit.c:546
-#: src/sudo_edit.c:677 src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "მეხსიერების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
@@ -114,23 +114,23 @@ msgstr "%.*s-ის áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ áƒáƒ (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "%s-ის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "%.*s-ის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "%.*s-ის mkdir-ის შეცდáƒáƒ›áƒ"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "%.*s-ის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
@@ -139,8 +139,8 @@ msgstr "რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრძá
msgid "Unknown signal"
msgstr "უცნáƒáƒ‘ი სიგნáƒáƒšáƒ˜"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ"
@@ -152,77 +152,86 @@ msgstr "მნიშვნელáƒáƒ‘რძáƒáƒšáƒ˜áƒáƒœ გრძელიá
msgid "value too small"
msgstr "მნიშვნელáƒáƒ‘რძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, c-format
msgid "invalid Path value \"%s\" in %s, line %u"
msgstr "ბილიკის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი (\"%s\") %s-ში, %u ხáƒáƒ–ზე"
-#: lib/util/sudo_conf.c:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, c-format
msgid "invalid value for %s \"%s\" in %s, line %u"
msgstr "%s -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\", %s-ში, %u-ე ხáƒáƒ–ზე"
-#: lib/util/sudo_conf.c:440
+#: lib/util/sudo_conf.c:441
#, c-format
msgid "unsupported group source \"%s\" in %s, line %u"
msgstr "ჯგუფის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი წყáƒáƒ áƒ \"%s\" %s-ში, %u-ე ხáƒáƒ–ზე"
-#: lib/util/sudo_conf.c:456
+#: lib/util/sudo_conf.c:457
#, c-format
msgid "invalid max groups \"%s\" in %s, line %u"
msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ¥áƒ¡. ჯგუფები \"%s\" %s-ში, %u-ე ხáƒáƒ–ზე"
-#: lib/util/sudo_conf.c:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "%s-ის áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s: áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს ჩვეულებრივ ფáƒáƒ˜áƒšáƒ¡"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s-ის მფლáƒáƒ‘ლის UID-ირ%u. უნდრიყáƒáƒ¡ %u"
-#: lib/util/sudo_conf.c:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s ყველáƒáƒ¡ მიერ ჩáƒáƒ¬áƒ”რáƒáƒ“იáƒ"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s ჯგუფის მიერ ჩáƒáƒ¬áƒ”რáƒáƒ“იáƒ"
-#: src/copy_file.c:93
+#: src/apparmor.c:85
+msgid "failed to determine AppArmor confinement"
+msgstr "შეცდáƒáƒ›áƒ AppArmor-ის ჩáƒáƒ™áƒ”ტილáƒáƒ‘ის დáƒáƒ“გენისáƒáƒ¡"
+
+#: src/apparmor.c:93
+#, c-format
+msgid "unable to change AppArmor profile to %s"
+msgstr "შეცდáƒáƒ›áƒ AppArmor-ის პრáƒáƒ¤áƒ˜áƒšáƒ˜áƒ¡ %s -ზე შეცვლისáƒáƒ¡"
+
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: შევკვეცრ%s ნულ ბáƒáƒ˜áƒ¢áƒáƒ›áƒ“ე? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "áƒáƒ  გáƒáƒ“áƒáƒ•áƒáƒ¬áƒ”რ %s-ს"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "%s-დáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "%s-ში ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "%s-ის áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს ჩვეულებრივ ფáƒáƒ˜áƒšáƒ¡"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეჟიმი: 0%o"
@@ -231,99 +240,144 @@ msgstr "%s: ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეჟიმი: 0%o"
msgid "unable to restore current working directory"
msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ›áƒ£áƒ¨áƒáƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის áƒáƒ¦áƒ“გენრშეუძლებელიáƒ"
-#: src/exec.c:130
+#: src/exec.c:111
+msgid "unable to set privileges"
+msgstr "პრივილეგიების დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
+
+#: src/exec.c:117 src/exec.c:122
+msgid "unable to set limit privileges"
+msgstr "შეზღუდული პრივილეგიების დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
+
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "შესვლის უცნáƒáƒ‘ი კლáƒáƒ¡áƒ˜: %s"
-#: src/exec.c:142
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის კáƒáƒœáƒ¢áƒ”ქსტის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/exec.c:158
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "პრáƒáƒªáƒ”სის პრიáƒáƒ áƒ˜áƒ¢áƒ”ტის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/exec.c:175
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "root სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე გáƒáƒ“áƒáƒ áƒ—ვის"
-#: src/exec.c:188 src/exec.c:194 src/exec.c:201
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "გáƒáƒ›áƒ¨áƒ•áƒ”ბ UID-ზე (%u, %u) გáƒáƒ“áƒáƒ áƒ—ვის შეცდáƒáƒ›áƒ"
-#: src/exec.c:219
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შეცვლის შეცდáƒáƒ›áƒ: %s"
-#: src/exec.c:223
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "%s-დáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბული"
-#: src/exec.c:305 src/exec_monitor.c:565 src/exec_monitor.c:567
-#: src/exec_nopty.c:561 src/exec_pty.c:581 src/exec_pty.c:1411
-#: src/exec_pty.c:1413 src/signal.c:144 src/signal.c:151 src/signal.c:165
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "სიგნáƒáƒ’ლისთვის (%d) სáƒáƒ®áƒ”ლურის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
+#: src/exec.c:422
+msgid "intercept mode is not supported with SELinux RBAC on this system"
+msgstr "áƒáƒ› სისტემáƒáƒ–ე SELinux RBAC-ის გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ გáƒáƒ“áƒáƒ­áƒ”რის რეჟიმი მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ"
+
+#: src/exec.c:427
+msgid "unable to log sub-commands with SELinux RBAC on this system"
+msgstr "áƒáƒ› სისტემáƒáƒ–ე SELinux RBAC-თáƒáƒœ ერთáƒáƒ“ ქვებრძáƒáƒœáƒ”ბების ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ"
+
#: src/exec_common.c:56
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "pRIV_LIMIT-დáƒáƒœ PRIV_PROC_EXEC-ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: src/exec_intercept.c:112 src/exec_intercept.c:116 src/exec_intercept.c:667
-#: src/exec_intercept.c:671 src/exec_intercept.c:857 src/exec_intercept.c:861
-#: src/exec_intercept.c:872 src/exec_intercept.c:876 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:221 src/exec_nopty.c:230 src/exec_nopty.c:237
-#: src/exec_nopty.c:244 src/exec_nopty.c:251 src/exec_nopty.c:258
-#: src/exec_nopty.c:265 src/exec_nopty.c:272 src/exec_nopty.c:279
-#: src/exec_nopty.c:286 src/exec_nopty.c:293 src/exec_nopty.c:300
-#: src/exec_nopty.c:308 src/exec_pty.c:706 src/exec_pty.c:711
-#: src/exec_pty.c:808 src/exec_pty.c:815 src/exec_pty.c:912
-#: src/exec_pty.c:1233 src/exec_pty.c:1242 src/exec_pty.c:1249
-#: src/exec_pty.c:1256 src/exec_pty.c:1263 src/exec_pty.c:1270
-#: src/exec_pty.c:1277 src/exec_pty.c:1284 src/exec_pty.c:1291
-#: src/exec_pty.c:1298 src/exec_pty.c:1305 src/exec_pty.c:1727
-#: src/exec_pty.c:1737 src/exec_pty.c:1782 src/exec_pty.c:1789
-#: src/exec_pty.c:1816
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "რიგში მáƒáƒ•áƒšáƒ”ნის ჩáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ"
-#: src/exec_intercept.c:314
-msgid "invalid PolicyCheckRequest"
-msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PolicyCheckRequest"
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒšáƒ˜áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მიერ ბრძáƒáƒœáƒ”ბრდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ"
-#: src/exec_intercept.c:362 src/sudo.c:1209 src/sudo.c:1254 src/sudo.c:1298
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "ბრძáƒáƒœáƒ”ბრუáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ წესის მიერ"
-#: src/exec_intercept.c:455 src/sudo.c:1214 src/sudo.c:1259 src/sudo.c:1303
-#: src/sudo.c:1377
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "ნებáƒáƒ“áƒáƒ›áƒ áƒ—ველი დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "წესის დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ"
-#: src/exec_intercept.c:561
+#: src/exec_intercept.c:543
+msgid "invalid PolicyCheckRequest"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PolicyCheckRequest"
+
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "კლიენტის მáƒáƒ—ხáƒáƒ•áƒœáƒ ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ: %zu"
-#: src/exec_intercept.c:659
+#: src/exec_intercept.c:720
+#, c-format
+msgid "unable to unpack %s size %zu"
+msgstr "შეცდáƒáƒ›áƒ %s -ის გáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡ ზáƒáƒ›áƒ %zu"
+
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "type_case-ის მáƒáƒ£áƒšáƒáƒ“ნელი მნიშვნელáƒáƒ‘რ%d %s-ში %s-დáƒáƒœ"
-#: src/exec_intercept.c:694
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "სერვერის შეტყáƒáƒ‘ინებრძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ: %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "I/O დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "ბრძáƒáƒœáƒ”ბრუáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ I/O დáƒáƒ›áƒáƒ¢áƒ”ბის მიერ"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეჩერებრშეუძლებელიáƒ"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ შეცვლრშეუძლებელიáƒ"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "socketpair-დáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ"
@@ -333,180 +387,213 @@ msgstr "socketpair-დáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ"
msgid "unexpected reply type on backchannel: %d"
msgstr "blackchannel-ის პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი ტიპი: %d"
-#: src/exec_monitor.c:583
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ tty-ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/exec_monitor.c:591 src/exec_nopty.c:369 src/exec_pty.c:1490
-#: src/exec_pty.c:1511 src/exec_pty.c:1531 src/tgetpass.c:307
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "ფáƒáƒ˜áƒ¤áƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ"
-#: src/exec_monitor.c:601
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "მშáƒáƒ‘ლისგáƒáƒœ შეტყáƒáƒ‘ინების მიღების შეცდáƒáƒ›áƒ"
-#: src/exec_monitor.c:617 src/exec_nopty.c:407 src/exec_pty.c:1569
-#: src/sudo_edit.c:361 src/tgetpass.c:311
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
+#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "პრáƒáƒªáƒ”სის გáƒáƒœáƒ¢áƒáƒ¢áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: src/exec_monitor.c:621 src/exec_monitor.c:722 src/exec_nopty.c:471
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "tty-ის ჭდის áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ"
-#: src/exec_monitor.c:637 src/sesh.c:123 src/sudo.c:1160
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "%s-ის გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
-#: src/exec_nopty.c:363 src/exec_pty.c:1420
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "წესების დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ სესიის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡"
-#: src/exec_nopty.c:377 src/exec_pty.c:1391 src/exec_pty.c:1399
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "სáƒáƒ™áƒ”ტების შექმნის შეცდáƒáƒ›áƒ"
-#: src/exec_nopty.c:459 src/exec_pty.c:1666
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "მáƒáƒ•áƒšáƒ”ნების მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: src/exec_nopty.c:569 src/exec_pty.c:619 src/signal.c:101
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to restore handler for signal %d"
-msgstr "სიგნáƒáƒšáƒ˜áƒ¡áƒ—ვის სáƒáƒ®áƒ”ლურის áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ: %d"
+msgid "internal error, %s overflow"
+msgstr "შიდრშეცდáƒáƒ›áƒ: %s-ის გáƒáƒ“áƒáƒ•áƒ¡áƒ”ბáƒ"
-#: src/exec_pty.c:158
-msgid "unable to allocate pty"
-msgstr "pty-ის გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
+#, c-format
+msgid "unable to set registers for process %d"
+msgstr "პრáƒáƒªáƒ”სისთვის (%d) რეგისტრების დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
-#: src/exec_pty.c:222 src/exec_pty.c:262 src/exec_pty.c:302 src/exec_pty.c:353
-#: src/exec_pty.c:404
-msgid "I/O plugin error"
-msgstr "I/O დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ"
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
+#, c-format
+msgid "process %d exited unexpectedly"
+msgstr "პრáƒáƒªáƒ”სი %d მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
-#: src/exec_pty.c:226 src/exec_pty.c:266 src/exec_pty.c:306 src/exec_pty.c:357
-#: src/exec_pty.c:408
-msgid "command rejected by I/O plugin"
-msgstr "ბრძáƒáƒœáƒ”ბრუáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ I/O დáƒáƒ›áƒáƒ¢áƒ”ბის მიერ"
+#: src/exec_ptrace.c:1207
+msgid "unable to set seccomp filter"
+msgstr "seccomp ფილტრის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/exec_pty.c:455
-msgid "error logging suspend"
-msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეჩერებრშეუძლებელიáƒ"
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "ინტერპრეტáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ’უმენტი. მáƒáƒ•áƒ”ლáƒáƒ“ი \"%s\", მივიღე \"%s\""
-#: src/exec_pty.c:489
-msgid "error changing window size"
-msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ შეცვლრშეუძლებელიáƒ"
+#: src/exec_ptrace.c:1503
+#, c-format
+msgid "pathname mismatch, expected \"%s\", got \"%s\""
+msgstr "ბილიკი áƒáƒ  ემთხვევáƒ. მáƒáƒ•áƒ”ლáƒáƒ“ი \"%s\", მივიღე \"%s\""
+
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
+#, c-format
+msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
+msgstr "%s[%d] áƒáƒ  ემთხვევáƒ. მáƒáƒ•áƒ”ლáƒáƒ“ი \"%s\", მივიღე \"%s\""
+
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "პრáƒáƒªáƒ”სის %d მáƒáƒ£áƒšáƒáƒ“ნელი სტáƒáƒ¢áƒ£áƒ¡áƒ˜ 0x%x"
+
+#: src/exec_ptrace.c:1711
+#, c-format
+msgid "unable to get event message for process %d"
+msgstr "მáƒáƒ•áƒšáƒ”ნის შეტყáƒáƒ‘ინების მიღების შეცდáƒáƒ›áƒ პრáƒáƒªáƒ”სისთვის %d"
+
+#: src/exec_ptrace.c:1718
+#, c-format
+msgid "unable to get registers for process %d"
+msgstr "პრáƒáƒªáƒ”სისთვის (%d) რეგისტრების მიღებრშეუძლებელიáƒ"
+
+#: src/exec_pty.c:103
+msgid "unable to allocate pty"
+msgstr "pty-ის გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
+#, c-format
+msgid "unable to restore handler for signal %d"
+msgstr "სიგნáƒáƒšáƒ˜áƒ¡áƒ—ვის სáƒáƒ®áƒ”ლურის áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ: %d"
-#: src/exec_pty.c:1615
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "მáƒáƒ§áƒ£áƒ áƒ”ბელი პრáƒáƒªáƒ”სისთვის შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, c-format
msgid "error in %s, line %d while loading plugin \"%s\""
msgstr "%s-ის შეცდáƒáƒ›áƒ %d ხáƒáƒ–ზე \"%s\"დáƒáƒ›áƒáƒ¢áƒ”ბის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡"
-#: src/load_plugins.c:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s-ის მფლáƒáƒ‘ლის UID %d უნდრიყáƒáƒ¡"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%s ჩáƒáƒ¬áƒ”რáƒáƒ“ი მხáƒáƒšáƒáƒ“ მფლáƒáƒ‘ლის მიერ უნდრიყáƒáƒ¡"
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "áƒáƒ áƒ¯áƒ”რ áƒáƒ¦áƒ¬áƒ”რილი დáƒáƒ›áƒáƒ¢áƒ”ბრ\"%s\", \"%s\"-ში, %d-ე ხáƒáƒ–ზე"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "%s-ის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეცდáƒáƒ›áƒ: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "სიმბáƒáƒšáƒ \"%s\"-ის %s-ში პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, c-format
msgid "incompatible plugin major version %d (expected %d) found in %s"
msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბის შეუთáƒáƒ•áƒ¡áƒ”ბელი ძირითáƒáƒ“ი ვერსიáƒ: %d (ველáƒáƒ“ებáƒáƒ“ით %d-ს), რáƒáƒ›áƒ”ლიც ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ %s-ში"
-#: src/load_plugins.c:317
+#: src/load_plugins.c:319
#, c-format
msgid "ignoring policy plugin \"%s\" in %s, line %d"
msgstr "წესებს დáƒáƒ›áƒáƒ¢áƒ”ბის (\"%s\") იგნáƒáƒ áƒ˜ %s-ში, %d-ე ხáƒáƒ–ზე"
-#: src/load_plugins.c:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "დáƒáƒ¨áƒ•áƒ”ბულირწესების მხáƒáƒšáƒáƒ“ ერთი დáƒáƒ›áƒáƒ¢áƒ”ბის მითითებáƒ"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბის ტიპი (%d) უცნáƒáƒ‘იáƒ. ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ %s-ში"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, c-format
msgid "policy plugin %s does not include a check_policy method"
msgstr "წესების დáƒáƒ›áƒáƒ¢áƒ”ბრ%s áƒáƒ  შეიცáƒáƒ•áƒ¡ check_policy მეთáƒáƒ“ს"
-#: src/net_ifs.c:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "შიდრშეცდáƒáƒ›áƒ: %s-ის გáƒáƒ“áƒáƒ•áƒ¡áƒ”ბáƒ"
-
-#: src/parse_args.c:234
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: %s"
-#: src/parse_args.c:337
+#: src/parse_args.c:317
msgid "the argument to -C must be a number greater than or equal to 3"
msgstr "-C -ის áƒáƒ áƒ’უმენტი რიცხვი უნდრიყáƒáƒ¡, 3 áƒáƒœ მეტი"
-#: src/parse_args.c:568
+#: src/parse_args.c:554
msgid "you may not specify both the -i and -s options"
msgstr "-i დრ-s პáƒáƒ áƒáƒ›áƒ”ტრების ერთáƒáƒ“ მითითებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ"
-#: src/parse_args.c:573
+#: src/parse_args.c:559
msgid "you may not specify both the -i and -E options"
msgstr "-i დრ-E პáƒáƒ áƒáƒ›áƒ”ტრების ერთáƒáƒ“ მითითებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ"
-#: src/parse_args.c:583
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბის რეჟიმში -E-ის მითითებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ"
-#: src/parse_args.c:586
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr "ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბის რეჟიმში გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ების მითითებრáƒáƒ  შეგიძლიáƒáƒ—"
-#: src/parse_args.c:596
+#: src/parse_args.c:582
msgid "the -U option may only be used with the -l option"
msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -U დრ-I შეუთáƒáƒ•áƒ¡áƒ”ბლებიáƒ"
-#: src/parse_args.c:600
+#: src/parse_args.c:586
msgid "the -A and -S options may not be used together"
msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -A დრ-S შეუთáƒáƒ•áƒ¡áƒ”ბლებიáƒ"
-#: src/parse_args.c:693
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე sudoedit-ი მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ"
-#: src/parse_args.c:776
+#: src/parse_args.c:767
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:792
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "-K, -k დრ-N -დáƒáƒœ მხáƒáƒšáƒáƒ“ ერთ ერთი პáƒáƒ áƒáƒ›áƒ”ტრის მითითებáƒáƒ შესáƒáƒ«áƒšáƒ”ბელი"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -515,146 +602,146 @@ msgstr ""
"%s - ფáƒáƒ˜áƒšáƒ”ბის სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ\n"
"\n"
-#: src/parse_args.c:794
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
"\n"
msgstr "%s - sსხვ\n"
-#: src/parse_args.c:800
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
msgstr ""
"\n"
-"პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები\n"
-#: src/parse_args.c:802
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ მáƒáƒ¡áƒáƒ—ხáƒáƒ•áƒœáƒáƒ“ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"
-#: src/parse_args.c:805
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "bsd áƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ ტიპის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"
-#: src/parse_args.c:809
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "ბრძáƒáƒœáƒ”ბის ფáƒáƒœáƒ£áƒ  რეჟიმში გáƒáƒ¨áƒ•áƒ”ბáƒ"
-#: src/parse_args.c:812
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ¡ ზáƒáƒ áƒ˜áƒ¡ დáƒáƒ áƒ”კვáƒ"
-#: src/parse_args.c:814
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "ყველრიმ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დესკრიპტáƒáƒ áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ, რáƒáƒ›áƒšáƒ˜áƒ¡ ნáƒáƒ›áƒ”რიც >= რიცხვზე"
-#: src/parse_args.c:817
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "ბრძáƒáƒœáƒ”ბის BSD-ის მითითებული კლáƒáƒ¡áƒ˜áƒ— გáƒáƒ¨áƒ•áƒ”ბáƒ"
-#: src/parse_args.c:820
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბáƒáƒ›áƒ“ე სáƒáƒ›áƒ£áƒ¨áƒáƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შეცვლáƒ"
-#: src/parse_args.c:823
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბისáƒáƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ áƒ”მáƒáƒ¡ შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბáƒ"
-#: src/parse_args.c:825
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "გáƒáƒ áƒ”მáƒáƒ¡ მითითებული ცვლáƒáƒ“ების შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბáƒ"
-#: src/parse_args.c:827
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბის მáƒáƒ’იერ ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ"
-#: src/parse_args.c:830
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "ბრძáƒáƒœáƒ”ბის მითითებული ჯგუფის სáƒáƒ®áƒ”ლით áƒáƒœ ID-ით გáƒáƒ¨áƒ•áƒ”ბáƒ"
-#: src/parse_args.c:833
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის HOME მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ¬áƒ§áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე დáƒáƒ§áƒ”ნებáƒ"
-#: src/parse_args.c:836
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ"
-#: src/parse_args.c:838
+#: src/parse_args.c:842
msgid "run command on host (if supported by plugin)"
msgstr "ჰáƒáƒ¡áƒ¢áƒ–ე ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბრ(თუ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირდáƒáƒ›áƒáƒ¢áƒ”ბის მიერ)"
-#: src/parse_args.c:841
+#: src/parse_args.c:845
msgid "run login shell as the target user; a command may also be specified"
msgstr "შესვლის გáƒáƒ áƒ¡áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით გáƒáƒ¨áƒ•áƒ”ბáƒ; áƒáƒ¡áƒ”ვე შეიძლებრმიეთითáƒáƒ¡ ბრძáƒáƒœáƒ”ბáƒáƒª"
-#: src/parse_args.c:843
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "timestamp ფáƒáƒ˜áƒšáƒ˜áƒ¡ სრულáƒáƒ“ წáƒáƒ¨áƒšáƒ"
-#: src/parse_args.c:846
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "timestamp ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒªáƒ®áƒáƒ“ებáƒ"
-#: src/parse_args.c:849
+#: src/parse_args.c:853
msgid "list user's privileges or check a specific command; use twice for longer format"
msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პრივილეგიების სიის áƒáƒœ მითითებული ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ; მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის მიუთითეთ áƒáƒ áƒ¯áƒ”რ"
-#: src/parse_args.c:852
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "áƒáƒ áƒáƒ˜áƒœáƒ¢áƒ”რáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ რეჟიმი. შეყვáƒáƒœáƒ მáƒáƒ—ხვნილი áƒáƒ  იქნებáƒ"
-#: src/parse_args.c:855
+#: src/parse_args.c:859
msgid "preserve group vector instead of setting to target's"
msgstr "სáƒáƒ›áƒ˜áƒ–ნის დáƒáƒ§áƒ”ნების მáƒáƒ’იერ ჯგუფის ვექტáƒáƒ áƒ˜áƒ¡ შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბáƒ"
-#: src/parse_args.c:858
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ მითითებული ტიპის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"
-#: src/parse_args.c:860
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბáƒáƒ›áƒ“ე root სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შეცვლáƒ"
-#: src/parse_args.c:863
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "მითითებული რáƒáƒšáƒ˜áƒ— SELinux-ის სáƒáƒ£áƒ¤áƒ áƒ—ხáƒáƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტის შექმნáƒ"
-#: src/parse_args.c:866
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ შეტáƒáƒœáƒ˜áƒ¡ მექáƒáƒœáƒ˜áƒ–მიდáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვáƒ"
-#: src/parse_args.c:869
+#: src/parse_args.c:873
msgid "run shell as the target user; a command may also be specified"
msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით გáƒáƒ¨áƒ•áƒ”ბáƒ; áƒáƒ¡áƒ”ვე შეიძლებრმიეთითáƒáƒ¡ ბრძáƒáƒœáƒ”ბáƒáƒª"
-#: src/parse_args.c:873
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "მითითებული ტიპის SELinux-ის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტის შექმნáƒ"
-#: src/parse_args.c:876
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "ბრძáƒáƒœáƒ”ბის შესრულების მითითებული დრáƒáƒ˜áƒ¡ შემდეგ შეწყვეტáƒ"
-#: src/parse_args.c:879
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "სიის რეჟიმის დრáƒáƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პრივილეგიების ჩვენებáƒ"
-#: src/parse_args.c:882
+#: src/parse_args.c:886
msgid "run command (or edit file) as specified user name or ID"
msgstr "ბრძáƒáƒœáƒ”ბის მითითებული სáƒáƒ®áƒ”ლით áƒáƒœ ID-ით გáƒáƒ¨áƒ•áƒ”ბრ(áƒáƒœ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ)"
-#: src/parse_args.c:884
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "ვერსიის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ"
-#: src/parse_args.c:887
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის timestamp-ის ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბის გáƒáƒ áƒ”შე გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ"
-#: src/parse_args.c:890
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ“áƒáƒœ ჩáƒáƒ¬áƒáƒ“ებული áƒáƒ áƒ’უმენტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეწყვეტáƒ"
@@ -754,37 +841,42 @@ msgstr "%s-ზე გáƒáƒ¨áƒ•áƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტის დáƒ
msgid "unable to set key creation context to %s"
msgstr "%s-ზე გáƒáƒ¡áƒáƒ¦áƒ”ბის შექმნის კáƒáƒœáƒ¢áƒ”ქსტის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ ერთი áƒáƒ áƒ’უმენტი მáƒáƒ˜áƒœáƒª"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "-c დრ-i -დáƒáƒœ მხáƒáƒšáƒáƒ“ ერთ ერთი პáƒáƒ áƒáƒ›áƒ”ტრის მითითებáƒáƒ შესáƒáƒ«áƒšáƒ”ბელი"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ დესკრიპტáƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
+#, c-format
+msgid "The -%c option may not be used in edit mode."
+msgstr "-%c პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ›áƒáƒ§áƒ”ნებრჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბის რეჟიმში შეუძლებელიáƒ."
+
+#: src/sesh.c:184 src/sesh.c:189
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "%s - სწáƒáƒ  შესვლის გáƒáƒ áƒ¡áƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს"
+msgid "The -%c option may only be used in edit mode."
+msgstr "-%c პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბის რეჟიმშირშესáƒáƒ«áƒšáƒ”ბელი."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: სიმბმულების ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრშეუძლებელიáƒ"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, c-format
msgid "%s: editing files in a writable directory is not permitted"
msgstr "%s: ჩáƒáƒ¬áƒ”რáƒáƒ“ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ"
-#: src/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბის სესიის ნáƒáƒ áƒ©áƒ”ნი შემცველáƒáƒ‘áƒ: %s"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "ჯგუფების სიის მიღების შეცდáƒáƒ›áƒ"
@@ -868,118 +960,122 @@ msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" თქვენ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘áƒ
msgid "unable to determine tty"
msgstr "tty-ის დáƒáƒ“გენრშეუძლებელიáƒ"
-#: src/sudo.c:908
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "დáƒáƒ§áƒ”ნებულირáƒáƒšáƒáƒ›áƒ˜ \"áƒáƒ®áƒáƒšáƒ˜ პრივილეგიების გáƒáƒ áƒ”შე\", რáƒáƒ›áƒ”ლიც sudo-ს სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ  áƒáƒ«áƒšáƒ”ვს, root-ით გáƒáƒ”შვáƒáƒ¡."
-#: src/sudo.c:910
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "თუ sudo კáƒáƒœáƒ¢áƒ”ინერში ეშვებáƒ, áƒáƒšáƒ›áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ—იშáƒáƒ“ შეიძლებრკáƒáƒœáƒ¢áƒ”ინერის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜ ცვლილებრდáƒáƒ’ჭირდეთ."
-#: src/sudo.c:944
+#: src/sudo.c:954
#, c-format
msgid "%s must be owned by uid %d and have the setuid bit set"
msgstr "%s-ის მფლáƒáƒ‘ელი UID %d უნდრიყáƒáƒ¡. áƒáƒ¡áƒ”ვე დáƒáƒ§áƒ”ნებული უნდრჰქáƒáƒœáƒ“ეს setuid ბიტი"
-#: src/sudo.c:947
+#: src/sudo.c:957
#, 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:953
+#: src/sudo.c:963
#, c-format
msgid "effective uid is not %d, is sudo installed setuid root?"
msgstr "მიმდინáƒáƒ áƒ” uid %d-ს áƒáƒ  უდრის. შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ, áƒáƒ¥áƒ•áƒ¡ sudo-ს setuid ბიტი მინიჭებული?"
-#: src/sudo.c:969 src/tgetpass.c:333
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "ჯგუფის დáƒáƒ›áƒáƒ¢áƒ”ბითი ID-ების დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/sudo.c:976
+#: src/sudo.c:986
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr "მიმდინáƒáƒ áƒ” gid-ის შესრულებáƒáƒ“ gid(%u)-áƒáƒ“ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/sudo.c:982
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "gid-ის შესრულებáƒáƒ“ gid(%u)-áƒáƒ“ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/sudo.c:1025
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒšáƒ˜áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მიერ argv დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒšáƒ˜áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მიერ envp დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "შვილეული პრáƒáƒªáƒ”სის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის მáƒáƒ£áƒšáƒáƒ“ნელი პირáƒáƒ‘áƒ: %d"
-#: src/sudo.c:1132
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "წესების დáƒáƒ›áƒáƒ¢áƒ”ბის ინიციáƒáƒªáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: src/sudo.c:1194
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "წესების დáƒáƒ›áƒáƒ¢áƒ”ბრ%s áƒáƒ  შეიცáƒáƒ•áƒ¡ check_policy მეთáƒáƒ“ს"
-#: src/sudo.c:1240
+#: src/sudo.c:1269
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr "წესების დáƒáƒ›áƒáƒ¢áƒ”ბრ%s-ს პრივილეგიების ჩáƒáƒ›áƒáƒ—ვლის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
-#: src/sudo.c:1284
+#: src/sudo.c:1313
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr "წესების დáƒáƒ›áƒáƒ¢áƒ”ბრ%s-ს -v პáƒáƒ áƒáƒ›áƒ”ტრის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
-#: src/sudo.c:1322
+#: src/sudo.c:1351
#, c-format
msgid "policy plugin %s does not support the -k/-K options"
msgstr "წესების დáƒáƒ›áƒáƒ¢áƒ”ბრ%s-ს -k/-K პáƒáƒ áƒáƒ›áƒ”ტრების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
-#: src/sudo.c:1451
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "i/o დáƒáƒ›áƒáƒ¢áƒ”ბის (%s) ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: src/sudo.c:1454
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "i/o დáƒáƒ›áƒáƒ¢áƒ”ბის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: src/sudo.c:1603
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "áƒáƒ£áƒ“იტის დáƒáƒ›áƒáƒ¢áƒ”ბის (%s) ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
-#: src/sudo.c:1682
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: ჟურნáƒáƒšáƒ¨áƒ˜ შეცდáƒáƒ›áƒ˜áƒ¡ მáƒáƒ•áƒšáƒ”ნის ჩáƒáƒ¡áƒ¬áƒ”რის შეცდáƒáƒ›áƒ (%s%s)"
-#: src/sudo.c:1718
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: ჟურნáƒáƒšáƒ¨áƒ˜ თáƒáƒœáƒ®áƒ›áƒáƒ‘ის მáƒáƒ•áƒšáƒ”ნის ჩáƒáƒ¡áƒ¬áƒ”რის შეცდáƒáƒ›áƒ (%s%s)"
-#: src/sudo.c:1723 src/sudo.c:1761
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "áƒáƒ£áƒ“იტის დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ"
-#: src/sudo.c:1756
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: ჟურნáƒáƒšáƒ¨áƒ˜ უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ¡ მáƒáƒ•áƒšáƒ”ნის ჩáƒáƒ¡áƒ¬áƒ”რის შეცდáƒáƒ›áƒ (%s%s)"
-#: src/sudo.c:1816
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "ნებáƒáƒ“áƒáƒ›áƒ áƒ—ველი დáƒáƒ›áƒáƒ¢áƒ”ბის (%s)"
-#: src/sudo.c:1886
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "ბრძáƒáƒœáƒ”ბრუáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ ნებáƒáƒ“áƒáƒ›áƒ áƒ—ველის მიერ"
-#: src/sudo.c:1896
-msgid "approval plugin error"
-msgstr "ნებáƒáƒ“áƒáƒ›áƒ áƒ—ველი დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "áƒáƒ áƒªáƒ”რთი დრáƒáƒ”ბითი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ჩáƒáƒ¬áƒ”რáƒáƒ“ი áƒáƒ áƒáƒ"
@@ -989,7 +1085,7 @@ msgstr "áƒáƒ áƒªáƒ”რთი დრáƒáƒ”ბითი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“á
msgid "%s left unmodified"
msgstr "%s áƒáƒ  შეცვლილáƒ"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s შეუცვლელიáƒ"
@@ -1002,37 +1098,37 @@ msgstr "sesh: შიდრშეცდáƒáƒ›áƒ: ბილიკების áƒ
msgid "sesh: unable to create temporary files"
msgstr "sesh: დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის შექმნის შეცდáƒáƒ›áƒ"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: გáƒáƒ áƒ“áƒáƒ˜áƒªáƒ•áƒáƒšáƒ სიგნáƒáƒšáƒ˜áƒ—"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: უცნáƒáƒ‘ი შეცდáƒáƒ›áƒ (%d)"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
msgid "unable to copy temporary files back to their original location"
msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის თáƒáƒ•áƒ˜áƒáƒœáƒ— პირველáƒáƒ“ მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ–ე კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ"
-#: src/sudo_edit.c:606
+#: src/sudo_edit.c:601
msgid "unable to copy some of the temporary files back to their original location"
msgstr "ზáƒáƒ’იერთი დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ პირველáƒáƒ“ მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ–ე კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ"
-#: src/sudo_edit.c:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "uid-ის root-ზე(%u) გáƒáƒ“áƒáƒ áƒ—ვის შეცდáƒáƒ›áƒ"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ: sudoedit-ს ფáƒáƒ˜áƒšáƒ”ბის სირესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "სáƒáƒáƒ—ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "გáƒáƒ“áƒáƒ­áƒ”რის პáƒáƒ áƒ¢áƒ˜ დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ"
@@ -1056,17 +1152,17 @@ msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ áƒáƒ£áƒªáƒ˜áƒšáƒ”á
msgid "no askpass program specified, try setting SUDO_ASKPASS"
msgstr "askpass-ის ტიპის პრáƒáƒ’რáƒáƒ›áƒ მითითებული áƒáƒ áƒáƒ. სცáƒáƒ“ეთ დáƒáƒáƒ§áƒ”ნáƒáƒ— SUDO_ASKPASS"
-#: src/tgetpass.c:328
+#: src/tgetpass.c:326
#, c-format
msgid "unable to set gid to %u"
msgstr "gid-ის %u-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/tgetpass.c:338
+#: src/tgetpass.c:336
#, c-format
msgid "unable to set uid to %u"
msgstr "uid-ის %u-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
-#: src/tgetpass.c:343
+#: src/tgetpass.c:341
#, c-format
msgid "unable to run %s"
msgstr "%s-ის გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
diff --git a/po/ko.mo b/po/ko.mo
index bf8baf1ab..ea4f51795 100644
--- a/po/ko.mo
+++ b/po/ko.mo
Binary files differ
diff --git a/po/ko.po b/po/ko.po
index 1ecf3c28d..a77eddd3d 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -5,19 +5,19 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 20:52+0900\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-12 14:16+0900\n"
"Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
"Language-Team: Korean <translation-team-ko@googlegroups.com>\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.3.1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 3.1.1\n"
#: lib/util/aix.c:89 lib/util/aix.c:169
msgid "unable to open userdb"
@@ -33,76 +33,75 @@ msgid "unable to restore registry"
msgstr "레지스트리를 ë³µì›í•  수 없습니다"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "메모리를 할당할 수 없습니다"
@@ -116,23 +115,23 @@ msgstr "%.*sì˜ ìƒíƒœë¥¼ 가져올 수 없습니다"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s(ì´)ê°€ 있지만 디렉터리는 아닙니다 (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "%sì„(를) ì—´ 수 없습니다"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "%.*sì„(를) ì—´ 수 없습니다"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "%.*s 디렉터리를 새로 만들 수 없습니다"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "%.*sì„(를) ì—´ 수 없습니다"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "ì •ê·œ 표현ì‹ì´ 너무 ê¹ë‹ˆë‹¤"
@@ -141,8 +140,8 @@ msgstr "ì •ê·œ 표현ì‹ì´ 너무 ê¹ë‹ˆë‹¤"
msgid "Unknown signal"
msgstr "ì•Œ 수 없는 시그ë„"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "부ì ì ˆí•œ ê°’"
@@ -154,86 +153,86 @@ msgstr "ê°’ì´ ë„ˆë¬´ í½ë‹ˆë‹¤"
msgid "value too small"
msgstr "ê°’ì´ ë„ˆë¬´ 작습니다"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, c-format
msgid "invalid Path value \"%s\" in %s, line %u"
msgstr "%2$sì˜ %3$u번째 ì¤„ì— ë¶€ì ì ˆí•œ 경로 ê°’ \"%1$s\""
-#: lib/util/sudo_conf.c:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, 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:440
+#: lib/util/sudo_conf.c:441
#, c-format
msgid "unsupported group source \"%s\" in %s, line %u"
msgstr "%2$sì˜ %3$u번째 ì¤„ì— ì§€ì›í•˜ì§€ 않는 그룹 ì›ë³¸ \"%1$s\""
-#: lib/util/sudo_conf.c:456
+#: lib/util/sudo_conf.c:457
#, c-format
msgid "invalid max groups \"%s\" in %s, line %u"
msgstr "%2$sì˜ %3$u번째 ì¤„ì— ë¶€ì ì ˆí•œ 최대 그룹 ê°’ \"%1$s\""
-#: lib/util/sudo_conf.c:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "%sì˜ ìƒíƒœë¥¼ 가져올 수 없습니다"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%sì€(는) ì¼ë°˜ 파ì¼ì´ 아닙니다"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%sì€(는) %u uidì—ì„œ 소유하고 있지만 %u uidê°€ 소유해야 합니다"
-#: lib/util/sudo_conf.c:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%sì— ëª¨ë‘ê°€ 기ë¡í•  수 있습니다"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%sì— ê·¸ë£¹ 구성ì›ì´ 기ë¡í•  수 있습니다"
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr "AppArmor 격리 여부를 알 수 없습니다"
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr "AppArmor 프로파ì¼ì„ %s(으)ë¡œ 바꿀 수 없습니다"
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: %s 문ìžì—´ì„ 0 ë°”ì´íŠ¸ë¡œ ìžë¦…니까? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "%s ë®ì–´ì“°ì§€ ì•ŠìŒ"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "%sì„(를) ì½ì„ 수 없습니다"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "%sì— ê¸°ë¡í•  수 없습니다"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "%sì˜ ìƒíƒœë¥¼ 가져올 수 없습니다"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: ì¼ë°˜ íŒŒì¼ ì•„ë‹˜"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: ìž˜ëª»ëœ íŒŒì¼ ëª¨ë“œ: 0%o"
@@ -242,60 +241,59 @@ msgstr "%s: ìž˜ëª»ëœ íŒŒì¼ ëª¨ë“œ: 0%o"
msgid "unable to restore current working directory"
msgstr "현재 ìž‘ì—… 디렉터리를 ë³µì›í•  수 없습니다"
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr "ê¶Œí•œì„ ì„¤ì •í•  수 없습니다"
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr "권한 한계를 설정할 수 없습니다"
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "ì•Œ 수 없는 ë¡œê·¸ì¸ í´ëž˜ìŠ¤ %s"
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "ì‚¬ìš©ìž ì»¨í…스트를 설정할 수 없습니다"
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "프로세스 우선순위를 설정할 수 없습니다"
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "루트를 %s(으)로 바꿀 수 없습니다"
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "실행 uid로 바꿀 수 없습니다 (%u, %u)"
-#: src/exec.c:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "%s 디렉터리로 바꿀 수 없습니다"
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "%sì—ì„œ 시작 중"
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "%d 시그ë„ì˜ í•¸ë“¤ëŸ¬ë¥¼ 설정할 수 없습니다"
-#: src/exec.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr "ì´ ì‹œìŠ¤í…œì˜ SELinux RBACì—서는 가로채기 모드를 지ì›í•˜ì§€ 않습니다"
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr "ì´ ì‹œìŠ¤í…œì˜ SELinux RBACì—서는 하위 ëª…ë ¹ì„ ê¸°ë¡í•  수 없습니다"
@@ -303,58 +301,84 @@ msgstr "ì´ ì‹œìŠ¤í…œì˜ SELinux RBACì—서는 하위 ëª…ë ¹ì„ ê¸°ë¡í•  수 ì—
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "PRIV_LIMITì—ì„œ PRIV_PROC_EXEC를 제거할 수 없습니다"
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "íì— ì´ë²¤íŠ¸ë¥¼ 추가할 수 없습니다"
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "보안 ì •ì±…ì— ë”°ë¼ ëª…ë ¹ì„ ì„¤ì •í•˜ì§€ 않았습니다"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "ì •ì±…ì„ í†µí•´ ëª…ë ¹ì„ ê±°ë¶€ 했습니다"
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "ìŠ¹ì¸ í”ŒëŸ¬ê·¸ì¸ ì˜¤ë¥˜"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "ì •ì±… í”ŒëŸ¬ê·¸ì¸ ì˜¤ë¥˜"
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr "부ì ì ˆí•œ PolicyCheckRequest"
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "í´ë¼ì´ì–¸íŠ¸ ìš”ì²­ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤: %zu"
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "%2$zu í¬ê¸°ì˜ %1$sì„(를) 언팩할 수 없습니다"
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "%3$sì˜ %2$sì—ì„œ 예기치 못한 type_case ê°’ %1$d번"
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "서버 메시지 길ì´ê°€ 너무 ê¹ë‹ˆë‹¤: %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "입출력 í”ŒëŸ¬ê·¸ì¸ ì˜¤ë¥˜"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "입출력 플러그ì¸ì—ì„œ ëª…ë ¹ì„ ê±°ë¶€í–ˆìŠµë‹ˆë‹¤"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "오류 로깅 대기"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "윈ë„ìš° í¬ê¸° 변경 오류"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "ì†Œì¼“ìŒ ì½ê¸° 오류"
@@ -364,225 +388,214 @@ msgstr "ì†Œì¼“ìŒ ì½ê¸° 오류"
msgid "unexpected reply type on backchannel: %d"
msgstr "ë°± 채ë„ì— ìž˜ëª»ëœ ì‘답 형ì‹: %d"
-#: src/exec_monitor.c:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "처리 tty를 설정할 수 없습니다"
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "파ì´í”„를 만들 수 없습니다"
# parentê°€ 정확히 무슨 ì˜ë¯¸ì¸ì§€ ì•Œ 수 ì—†ìŒ
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "ìƒìœ„로부터 메시지를 ë°›ì„ ìˆ˜ 없습니다"
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "í¬í‚¹í•  수 없습니다"
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "tty ë ˆì´ë¸”ì„ ë³µì›í•  수 없습니다"
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "%sì„(를) 실행할 수 없습니다"
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "ì •ì±… 플러그ì¸ì—ì„œ 세션 ì´ˆê¸°í™”ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤"
-#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "ì†Œì¼“ì„ ë§Œë“¤ 수 없습니다"
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "ì´ë²¤íŠ¸ ë£¨í”„ì— ì˜¤ë¥˜"
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr "execve ì¸ìž ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤"
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
-msgstr "프로세스 %2$dë²ˆì˜ %1$s execve를 ì½ì„ 수 없습니다"
+msgid "internal error, %s overflow"
+msgstr "내부 오류, %s 오버플로우"
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr "프로세스 %dë²ˆì˜ ë ˆì§€ìŠ¤í„°ë¥¼ 설정할 수 없습니다"
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr "프로세스 %dë²ˆì´ ê°‘ìžê¸° ë났습니다"
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr "seccomp 필터를 설정할 수 없습니다"
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "í•´ì„기 ì¸ìžì—ì„œ \"%s\"ì´(ê°€) 필요하지만 \"%s\"ì„(를) 지정했습니다"
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr "경로 ì´ë¦„ì´ ì¼ì¹˜í•˜ì§€ 않습니다. \"%s\"ì„(를) 예ìƒí–ˆì§€ë§Œ, \"%s\"ì´(ê°€) 나왔습니다"
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr "%s[%d]ì´(ê°€) ì¼ì¹˜í•˜ì§€ 않습니다. \"%s\"ì„(를) 예ìƒí–ˆì§€ë§Œ, \"%s\"ì´(ê°€) 나왔습니다"
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "프로세스 %dë²ˆì´ ê°‘ìžê¸° 0x%x ìƒíƒœë¥¼ 나타냈습니다"
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr "프로세스 %dë²ˆì˜ ì´ë²¤íŠ¸ 메시지를 가져올 수 없습니다"
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr "프로세스 %dë²ˆì˜ ë ˆì§€ìŠ¤í„°ë¥¼ 가져올 수 없습니다"
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr "pty를 할당할 수 없습니다"
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr "입출력 í”ŒëŸ¬ê·¸ì¸ ì˜¤ë¥˜"
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr "입출력 플러그ì¸ì—ì„œ ëª…ë ¹ì„ ê±°ë¶€í–ˆìŠµë‹ˆë‹¤"
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr "오류 로깅 대기"
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr "윈ë„ìš° í¬ê¸° 변경 오류"
-
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, c-format
msgid "unable to restore handler for signal %d"
msgstr "%d 시그ë„ì˜ í•¸ë“¤ëŸ¬ë¥¼ ë³µì›í•  수 없습니다"
-#: src/exec_pty.c:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "ê°ì‚¬ í”„ë¡œì„¸ìŠ¤ì— ë©”ì‹œì§€ë¥¼ 보낼 수 없습니다"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, c-format
msgid "error in %s, line %d while loading plugin \"%s\""
msgstr "%sì˜ %d번째 줄ì—ì„œ \"%s\" 플러그ì¸ì„ 불러오는 중 오류"
-#: src/load_plugins.c:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%sì€(는) uid %dì—ì„œ 소유해야 합니다"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%sì€(는) 소유ìžë§Œ 기ë¡í•  수 있어야 합니다"
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "%2$sì˜ %3$d번째 줄ì—ì„œ \"%1$s\" 중복 í”ŒëŸ¬ê·¸ì¸ ë¬´ì‹œ"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "%sì„(를) 불러올 수 없습니다: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "%2$sì—ì„œ \"%1$s\" ì‹¬ë³¼ì„ ì°¾ì„ ìˆ˜ 없습니다"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, c-format
msgid "incompatible plugin major version %d (expected %d) found in %s"
msgstr "%3$sì— ì£¼ 버전ì´(%2$dì„(를) 기대했지만) %1$dì¸ ë¹„í˜¸í™˜ 플러그ì¸ì´ 있습니다"
-#: src/load_plugins.c:317
+#: src/load_plugins.c:319
#, c-format
msgid "ignoring policy plugin \"%s\" in %s, line %d"
msgstr "%2$sì˜ %3$d번째 줄ì—ì„œ \"%1$s\" ì •ì±… í”ŒëŸ¬ê·¸ì¸ ë¬´ì‹œ"
-#: src/load_plugins.c:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "ë‹¨ì¼ ì •ì±… 플러그ì¸ì„ 지정하십시오"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "%2$sì— ì•Œ 수 없는 ì •ì±… 유형 %1$dì´(ê°€) 있습니다"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, c-format
msgid "policy plugin %s does not include a check_policy method"
msgstr "%s ì •ì±… 플러그ì¸ì— check_policy 메서드가 없습니다"
-#: src/net_ifs.c:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "내부 오류, %s 오버플로우"
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "부ì ì ˆí•œ 환경 변수 ì´ë¦„: %s"
-#: src/parse_args.c:314
+#: src/parse_args.c:317
msgid "the argument to -C must be a number greater than or equal to 3"
msgstr "-Cì˜ ì¸ìž ê°’ì€ 3보다 í¬ê±°ë‚˜ 같아야 합니다"
-#: src/parse_args.c:545
+#: src/parse_args.c:554
msgid "you may not specify both the -i and -s options"
msgstr "-i 옵션과 -s ì˜µì…˜ì„ í•¨ê»˜ 지정할 수 없습니다"
-#: src/parse_args.c:550
+#: src/parse_args.c:559
msgid "you may not specify both the -i and -E options"
msgstr "-i 옵션과 -E ì˜µì…˜ì„ í•¨ê»˜ 지정할 수 없습니다"
-#: src/parse_args.c:560
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "-E ì˜µì…˜ì€ íŽ¸ì§‘ 모드ì—ì„œ 유효하지 않습니다"
-#: src/parse_args.c:563
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr "편집 모드ì—ì„œ 환경 변수를 지정할 수 없습니다"
-#: src/parse_args.c:573
+#: src/parse_args.c:582
msgid "the -U option may only be used with the -l option"
msgstr "-U 옵션ì—는 -l 옵션만 함께 쓸 수 있습니다"
-#: src/parse_args.c:577
+#: src/parse_args.c:586
msgid "the -A and -S options may not be used together"
msgstr "-A 옵션과 -S ì˜µì…˜ì„ í•¨ê»˜ 쓸 수 없습니다"
-#: src/parse_args.c:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "ì´ í”Œëž«í¼ì—ì„œ sudoedit를 지ì›í•˜ì§€ 않습니다"
-#: src/parse_args.c:757
+#: src/parse_args.c:767
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:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "-K, -k, -N 옵션 중 하나만 지정해야합니다"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -591,7 +604,7 @@ msgstr ""
"%s - 다른 ì‚¬ìš©ìž ê¶Œí•œìœ¼ë¡œ 파ì¼ì„ 편집합니다\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -600,7 +613,7 @@ msgstr ""
"%s - 다른 ì‚¬ìš©ìž ê¶Œí•œìœ¼ë¡œ ëª…ë ¹ì„ ì‹¤í–‰í•©ë‹ˆë‹¤\n"
"\n"
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -608,131 +621,131 @@ msgstr ""
"\n"
"옵션:\n"
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "암호 ì§ˆë¬¸ì— ë³´ì¡° 프로그램 활용"
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "지정 BSD ì¸ì¦ í˜•ì‹ í™œìš©"
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "백그ë¼ìš´ë“œì—ì„œ 명령 실행"
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "프롬프트를 ë„울 ë•Œ 알림 소리를 냅니다"
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "num 보다 í¬ê±°ë‚˜ ê°™ì€ ëª¨ë“  íŒŒì¼ ì„œìˆ ìžë¥¼ 닫습니다"
-#: src/parse_args.c:798
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "지정 BSD ë¡œê·¸ì¸ í´ëž˜ìŠ¤ë¡œ ëª…ë ¹ì„ ì‹¤í–‰í•©ë‹ˆë‹¤"
-#: src/parse_args.c:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "명령 실행 전 작업 디렉터리를 바꿉니다"
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  ë•Œ ì‚¬ìš©ìž í™˜ê²½ì„ ìœ ì§€í•©ë‹ˆë‹¤"
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "지정 환경 변수 ê°’ì„ ìœ ì§€í•©ë‹ˆë‹¤"
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•˜ëŠ” 대신 파ì¼ì„ 편집합니다"
-#: src/parse_args.c:811
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "지정 그룹 ì´ë¦„ ë˜ëŠ” IDë¡œ ëª…ë ¹ì„ ì‹¤í–‰í•©ë‹ˆë‹¤"
-#: src/parse_args.c:814
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "ëŒ€ìƒ ì‚¬ìš©ìžì˜ ë‚´ í´ë”ì— HOME 변수를 지정합니다"
-#: src/parse_args.c:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "ë„움ë§ì„ 보여주고 빠져나갑니다"
-#: src/parse_args.c:819
+#: src/parse_args.c:842
msgid "run command on host (if supported by plugin)"
msgstr "(플러그ì¸ì—ì„œ 지ì›í•œë‹¤ë©´)호스트ì—ì„œ ëª…ë ¹ì„ ì‹¤í–‰í•©ë‹ˆë‹¤"
-#: src/parse_args.c:822
+#: src/parse_args.c:845
msgid "run login shell as the target user; a command may also be specified"
msgstr "ëŒ€ìƒ ì‚¬ìš©ìž ìžê²©ìœ¼ë¡œ ì…¸ì— ë¡œê·¸ì¸í•˜ë©° ëª…ë ¹ì„ ì§€ì •í•  수 있습니다"
-#: src/parse_args.c:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "타임스탬프 파ì¼ì„ 완전히 제거합니다"
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "타임스탬프 파ì¼ì„ 초기화합니다"
-#: src/parse_args.c:830
+#: src/parse_args.c:853
msgid "list user's privileges or check a specific command; use twice for longer format"
msgstr "ì‚¬ìš©ìž ê¶Œí•œì„ ë³´ì—¬ì£¼ê±°ë‚˜ 지정 ëª…ë ¹ì„ í™•ì¸í•©ë‹ˆë‹¤. 긴 형ì‹ìœ¼ë¡œ 보려면 ì˜µì…˜ì„ ë‘ ë²ˆ 사용하십시오"
-#: src/parse_args.c:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "비대화형 모드. 프롬프트를 사용하지 않습니다"
-#: src/parse_args.c:836
+#: src/parse_args.c:859
msgid "preserve group vector instead of setting to target's"
msgstr "대ìƒì„ 설정하는 대신 그룹 벡터를 유지합니다"
-#: src/parse_args.c:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "지정 암호 프롬프트를 활용합니다"
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "명령 실행 전 루트 디렉터리를 바꿉니다"
-#: src/parse_args.c:844
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "지정 ì—­í• ì„ ì§€ë‹Œ SELinux 보안 컨í…스트를 만듭니다"
-#: src/parse_args.c:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "표준 입력으로 암호를 입력 받습니다"
-#: src/parse_args.c:850
+#: src/parse_args.c:873
msgid "run shell as the target user; a command may also be specified"
msgstr "ì…¸ì„ ëŒ€ìƒ ì‚¬ìš©ìž ëª…ì˜ë¡œ 실행하며 ëª…ë ¹ì„ ì§€ì •í•  수 있습니다"
-#: src/parse_args.c:854
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "지정 ìœ í˜•ì˜ SELinux 보안 컨í…스트를 만듭니다"
-#: src/parse_args.c:857
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "지정 제한 시간 ì´í›„ë¡œ 명령 ì‹¤í–‰ì„ ë©ˆì¶¥ë‹ˆë‹¤"
-#: src/parse_args.c:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "ëª©ë¡ ëª¨ë“œì—ì„œ ì‚¬ìš©ìž ê¶Œí•œì„ ë³´ì—¬ì¤ë‹ˆë‹¤"
-#: src/parse_args.c:863
+#: src/parse_args.c:886
msgid "run command (or edit file) as specified user name or ID"
msgstr "지정한 ì‚¬ìš©ìž ì´ë¦„ ë˜ëŠ” IDë¡œ ëª…ë ¹ì„ ì‹¤í–‰(ë˜ëŠ” íŒŒì¼ íŽ¸ì§‘)"
-#: src/parse_args.c:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "버전 정보를 보여주고 나갑니다"
-#: src/parse_args.c:868
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•˜ì§€ ì•Šê³  ì‚¬ìš©ìž íƒ€ìž„ìŠ¤íƒ¬í”„ë¥¼ ì—…ë°ì´íŠ¸í•©ë‹ˆë‹¤"
-#: src/parse_args.c:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "명령행 ì¸ìž 처리를 멈춥니다"
@@ -832,37 +845,42 @@ msgstr "exec 컨í…스트를 %s(으)ë¡œ 설정할 수 없습니다"
msgid "unable to set key creation context to %s"
msgstr "키 ìƒì„± 컨í…스트를 %s(으)ë¡œ 설정할 수 없습니다"
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "최소한 í•˜ë‚˜ì˜ ì¸ìžê°€ 필요합니다"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "-c, -i 옵션 중 하나만 지정해야합니다"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "부ì ì ˆí•œ íŒŒì¼ ì„œìˆ ìž ë²ˆí˜¸: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "%s(ì„)를 ë¡œê·¸ì¸ ì‰˜ë¡œ 실행할 수 없습니다"
+msgid "The -%c option may not be used in edit mode."
+msgstr "-%c ì˜µì…˜ì€ íŽ¸ì§‘ 모드ì—ì„œ 사용하면 안ë©ë‹ˆë‹¤."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:184 src/sesh.c:189
+#, c-format
+msgid "The -%c option may only be used in edit mode."
+msgstr "-%c ì˜µì…˜ì€ íŽ¸ì§‘ 모드ì—서만 사용해야합니다."
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: 심볼릭 ë§í¬ íŽ¸ì§‘ì„ í—ˆìš©í•˜ì§€ 않습니다"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, c-format
msgid "%s: editing files in a writable directory is not permitted"
msgstr "%s: ê¸°ë¡ ê°€ëŠ¥í•œ 디렉터리ì—ì„œ íŒŒì¼ íŽ¸ì§‘ì„ í—ˆìš©í•˜ì§€ 않습니다"
-#: src/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "%sì— íŽ¸ì§‘ 세션 ë‚´ìš© 남ìŒ"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "그룹 목ë¡ì„ 가져올 수 없습니다"
@@ -946,118 +964,122 @@ msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— 없는 사용ìžìž…니다"
msgid "unable to determine tty"
msgstr "tty를 지정할 수 없습니다"
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "sudo를 루트 권한으로 실행하지 못하게 하는 \"no new privileges\" 플래그를 설정했습니다."
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "컨테ì´ë„ˆì—ì„œ sudo를 실행할 ë•Œ, 플래그를 ë„는 컨테ì´ë„ˆ ì„¤ì •ì´ í•„ìš”í•  수 있습니다."
-#: src/sudo.c:961
+#: src/sudo.c:954
#, c-format
msgid "%s must be owned by uid %d and have the setuid bit set"
msgstr "%sì€(는) %d uid를 소유해야 하며 setuid 비트를 설정해야 합니다"
-#: src/sudo.c:964
+#: src/sudo.c:957
#, 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:970
+#: src/sudo.c:963
#, c-format
msgid "effective uid is not %d, is sudo installed setuid root?"
msgstr "%dì€(는) 유효한 uidê°€ 아닙니다. sudoì— setuid root를 설치했습니까?"
-#: src/sudo.c:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "추가 그룹 ID를 설정할 수 없습니다"
-#: src/sudo.c:993
+#: src/sudo.c:986
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr "유효한 gid를 %u 실행 gid로 설정할 수 없습니다"
-#: src/sudo.c:999
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "gid를 실행 gid %u(으)로 설정할 수 없습니다"
-#: src/sudo.c:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "보안 ì •ì±…ì— ë”°ë¼ argv를 설정하지 않았습니다"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "보안 ì •ì±…ì— ë”°ë¼ envp를 설정하지 않았습니다"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "예ìƒì¹˜ 못한 하위 프로세스 중단 ìƒíƒœ: %d"
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "ì •ì±… 플러그ì¸ì„ 초기화할 수 없습니다"
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "%s ì •ì±… 플러그ì¸ì— \"check_policy\" 메서드가 빠졌습니다"
-#: src/sudo.c:1257
+#: src/sudo.c:1269
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr "%s ì •ì±… 플러그ì¸ì—ì„œ 권한 조회를 지ì›í•˜ì§€ 않습니다"
-#: src/sudo.c:1301
+#: src/sudo.c:1313
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr "%s ì •ì±… 플러그ì¸ì—ì„œ -v ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않습니다"
-#: src/sudo.c:1339
+#: src/sudo.c:1351
#, c-format
msgid "policy plugin %s does not support the -k/-K options"
msgstr "%s ì •ì±… 플러그ì¸ì—ì„œ -k/-K ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않습니다"
-#: src/sudo.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "%s 입출력 í”ŒëŸ¬ê·¸ì¸ ì´ˆê¸°í™” 오류"
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "입출력 í”ŒëŸ¬ê·¸ì¸ ì´ˆê¸°í™” 오류"
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "%s ê°ì‚¬ í”ŒëŸ¬ê·¸ì¸ ì´ˆê¸°í™” 오류"
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: %s%s 오류 ì´ë²¤íŠ¸ë¥¼ 기ë¡í•  수 없습니다"
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: %s%s 허용 ì´ë²¤íŠ¸ë¥¼ 기ë¡í•  수 없습니다"
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "ê°ì‚¬ í”ŒëŸ¬ê·¸ì¸ ì˜¤ë¥˜"
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: %s%s 거부 ì´ë²¤íŠ¸ë¥¼ 기ë¡í•  수 없습니다"
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "%s ìŠ¹ì¸ í”ŒëŸ¬ê·¸ì¸ ì´ˆê¸°í™” 오류"
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "승ì¸ìžê°€ ëª…ë ¹ì„ ê±°ë¶€í–ˆìŠµë‹ˆë‹¤"
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr "ìŠ¹ì¸ í”ŒëŸ¬ê·¸ì¸ ì˜¤ë¥˜"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "ê¸°ë¡ ê°€ëŠ¥í•œ ìž„ì‹œ 디렉터리를 ì°¾ì„ ìˆ˜ 없습니다"
@@ -1067,7 +1089,7 @@ msgstr "ê¸°ë¡ ê°€ëŠ¥í•œ ìž„ì‹œ 디렉터리를 ì°¾ì„ ìˆ˜ 없습니다"
msgid "%s left unmodified"
msgstr "%s 수정하지 ì•Šì€ ìƒíƒœë¡œ 남ìŒ"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s 바꾸지 ì•ŠìŒ"
@@ -1080,37 +1102,37 @@ msgstr "sesh: 내부 오류: ê²½ë¡œì— ìž˜ëª»ëœ íŒŒì¼"
msgid "sesh: unable to create temporary files"
msgstr "sesh: ìž„ì‹œ 파ì¼ì„ 만들 수 없습니다"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: 시그ë„ì„ ë°›ì•„ 죽ìŒ"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: ìž˜ëª»ëœ ì˜¤ë¥˜ %d"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
msgid "unable to copy temporary files back to their original location"
msgstr "ì›ìœ„ì¹˜ì— ìž„ì‹œ 파ì¼ì„ 복사할 수 없습니다"
-#: src/sudo_edit.c:606
+#: src/sudo_edit.c:601
msgid "unable to copy some of the temporary files back to their original location"
msgstr "ì› ìœ„ì¹˜ì— ìž„ì‹œ íŒŒì¼ ì¼ë¶€ë¥¼ 복사할 수 없습니다"
-#: src/sudo_edit.c:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "uid를 루트로 바꿀 수 없습니다(%u)"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "í”ŒëŸ¬ê·¸ì¸ ì˜¤ë¥˜: sudoeditì— íŒŒì¼ ëª©ë¡ì´ ë¹ ì§"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "í´ë¡ì„ ì½ì„ 수 없습니다"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "차단 í¬íŠ¸ë¥¼ 설정하지 않았습니다"
@@ -1161,6 +1183,18 @@ msgstr "표준 ìž…ë ¥ì„ dup2 처리할 수 없습니다"
msgid "unable to restore stdin"
msgstr "표준 ìž…ë ¥ì„ ë³µì›í•  수 없습니다"
+#~ msgid "insufficient space for execve arguments"
+#~ msgstr "execve ì¸ìž ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤"
+
+#~ msgid "unable to read execve %s for process %d"
+#~ msgstr "프로세스 %2$dë²ˆì˜ %1$s execve를 ì½ì„ 수 없습니다"
+
+#~ msgid "requires at least one argument"
+#~ msgstr "최소한 í•˜ë‚˜ì˜ ì¸ìžê°€ 필요합니다"
+
+#~ msgid "unable to run %s as a login shell"
+#~ msgstr "%s(ì„)를 ë¡œê·¸ì¸ ì‰˜ë¡œ 실행할 수 없습니다"
+
#~ msgid "unable to dup intercept fd"
#~ msgstr "가로채기 íŒŒì¼ ì„œìˆ ìžë¥¼ 복제할 수 없습니다"
diff --git a/po/pl.mo b/po/pl.mo
index 9245c40f5..2b6bc0ba5 100644
--- a/po/pl.mo
+++ b/po/pl.mo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index f1766782f..5c15dec19 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 21:12+0200\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-11 21:30+0200\n"
"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
"Language: pl\n"
@@ -30,76 +30,75 @@ msgid "unable to restore registry"
msgstr "nie udało się odtworzyć rejestru"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "nie udało się przydzielić pamięci"
@@ -113,23 +112,23 @@ msgstr "nie udało się wykonać stat na %.*s"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s istnieje, ale nie jest katalogiem (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "nie udało się otworzyć %s"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "nie udało się otworzyć %.*s"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "nie udało się utworzyć katalogu %.*s"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "nie udało się otworzyć %.*s"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "wyrażenie regularne zbyt długie"
@@ -138,8 +137,8 @@ msgstr "wyrażenie regularne zbyt długie"
msgid "Unknown signal"
msgstr "Nieznany sygnał"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "błędna wartość"
@@ -151,86 +150,86 @@ msgstr "wartość zbyt duża"
msgid "value too small"
msgstr "wartość zbyt mała"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, 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:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, 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:440
+#: lib/util/sudo_conf.c:441
#, 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:456
+#: lib/util/sudo_conf.c:457
#, 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:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "nie udało się wykonać stat na %s"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s nie jest zwykłym plikiem"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, 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:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s jest zapisywalny dla świata"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s jest zapisywalny dla grupy"
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr "nie udało się określić ograniczeń AppArmor"
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr "nie udało się zmienić profilu AppArmor na %s"
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: uciąć %s to zera bajtów? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "bez nadpisywania %s"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "nie można czytać z %s"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "nie można pisać do %s"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "nie udało się wykonać stat na %s"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: nie jest zwykłym plikiem"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: błędny tryb pliku: 0%o"
@@ -239,60 +238,59 @@ msgstr "%s: błędny tryb pliku: 0%o"
msgid "unable to restore current working directory"
msgstr "nie udało się odtworzyć bieżącego kartalogu roboczego"
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr "nie udało się ustawić uprawnień"
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr "nie udało się ustawić ograniczonych uprawnień"
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "nieznana klasa logowania %s"
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "nie udało się ustawić kontekstu użytkownika"
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "nie udało się ustawić priorytetu procesu"
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "nie udało się zmienić katalogu głównego na %s"
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, 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:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "nie udało się zmienić katalogu na %s"
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "zaczynajÄ…c od %s"
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, 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.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr "tryb przechwytywania nie jest obsługiwany z RBAC SELinux na tym systemie"
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr "nie można logować podpoleceń z RBAC SELinux na tym systemie"
@@ -300,58 +298,84 @@ msgstr "nie można logować podpoleceń z RBAC SELinux na tym systemie"
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "nie udało się usunąć PRIV_PROC_EXEC z PRIV_LIMIT"
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "nie udało się dodać zdarzenia do kolejki"
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "polecenie nie ustawione przez politykę bezpieczeństwa"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "polecenie odrzucone przez politykÄ™"
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "błąd wtyczki zgody"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "błąd wtyczki polityki"
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr "błędne żądanie PolicyCheckRequest"
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "żądanie klienta zbyt duże: %zu"
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "nie udało się rozpakować %s, rozmiar %zu"
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "nieoczekiwana wartość type_case %d w %s od %s"
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "komunikat serwera zbyt duży: %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "błąd wtyczki we/wy"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "polecenie odrzucone przez wtyczkÄ™ we/wy"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "błąd logowania odroczenia"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "błąd zmiany rozmiaru okna"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "błąd odczytu z pary gniazd"
@@ -361,224 +385,213 @@ msgstr "błąd odczytu z pary gniazd"
msgid "unexpected reply type on backchannel: %d"
msgstr "nieoczekiwany typ odpowiedzi z kanału zwrotnego: %d"
-#: src/exec_monitor.c:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "nie udało się ustawić sterującego tty"
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "nie udało się utworzyć potoku"
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "nie udało się odebrać komunikatu od rodzica"
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "nie udało się wykonać fork"
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "nie udało się przywrócić etykiety tty"
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "nie udało się wykonać %s"
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "nie udało się zainicjować sesji przez wtyczkę polityki"
-#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "nie udało się utworzyć gniazd"
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "błąd w pętli zdarzeń"
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr "za mało miejsca na argumenty execve"
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
-msgstr "nie udało się odczytać execve %s dla procesu %d"
+msgid "internal error, %s overflow"
+msgstr "błąd wewnętrzny, przepełnienie %s"
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr "nie udało się ustawić rejestrów dla procesu %d"
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr "proces %d nieoczekiwanie zakończył się"
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr "nie udało się ustawić filtra seccomp"
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "argument interpretera - oczekiwano \"%s\", napotkano \"%s\""
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr "niezgodność ścieżki, oczekiwano \"%s\", napotkano \"%s\""
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr "niezgodność %s[%d], oczekiwano \"%s\", napotkano \"%s\""
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "proces %d nieoczekiwany status 0x%x"
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr "nie udało się pobrać komunikatu zdarzenia dla procesu %d"
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr "nie udało się pobrać rejestrów dla procesu %d"
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr "nie udało się przydzielić pty"
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr "błąd wtyczki we/wy"
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr "polecenie odrzucone przez wtyczkÄ™ we/wy"
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr "błąd logowania odroczenia"
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr "błąd zmiany rozmiaru okna"
-
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, 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:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "nie udało się wysłać komunikatu do procesu monitorującego"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, 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:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "właścicielem %s musi być uid %d"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, 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:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "zignotowano powtórzoną wtyczkę \"%s\" w %s, w linii %d"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "nie udało się załadować %s: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "nie udało się odnaleźć symbolu \"%s\" w %s"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, 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:317
+#: src/load_plugins.c:319
#, 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:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "może być podana tylko jedna wtyczka polityki"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "nieznany typ wtyczki %d napotkany w %s"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, 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:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "błąd wewnętrzny, przepełnienie %s"
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "błędna nazwa zmiennej środowiskowej: %s"
-#: src/parse_args.c:314
+#: src/parse_args.c:317
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:545
+#: src/parse_args.c:554
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:550
+#: src/parse_args.c:559
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:560
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "opcja -E nie jest poprawna w trybie edycji"
-#: src/parse_args.c:563
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr "w trybie edycji nie można przekazywać zmiennych środowiskowych"
-#: src/parse_args.c:573
+#: src/parse_args.c:582
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:577
+#: src/parse_args.c:586
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:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "sudoedit nie jest obsługiwane na tej platformie"
-#: src/parse_args.c:757
+#: src/parse_args.c:767
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:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "Można podać tylko jedną z opcji -K, -k lub -N"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -587,7 +600,7 @@ msgstr ""
"%s - modyfikowanie plików jako inny użytkownik\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -596,7 +609,7 @@ msgstr ""
"%s - wykonywanie poleceń jako inny użytkownik\n"
"\n"
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -604,131 +617,131 @@ msgstr ""
"\n"
"Opcje:\n"
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "użycie programu pomocniczego do pytań o hasło"
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "użycie podanego rodzaju uwierzytelnienia BSD"
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "uruchomienie polecenia w tle"
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "dzwonek przy zapytaniu"
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "zamknięcie wszystkich deskryptorów >= fd"
-#: src/parse_args.c:798
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "uruchomienie polecenia z podanÄ… klasÄ… logowania BSD"
-#: src/parse_args.c:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "zmiana katalogu roboczego przed uruchomieniem polecenia"
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "zachowanie środowiska użytkownika przy uruchamianiu polecenia"
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "zachowanie określonych zmiennych środowiskowych"
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "modyfikowanie plików zamiast uruchomienia polecenia"
-#: src/parse_args.c:811
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "wywołanie polecenia jako określona grupa lub ID"
-#: src/parse_args.c:814
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "ustawienie zmiennej HOME na katalog domowy użytkownika docelowego"
-#: src/parse_args.c:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "wyświetlenie opisu i zakończenie"
-#: src/parse_args.c:819
+#: src/parse_args.c:842
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:822
+#: src/parse_args.c:845
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:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "całkowite usunięcie pliku znacznika czasu"
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "unieważnienie pliku znacznika czasu"
-#: src/parse_args.c:830
+#: src/parse_args.c:853
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:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "tryb nieinteraktywny, bez pytań"
-#: src/parse_args.c:836
+#: src/parse_args.c:859
msgid "preserve group vector instead of setting to target's"
msgstr "zachowanie wektora grup zamiast ustawiania docelowych"
-#: src/parse_args.c:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "użycie podanego pytania o hasło"
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "zmiana katalogu głównego przed uruchomieniem polecenia"
-#: src/parse_args.c:844
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "utworzenie kontekstu bezpieczeństwa SELinuksa z podaną rolą"
-#: src/parse_args.c:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "odczyt hasła ze standardowego wejścia"
-#: src/parse_args.c:850
+#: src/parse_args.c:873
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:854
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "utworzenie kontekstu bezpieczeństwa SELinuksa z podanym typem"
-#: src/parse_args.c:857
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "zakończenie polecenia po zadanym limicie czasu"
-#: src/parse_args.c:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "w trybie listy - wyświetlenie uprawnień użytkownika"
-#: src/parse_args.c:863
+#: src/parse_args.c:886
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:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "wyświetlenie informacji o wersji i zakończenie"
-#: src/parse_args.c:868
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr "uaktualnienie znacznika czasu użytkownika bez uruchamiania polecenia"
-#: src/parse_args.c:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "zakończenie przetwarzania argumentów linii poleceń"
@@ -828,37 +841,42 @@ msgstr "nie udało się ustawić kontekstu wykonywania na %s"
msgid "unable to set key creation context to %s"
msgstr "nie udało się ustawić kontekstu tworzenia klucza na %s"
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "wymagany jest przynajmniej jeden argument"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "Można podać tylko jedną z opcji -c lub -i"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "błędny numer deskryptora pliku: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
+#, c-format
+msgid "The -%c option may not be used in edit mode."
+msgstr "Opcja -%c nie może być użyta w trybie edycji."
+
+#: src/sesh.c:184 src/sesh.c:189
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "nie udało się uruchomić %s jako powłoki logowania"
+msgid "The -%c option may only be used in edit mode."
+msgstr "Opcji -%c można używać tylko w trybie edycji."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: edycja dowiązań symbolicznych nie jest dozwolona"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, 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/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "zawartość sesji edycji pozostawiono w %s"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "nie udało się uzyskać listy grup"
@@ -942,118 +960,122 @@ msgstr "nie istniejesz w bazie danych %s"
msgid "unable to determine tty"
msgstr "nie udało się określić tty"
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "Ustawiona jest flaga \"bez nowych uprawnień\", która nie pozwala na uruchamianie sudo jako root."
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "Jeśli sudo jest uruchomione w kontenerze, może być potrzebne dostosowanie konfiguracji kontenera w celu wyłączenia flagi."
-#: src/sudo.c:961
+#: src/sudo.c:954
#, 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:964
+#: src/sudo.c:957
#, 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:970
+#: src/sudo.c:963
#, 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:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "nie udało się ustawić ID dodatkowych grup"
-#: src/sudo.c:993
+#: src/sudo.c:986
#, 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:999
+#: src/sudo.c:992
#, 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:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "argv nie ustawione przez politykę bezpieczeństwa"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "envp nie ustawione przez politykę bezpieczeństwa"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "nieoczekiwane zakończenie procesu potomnego: %d"
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "nie udało się zainicjować wtyczki polityki"
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "wtyczka polityki %s nie zawiera metody \"check_policy\""
-#: src/sudo.c:1257
+#: src/sudo.c:1269
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr "wtyczka polityki %s nie obsługuje wypisywania uprawnień"
-#: src/sudo.c:1301
+#: src/sudo.c:1313
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr "wtyczka polityki %s nie obsługuje opcji -v"
-#: src/sudo.c:1339
+#: src/sudo.c:1351
#, 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.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "błąd inicjalizacji wtyczki we/wy %s"
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "błąd inicjowania wtyczki we/wy"
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "błąd inicjowania wtyczki audytu %s"
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: nie udało się zalogować zdarzenia błędu%s%s"
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: nie udało się zalogować zdarzenia akceptacji%s%s"
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "błąd wtyczki audytu"
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: nie udało się zalogować zdarzenia odrzucenia%s%s"
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "błąd inicjowania wtyczki zgody %s"
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "polecenie odrzucone przez wtyczkÄ™ zgody"
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr "błąd wtyczki zgody"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "nie znaleziono katalogu tymczasowego z prawem zapisu"
@@ -1063,7 +1085,7 @@ msgstr "nie znaleziono katalogu tymczasowego z prawem zapisu"
msgid "%s left unmodified"
msgstr "pozostawiono bez zmian: %s"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "nie zmieniono: %s"
@@ -1076,37 +1098,37 @@ msgstr "sesh: błąd wewnętrzny: nieparzysta liczba ścieżek"
msgid "sesh: unable to create temporary files"
msgstr "sesh: nie udało się utworzyć plików tymczasowych"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: zabito sygnałem"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: nieznany błąd %d"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
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:606
+#: src/sudo_edit.c:601
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:649
+#: src/sudo_edit.c:645
#, 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:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "błąd wtyczki: brak listy plików dla sudoedit"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "nie udało się odczytać zegara"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "port przechwytywania nie ustawiony"
diff --git a/po/ro.mo b/po/ro.mo
index 5f0524dbb..a5ebf2f11 100644
--- a/po/ro.mo
+++ b/po/ro.mo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index 54e3f5a3d..87544208e 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -10,12 +10,13 @@
# Actualizare a algoritmului formelor de plural (de la „trei-vechi†la „trei-nouâ€).
# Actualizare a traducerii pentru versiunea 1.9.10b1, făcută de R-GC.
# Actualizare a traducerii pentru versiunea 1.9.11b1, făcută de R-GC.
+# Actualizare a traducerii pentru versiunea 1.9.12b2, făcută de R-GC.
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 20:01+0200\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-12 11:37+0200\n"
"Last-Translator: Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>\n"
"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
"Language: ro\n"
@@ -24,7 +25,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);\n"
"X-Bugs: Report translation errors to the Language-Team address.\n"
-"X-Generator: Poedit 3.0.1\n"
+"X-Generator: Poedit 3.1.1\n"
#: lib/util/aix.c:89 lib/util/aix.c:169
msgid "unable to open userdb"
@@ -40,76 +41,75 @@ msgid "unable to restore registry"
msgstr "nu se poate restaura registrul"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "nu se poate aloca memoria"
@@ -123,23 +123,23 @@ msgstr "nu se poate stabili starea lui %.*s"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s există, dar nu este un director (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "nu se poate deschide %s"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "nu se poate deschide %.*s"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "nu se poate executa mkdir %.*s"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "nu se poate deschide %.*s"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "expresia regulată este prea lungă"
@@ -148,8 +148,8 @@ msgstr "expresia regulată este prea lungă"
msgid "Unknown signal"
msgstr "Semnal necunoscut"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "valoare nevalidă"
@@ -161,37 +161,32 @@ msgstr "valoare prea mare"
msgid "value too small"
msgstr "valoare prea mică"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, c-format
msgid "invalid Path value \"%s\" in %s, line %u"
msgstr "valoare de cale(path) nevalidă „%s†în %s, linia %u"
-#: lib/util/sudo_conf.c:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, c-format
msgid "invalid value for %s \"%s\" in %s, line %u"
msgstr "valoare nevalidă pentru %s „%s†în %s, linia %u"
-#: lib/util/sudo_conf.c:440
+#: lib/util/sudo_conf.c:441
#, c-format
msgid "unsupported group source \"%s\" in %s, line %u"
msgstr "sursă de grup nesuportată „%s†în %s, linia %u"
-#: lib/util/sudo_conf.c:456
+#: lib/util/sudo_conf.c:457
#, c-format
msgid "invalid max groups \"%s\" in %s, line %u"
msgstr "grupuri maxime nevalide „%s†în %s, linia %u"
-#: lib/util/sudo_conf.c:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "nu se poate stat %s"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s nu este un fișier regulat"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s este deținut de uid-ul %u, ar trebui să fie %u"
@@ -201,7 +196,7 @@ msgstr "%s este deținut de uid-ul %u, ar trebui să fie %u"
# la „inscriptibilâ€
# - 1. pentru a fi =n consonanță cu celelalte mesaje
# - 2. referința este pentru fișier, și nu pentru conținutul său
-#: lib/util/sudo_conf.c:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s este inscriptibil global"
@@ -209,12 +204,12 @@ msgstr "%s este inscriptibil global"
# Modificare:
# de la: „este inscriptibil pe grupâ€
# la:„este inscriptibil de către grupâ€
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s este inscriptibil de către grup"
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr "nu s-a reușit să se determine confinarea (izolarea) AppArmor"
@@ -224,7 +219,7 @@ msgstr "nu s-a reușit să se determine confinarea (izolarea) AppArmor"
# ***
# asta, cînd mesajul în engleză, era:
# „unable to change root to %sâ€
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr "nu se poate schimba profilul AppArmor la %s"
@@ -233,34 +228,39 @@ msgstr "nu se poate schimba profilul AppArmor la %s"
# de întrebat băieții de la sudo, dacă se poate traduce (y/n) precum (d/n) sau nu...
# și bineînțeles..., ca programul să răspundă cu
# normalitate la schimbarea făcută
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: se trunchiază %s la zero octeți? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "nu se suprascrie %s"
# Corectare:
# de la „scrie†la „citiâ€
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "nu se poate citi de la %s"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "nu se poate scrie la %s"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "nu se poate stat %s"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: nu este un fișier regulat"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: mod de fișier defectuos: 0%o"
@@ -271,46 +271,46 @@ msgstr "nu se poate restaura directorul de lucru curent"
# Schimbat de la: 1linia de asamblareâ€
# la: „tubul conectorâ€
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr "nu se pot stabili privilegiile"
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr "nu se poate stabili limita privilegiilor"
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "clasă de autentificare necunoscută %s"
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "nu se poate stabili contextul utilizatorului"
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "nu se poate stabili prioritatea procesului"
# Modificat, de la:
# „nu se poate schimba de root laâ€, la:
# „nu se poate schimba directorul rădăcină laâ€
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "nu se poate schimba directorul rădăcină la %s"
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "nu se poate schimba la uid-ul run_as (%u, %u)"
-#: src/exec.c:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "nu se poate schimba directorul la %s"
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "începând de la %s"
@@ -318,19 +318,18 @@ msgstr "începând de la %s"
# Modificare:
# de la: „nu se poate stabili mânerul pentru semnalulâ€
# la: „nu se poate stabili manipulantul pentru semnalulâ€
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "nu se poate stabili manipulantul pentru semnalul %d"
-#: src/exec.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr "modul de interceptare nu este acceptat cu SELinux RBAC pe acest sistem"
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr "nu se pot înregistra sub-comenzi cu SELinux RBAC pe acest sistem"
@@ -338,35 +337,43 @@ msgstr "nu se pot înregistra sub-comenzi cu SELinux RBAC pe acest sistem"
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "nu se poate elimina PRIV_PROC_EXEC de la PRIV_LIMIT"
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "nu se poate adăuga evenimentul la coadă"
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "comanda nu este stabilită de politica de securitate"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "comandă respinsă de politică"
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "eroare la modulul de aprobare"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "eroare de modul de politică"
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr "PolicyCheckRequest nevalid"
@@ -379,12 +386,12 @@ msgstr "PolicyCheckRequest nevalid"
# Eu, unul n-am posibilitatea de-a verifica în practică, toate mesajele...
# Acesta pare să fie un mesaj pentru LDAP..., iar
# eu nu utilizez LDAP
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "cererea clientului este prea mare: %zu"
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "nu se poate despacheta %s cu dimensiunea %zu"
@@ -393,16 +400,38 @@ msgstr "nu se poate despacheta %s cu dimensiunea %zu"
# „type_case cu o valoare neaÈ™teptată %d în %s de la %sâ€
# poate suna/era mai bine:
# „valoare (a) type_case neaÈ™teptată %d, în %s de la %sâ€
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "type_case cu o valoare neașteptată %d în %s de la %s"
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "mesaj de la server prea mare: %zu"
+# Modificare de la:
+# „Eroare de plugin I/Oâ€
+# la: „Eroare a modulului In/IeÈ™(I/O)â€
+# Pentru coerență cu restul traducerii, și nu numai...
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "Eroare a modulului In/IeÈ™(I/O)"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "comandă respinsă de modulul In/Ieș/(I/O)"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "eroare la suspendarea jurnalizării"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "eroare la schimbarea dimensiunii ferestrei"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "eroare la citirea de la socketpair"
@@ -419,142 +448,129 @@ msgstr "eroare la citirea de la socketpair"
msgid "unexpected reply type on backchannel: %d"
msgstr "tip de răspuns neașteptat pe backchannel: %d"
-#: src/exec_monitor.c:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "nu se poate stabili tty de control"
# Schimbat de la: „linia de asamblareâ€
# la: „tubul conectorâ€
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "nu se poate crea „tubul conectorâ€(pipe)"
# Modificat de la: „de la superiorâ€
# la: „de la procesul părinteâ€
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "nu se poate primi mesajul de la procesul părinte"
# Modificat de la:
# „nu se poate da forkâ€
# la: „nu se poate bifurcaâ€
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "nu se poate bifurca"
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "nu se poate restaura eticheta tty"
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "nu se poate executa %s"
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "modulul de politică a eșuat la inițializarea sesiunii"
-#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "nu se pot crea socluri"
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "eroare în bucla de eveniment"
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr "spațiu insuficient pentru argumentele de execve"
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
-msgstr "nu se poate citi execve %s pentru procesul %d"
+msgid "internal error, %s overflow"
+msgstr "eroare internă, supraplin %s"
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr "nu se pot configura registrele pentru procesul %d"
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr "procesul %d a ieșit în mod neașteptat"
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr "nu se poate configura filtrul seccomp"
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "argument interpret, era aÈ™teptat „%sâ€, s-a primit „%sâ€"
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr "nepotrivire în numele de cale, era aÈ™teptat „%sâ€, s-a primit „%sâ€"
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr "nepotrivire în %s[%d], era aÈ™teptat „%sâ€, s-a primit „%sâ€"
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "stare neașteptată a procesului %d: 0x%x"
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr "nu s-a putut obține mesajul de eveniment pentru procesul %d"
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr "nu se pot obține registrele pentru procesul %d"
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr "nu se poate aloca pty"
-# Modificare de la:
-# „Eroare de plugin I/Oâ€
-# la: „Eroare a modulului In/IeÈ™(I/O)â€
-# Pentru coerență cu restul traducerii, și nu numai...
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr "Eroare a modulului In/IeÈ™(I/O)"
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr "comandă respinsă de modulul In/Ieș/(I/O)"
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr "eroare la suspendarea jurnalizării"
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr "eroare la schimbarea dimensiunii ferestrei"
-
# Modificare:
# de la: „nu se poate stabili mânerul pentru semnalulâ€
# la: „nu se poate stabili manipulantul pentru semnalulâ€
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, c-format
msgid "unable to restore handler for signal %d"
msgstr "nu se poate restaura manipulantul pentru semnalul %d"
-#: src/exec_pty.c:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "nu se poate trimite mesajul la procesul de monitorizare"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, c-format
msgid "error in %s, line %d while loading plugin \"%s\""
msgstr "eroare în %s, linia %d în timpul încărcării modulului „%sâ€"
-#: src/load_plugins.c:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s trebuie să fie deținut de uid-ul %d"
@@ -566,22 +582,22 @@ msgstr "%s trebuie să fie deținut de uid-ul %d"
# în schimb, deținătorul decît deține ceva, deobicei este vremelnic(sau pe un timp determinat)
# Exp:
# arendașul, deține un teren(deobicei agricol, deci e un deținător de teren) drept pentru care se poate folosi de acel teren pe timpul și în condițiile financiare stabilite de proprietarul acelui teren(care este singurul care are drepturi depline asupra acelui teren.
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%s trebuie să fie inscriptibil doar de proprietar"
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "se ignoră modulul duplicat „%s†în %s, linia %d"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "nu se poate încărca %s: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "nu se poate găsi simbolul „%s†în %s"
@@ -593,83 +609,81 @@ msgstr "nu se poate găsi simbolul „%s†în %s"
# e posibil ca poziÈ›ia corectă a primei variabile, „%dâ€;
# să fie:
# „versiune majoră a modulului %d incompatibilăâ€
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, c-format
msgid "incompatible plugin major version %d (expected %d) found in %s"
msgstr "versiune majoră a modulului incompatibilă %d (se aștepta %d) găsită în %s"
-#: src/load_plugins.c:317
+#: src/load_plugins.c:319
#, c-format
msgid "ignoring policy plugin \"%s\" in %s, line %d"
msgstr "se ignoră modulul de politică „%s†în %s, linia %d"
-#: src/load_plugins.c:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "doar un singur modul de politică poate fi specificat"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "tip de modul necunoscut %d găsit în %s"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, c-format
msgid "policy plugin %s does not include a check_policy method"
msgstr "modulul de politică %s nu include o metodă check_policy"
-#: src/net_ifs.c:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "eroare internă, supraplin %s"
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "nume de variabilă de mediu nevalid: %s"
# Modificat de la: „mai mare decît sau egal cu 3â€
# la: „mai mare sau egal cu 3â€
-#: src/parse_args.c:314
+#: src/parse_args.c:317
msgid "the argument to -C must be a number greater than or equal to 3"
msgstr "argumentul la -C trebuie să fie un număr mai mare sau egal cu 3"
# Modificat de la: „trebuie să specificaÈ›i amândouă opÈ›iunile -i È™i -sâ€
# la: „nu puteÈ›i specifica ambele opÈ›iuni, -i È™i -sâ€
# ATENȚIE, și la traducerea următoare, mesajul de tradus este aproape identic acestuia, traducerea nu chiar...
-#: src/parse_args.c:545
+#: src/parse_args.c:554
msgid "you may not specify both the -i and -s options"
msgstr "nu puteți specifica ambele opțiuni, -i și -s"
-#: src/parse_args.c:550
+#: src/parse_args.c:559
msgid "you may not specify both the -i and -E options"
msgstr "nu puteți specifica amândouă opțiunile -i și -E"
-#: src/parse_args.c:560
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "opțiunea -E nu este validă în modul editare"
-#: src/parse_args.c:563
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr "nu puteți specifica variabile de mediu în modul editare"
-#: src/parse_args.c:573
+#: src/parse_args.c:582
msgid "the -U option may only be used with the -l option"
msgstr "opțiunea -U poate fi utilizată doar cu opțiunea -l"
-#: src/parse_args.c:577
+#: src/parse_args.c:586
msgid "the -A and -S options may not be used together"
msgstr "opțiunile -A și -S nu pot fi utilizate împreună"
-#: src/parse_args.c:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "sudoedit nu este suportat pe această platformă"
-#: src/parse_args.c:757
+#: src/parse_args.c:767
msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified"
msgstr "Doar una dintre opțiunile -e, -h, -i, -K, -l, -s, -v sau -V poate fi specificată"
-#: src/parse_args.c:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "Doar una dintre opțiunile -K, -k sau -N poate fi specificată"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -678,7 +692,7 @@ msgstr ""
"%s - editează fișiere ca alt utilizator\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -687,7 +701,7 @@ msgstr ""
"%s - execută o comandă ca alt utilizator\n"
"\n"
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -701,118 +715,118 @@ msgstr ""
# - „utilizează un program auxiliar pentru solicitarea paroleiâ€
# Recenzie, Daniel Șegărceanu: a doua variantă, sună mai bine.
# Am aplicat-o, în fond era și impresia mea, dar nu vroiam să modific prea mult fișierul...
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "utilizează un program auxiliar pentru solicitarea parolei"
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "utilizează un tip de autentificare BSD specificat"
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "rulează comanda în fundal"
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "sună din clopoțel atunci când se solicită"
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "închide toți descriptorii de fișier >= num"
-#: src/parse_args.c:798
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "rulează comanda cu clasa de autentificare BSD specificată"
-#: src/parse_args.c:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "schimbă directorul de lucru înainte de-a executa comanda"
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "păstrează mediul utilizatorului atunci când se rulează comanda"
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "păstrează variabile de mediu specifice"
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "editează fișiere în locul rulării unei comenzi"
# Modificat de la: „rulează comanda ca numele sau ID-ul de grup specificat"
# la:
# „rulează comanda ca grupul cu numele sau ID-ul specificatâ€
-#: src/parse_args.c:811
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "rulează comanda ca grupul cu numele sau ID-ul specificat"
-#: src/parse_args.c:814
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "stabilește variabila HOME să țintească spre directorul personal al utilizatorului"
-#: src/parse_args.c:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "afișează mesajul de ajutor și iese"
-#: src/parse_args.c:819
+#: src/parse_args.c:842
msgid "run command on host (if supported by plugin)"
msgstr "rulează comanda pe gazdă (dacă este suportat de modul)"
-#: src/parse_args.c:822
+#: src/parse_args.c:845
msgid "run login shell as the target user; a command may also be specified"
msgstr "rulează shell-ul de autentificare ca utilizatorul țintă; o comandă poate fi, de asemenea, specificată"
-#: src/parse_args.c:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "elimină complet fișierul de datare"
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "invalidează fișierul de datare"
-#: src/parse_args.c:830
+#: src/parse_args.c:853
msgid "list user's privileges or check a specific command; use twice for longer format"
msgstr "listează privilegiile utilizatorului sau verifică o comandă specifică; utilizează de două ori pentru formatul mai lung"
-#: src/parse_args.c:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "mod neinteractiv, nu sunt utilizate solicitări"
-#: src/parse_args.c:836
+#: src/parse_args.c:859
msgid "preserve group vector instead of setting to target's"
msgstr "păstrează vectorul grupului în loc să configurați pe cel al țintei"
-#: src/parse_args.c:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "utilizează solicitarea de parolă specificată"
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "schimbă la directorul rădăcină, înainte de a rula comanda"
-#: src/parse_args.c:844
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "creează contextul de securitate SELinux cu rolul specificat"
-#: src/parse_args.c:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "citește parola de la intrarea standard"
-#: src/parse_args.c:850
+#: src/parse_args.c:873
msgid "run shell as the target user; a command may also be specified"
msgstr "rulează shell-ul ca utilizatorul țintă; o comandă poate fi, de asemenea, specificată"
-#: src/parse_args.c:854
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "creează contextul de securitate SELinux cu tipul specificat"
-#: src/parse_args.c:857
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "termină comanda după limita de timp specificată"
-#: src/parse_args.c:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "în modul listă, afișează privilegiile pentru utilizator"
@@ -820,19 +834,19 @@ msgstr "în modul listă, afișează privilegiile pentru utilizator"
# „rulează comanda (sau fiÈ™ierul de editare) ca nume specificat sau ID de utilizatorâ€
# la:
# „rulează comanda (sau editează fiÈ™ierul) ca utilizator cu numele sau ID-ul specificatâ€
-#: src/parse_args.c:863
+#: src/parse_args.c:886
msgid "run command (or edit file) as specified user name or ID"
msgstr "rulează comanda (sau editează fișierul) ca utilizator cu numele sau ID-ul specificat"
-#: src/parse_args.c:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "afișează informațiile de versiune și iese"
-#: src/parse_args.c:868
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr "actualizează datarea utilizatorului fără să se ruleze o comandă"
-#: src/parse_args.c:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "oprește procesarea argumentelor în linia de comandă"
@@ -932,37 +946,42 @@ msgstr "nu se poate stabili contextul exec la %s"
msgid "unable to set key creation context to %s"
msgstr "nu se poate stabili contextul de creare a cheii la %s"
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "necesită cel puțin un argument"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "Doar una dintre opțiunile -c sau -i poate fi specificată"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "număr de descriptor de fișier nevalid: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "nu se poate rula %s ca shell de autentificare"
+msgid "The -%c option may not be used in edit mode."
+msgstr "Opțiunea -%c nu poate fi utilizată în modul de editare."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:184 src/sesh.c:189
+#, c-format
+msgid "The -%c option may only be used in edit mode."
+msgstr "Opțiunea -%c poate fi utilizată numai în modul de editare."
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: editarea legăturilor simbolice nu este permisă"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, c-format
msgid "%s: editing files in a writable directory is not permitted"
msgstr "%s: editarea fișierelor într-un director inscriptibil nu este permisă"
-#: src/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "conținutul sesiunii de editare rămase în %s"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "nu se poate obține lista de grup %s"
@@ -1053,120 +1072,124 @@ msgstr "nu existați în baza de date %s"
msgid "unable to determine tty"
msgstr "nu se poate determina tty"
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "Este setat indicatorul „fără privilegii noiâ€, ceea ce împiedică rularea «sudo» ca root."
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "Dacă «sudo» rulează într-un container, poate fi necesar să ajustați configurația containerului pentru a dezactiva indicatorul."
-#: src/sudo.c:961
+#: src/sudo.c:954
#, c-format
msgid "%s must be owned by uid %d and have the setuid bit set"
msgstr "%s trebuie să fie deținut de uid-ul %d și să aibă bitul setuid stabilit"
# Notă: eficient -> efectiv
-#: src/sudo.c:964
+#: src/sudo.c:957
#, 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-ul efectiv nu este %d, este %s pe un sistem de fișiere cu opțiunea „nosuid†stabilită sau un sistem de fișiere NFS fără privilegii de root?"
-#: src/sudo.c:970
+#: src/sudo.c:963
#, c-format
msgid "effective uid is not %d, is sudo installed setuid root?"
msgstr "uid-ul efectiv nu este %d, este sudo instalat root setuid?"
-#: src/sudo.c:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "nu se pot stabili ID-urile de grup suplimentare"
# Notă: eficiente -> efective
-#: src/sudo.c:993
+#: src/sudo.c:986
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr "nu se pot stabili gid-uri efective către gid-uri run_as %u"
-#: src/sudo.c:999
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "nu se poate stabili gid-ul către gid-ul run_as %u"
-#: src/sudo.c:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "argv nu este stabilit de politica de securitate"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "envp nu este stabilit de politica de securitate"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "condiție de terminare a procesului copil neașteptată: %d"
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "nu se poate inițializa modulul de politică"
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "modulului de politică %s îi lipseÈ™te metoda „check_policyâ€"
-#: src/sudo.c:1257
+#: src/sudo.c:1269
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr "modulul de politică %s nu suportă listarea privilegiilor"
-#: src/sudo.c:1301
+#: src/sudo.c:1313
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr "modulul de politică %s nu suportă opțiunea -v"
-#: src/sudo.c:1339
+#: src/sudo.c:1351
#, c-format
msgid "policy plugin %s does not support the -k/-K options"
msgstr "modulul de politică %s nu suportă opțiunile -k/-K"
-#: src/sudo.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "eroare la inițializarea modulului In/Ieș(I/O) %s"
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "eroare la inițializarea modulului In/Ieș(I/O)"
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "eroare la inițializarea modulului auditare %s"
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: nu se poate înregistra evenimentul de eroare%s%s"
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: nu se poate înregistra evenimentul de acceptare%s%s"
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "eroare a modulului de auditare"
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: nu se poate înregistra evenimentul de respingere%s%s"
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "eroare la inițializarea modulului de aprobare %s"
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "comandă respinsă de aprobator"
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr "eroare la modulul de aprobare"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "nu s-a găsit niciun director temporar inscriptibil"
@@ -1176,7 +1199,7 @@ msgstr "nu s-a găsit niciun director temporar inscriptibil"
msgid "%s left unmodified"
msgstr "%s lăsat nemodificat"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s neschimbat"
@@ -1189,37 +1212,37 @@ msgstr "sesh: eroare internă: număr impar de căi(paths)"
msgid "sesh: unable to create temporary files"
msgstr "sesh: nu se pot crea fișierele temporare"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: omorât de un semnal"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: eroare necunoscută %d"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
msgid "unable to copy temporary files back to their original location"
msgstr "nu se pot copia fișierele temporare înapoi la locația lor originală"
-#: src/sudo_edit.c:606
+#: src/sudo_edit.c:601
msgid "unable to copy some of the temporary files back to their original location"
msgstr "nu se pot copia o parte din fișierele temporare înapoi la locația lor originală"
-#: src/sudo_edit.c:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "nu se poate schimba uid-ul la root (%u)"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "eroare de modul: lipsește lista de fișiere pentru sudoedit"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "nu se poate citi ceasul"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "portul de interceptare nu este definit"
@@ -1270,6 +1293,18 @@ msgstr "nu se poate dup2 stdin"
msgid "unable to restore stdin"
msgstr "nu se poate restaura stdin"
+#~ msgid "insufficient space for execve arguments"
+#~ msgstr "spațiu insuficient pentru argumentele de execve"
+
+#~ msgid "unable to read execve %s for process %d"
+#~ msgstr "nu se poate citi execve %s pentru procesul %d"
+
+#~ msgid "requires at least one argument"
+#~ msgstr "necesită cel puțin un argument"
+
+#~ msgid "unable to run %s as a login shell"
+#~ msgstr "nu se poate rula %s ca shell de autentificare"
+
#~ msgid "%s%s: %s"
#~ msgstr "%s%s: %s"
diff --git a/po/sr.mo b/po/sr.mo
index f13442f7e..f8305f548 100644
--- a/po/sr.mo
+++ b/po/sr.mo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 5a2ef2423..22198ceff 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -1,12 +1,13 @@
# Serbian translations for sudo package.
# This file is put in the public domain.
# МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>, 2011–2022.
+#
msgid ""
msgstr ""
-"Project-Id-Version: sudo-1.9.10b1\n"
+"Project-Id-Version: sudo-1.9.11b1\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-02-12 09:31-0700\n"
-"PO-Revision-Date: 2022-02-15 21:21+0200\n"
+"POT-Creation-Date: 2022-05-27 08:39-0600\n"
+"PO-Revision-Date: 2022-09-08 20:38+0200\n"
"Last-Translator: МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <(nothing)>\n"
"Language: sr\n"
@@ -32,32 +33,33 @@ msgstr "не могу да повратим региÑтар"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:206 src/exec_monitor.c:456
-#: src/exec_monitor.c:462 src/exec_monitor.c:470 src/exec_monitor.c:478
-#: src/exec_monitor.c:485 src/exec_monitor.c:492 src/exec_monitor.c:499
-#: src/exec_monitor.c:506 src/exec_monitor.c:513 src/exec_monitor.c:520
-#: src/exec_monitor.c:527 src/exec_nopty.c:219 src/exec_nopty.c:228
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:306 src/exec_nopty.c:503
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_pty.c:840
-#: src/exec_pty.c:849 src/exec_pty.c:906 src/exec_pty.c:1059
-#: src/exec_pty.c:1231 src/exec_pty.c:1240 src/exec_pty.c:1247
-#: src/exec_pty.c:1254 src/exec_pty.c:1261 src/exec_pty.c:1268
-#: src/exec_pty.c:1275 src/exec_pty.c:1282 src/exec_pty.c:1289
-#: src/exec_pty.c:1296 src/exec_pty.c:1303 src/exec_pty.c:1311
-#: src/exec_pty.c:1774 src/load_plugins.c:156 src/load_plugins.c:181
+#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:224 src/exec_nopty.c:233
+#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
+#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
+#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
+#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
+#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
+#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
+#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
+#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
+#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
+#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
+#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
+#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:192 src/parse_args.c:213 src/parse_args.c:287
-#: src/parse_args.c:632 src/parse_args.c:654 src/parse_args.c:679
+#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
+#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:483 src/sesh.c:113
+#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:709 src/sudo.c:719 src/sudo.c:744 src/sudo.c:767
-#: src/sudo.c:776 src/sudo.c:785 src/sudo.c:802 src/sudo.c:844 src/sudo.c:854
-#: src/sudo.c:883 src/sudo.c:1083 src/sudo.c:1104 src/sudo.c:1397
-#: src/sudo.c:1566 src/sudo.c:1793 src/sudo.c:2127 src/sudo_edit.c:89
+#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
+#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
+#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
+#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
@@ -69,36 +71,36 @@ msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:100
-#: src/exec_intercept.c:330 src/exec_intercept.c:354 src/exec_intercept.c:377
-#: src/exec_intercept.c:385 src/exec_intercept.c:410 src/exec_intercept.c:416
-#: src/exec_intercept.c:425 src/exec_intercept.c:431 src/exec_intercept.c:565
-#: src/exec_intercept.c:706 src/exec_monitor.c:456 src/exec_monitor.c:462
-#: src/exec_monitor.c:470 src/exec_monitor.c:478 src/exec_monitor.c:485
-#: src/exec_monitor.c:492 src/exec_monitor.c:499 src/exec_monitor.c:506
-#: src/exec_monitor.c:513 src/exec_monitor.c:520 src/exec_monitor.c:527
-#: src/exec_nopty.c:219 src/exec_nopty.c:228 src/exec_nopty.c:235
-#: src/exec_nopty.c:242 src/exec_nopty.c:249 src/exec_nopty.c:256
-#: src/exec_nopty.c:263 src/exec_nopty.c:270 src/exec_nopty.c:277
-#: src/exec_nopty.c:284 src/exec_nopty.c:291 src/exec_nopty.c:298
-#: src/exec_nopty.c:306 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_pty.c:840 src/exec_pty.c:849 src/exec_pty.c:906
-#: src/exec_pty.c:1231 src/exec_pty.c:1240 src/exec_pty.c:1247
-#: src/exec_pty.c:1254 src/exec_pty.c:1261 src/exec_pty.c:1268
-#: src/exec_pty.c:1275 src/exec_pty.c:1282 src/exec_pty.c:1289
-#: src/exec_pty.c:1296 src/exec_pty.c:1303 src/exec_pty.c:1311
-#: src/exec_pty.c:1774 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:192 src/parse_args.c:214 src/parse_args.c:287
-#: src/parse_args.c:632 src/parse_args.c:654 src/parse_args.c:679
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:483 src/sesh.c:113
-#: src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:883 src/sudo.c:1083
-#: src/sudo.c:1104 src/sudo.c:1397 src/sudo.c:1566 src/sudo.c:1793
-#: src/sudo.c:2127 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
-#: src/sudo_edit.c:438 src/sudo_edit.c:539 src/sudo_edit.c:546
-#: src/sudo_edit.c:677 src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
+#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
+#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
+#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
+#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
+#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
+#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
+#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
+#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
+#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
+#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
+#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
+#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
+#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
+#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
+#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
+#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
+#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
+#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
+#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
+#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
+#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
+#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
+#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
+#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
+#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
msgid "unable to allocate memory"
msgstr "не могу да доделим меморију"
@@ -195,6 +197,15 @@ msgstr "%s је ÑветÑки упиÑив"
msgid "%s is group writable"
msgstr "%s је групно упиÑив"
+#: src/apparmor.c:79
+msgid "failed to determine AppArmor confinement"
+msgstr "ниÑам уÑпео да одредим оивичење ÐпÐрмора"
+
+#: src/apparmor.c:87
+#, c-format
+msgid "unable to change AppArmor profile to %s"
+msgstr "не могу да променим ÐпÐрмор профил на „%s“"
+
#: src/copy_file.c:93
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
@@ -229,95 +240,115 @@ msgstr "%s: лош режим датотеке: 0%o"
msgid "unable to restore current working directory"
msgstr "не могу да повратим текући радни директоријум"
-#: src/exec.c:130
+#: src/exec.c:103
+msgid "unable to set privileges"
+msgstr "не могу да поÑтавим привилегије"
+
+#: src/exec.c:109 src/exec.c:114
+msgid "unable to set limit privileges"
+msgstr "не могу да поÑтавим привилегије ограничења"
+
+#: src/exec.c:137
#, c-format
msgid "unknown login class %s"
msgstr "непозната клаÑа пријаве %s"
-#: src/exec.c:142
+#: src/exec.c:149
msgid "unable to set user context"
msgstr "не могу да подеÑим кориÑнички контекÑÑ‚"
-#: src/exec.c:158
+#: src/exec.c:165
msgid "unable to set process priority"
msgstr "не могу да подеÑим приоритет процеÑа"
-#: src/exec.c:175
+#: src/exec.c:182
#, c-format
msgid "unable to change root to %s"
msgstr "не могу да променим админиÑтратора на %s"
-#: src/exec.c:188 src/exec.c:194 src/exec.c:201
+#: src/exec.c:195 src/exec.c:201 src/exec.c:208
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "не могу да Ñе пребацим у покрени_као уид (%u, %u)"
-#: src/exec.c:219
+#: src/exec.c:226
#, c-format
msgid "unable to change directory to %s"
msgstr "не могу да променим директоријум у %s"
-#: src/exec.c:223
+#: src/exec.c:230
#, c-format
msgid "starting from %s"
msgstr "почевши од „%s“"
-#: src/exec.c:305 src/exec_monitor.c:565 src/exec_monitor.c:567
-#: src/exec_nopty.c:561 src/exec_pty.c:581 src/exec_pty.c:1411
-#: src/exec_pty.c:1413 src/signal.c:144 src/signal.c:151 src/signal.c:165
+#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
+#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
+#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
+#: src/signal.c:165 src/suspend_nopty.c:89
#, c-format
msgid "unable to set handler for signal %d"
msgstr "не могу да подеÑим руковаоца за Ñигнал „%d“"
+#: src/exec.c:391
+msgid "intercept mode is not supported with SELinux RBAC on this system"
+msgstr "режим преÑретања није подржан Ñа Ð¡Ð•Ð›Ð¸Ð½ÑƒÐºÑ Ð Ð‘ÐЦ-ом на овом ÑиÑтему"
+
+#: src/exec.c:396
+msgid "unable to log sub-commands with SELinux RBAC on this system"
+msgstr "не могу да забележим Ñадржане наредбе Ñа Ð¡Ð•Ð›Ð¸Ð½ÑƒÐºÑ Ð Ð‘ÐЦ-ом на овом ÑиÑтему"
+
#: src/exec_common.c:56
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "не могу да уклоним PRIV_PROC_EXEC из PRIV_LIMIT"
-#: src/exec_intercept.c:112 src/exec_intercept.c:116 src/exec_intercept.c:667
-#: src/exec_intercept.c:671 src/exec_intercept.c:857 src/exec_intercept.c:861
-#: src/exec_intercept.c:872 src/exec_intercept.c:876 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:221 src/exec_nopty.c:230 src/exec_nopty.c:237
-#: src/exec_nopty.c:244 src/exec_nopty.c:251 src/exec_nopty.c:258
-#: src/exec_nopty.c:265 src/exec_nopty.c:272 src/exec_nopty.c:279
-#: src/exec_nopty.c:286 src/exec_nopty.c:293 src/exec_nopty.c:300
-#: src/exec_nopty.c:308 src/exec_pty.c:706 src/exec_pty.c:711
-#: src/exec_pty.c:808 src/exec_pty.c:815 src/exec_pty.c:912
-#: src/exec_pty.c:1233 src/exec_pty.c:1242 src/exec_pty.c:1249
-#: src/exec_pty.c:1256 src/exec_pty.c:1263 src/exec_pty.c:1270
-#: src/exec_pty.c:1277 src/exec_pty.c:1284 src/exec_pty.c:1291
-#: src/exec_pty.c:1298 src/exec_pty.c:1305 src/exec_pty.c:1727
-#: src/exec_pty.c:1737 src/exec_pty.c:1782 src/exec_pty.c:1789
-#: src/exec_pty.c:1816
+#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
+#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
+#: src/exec_monitor.c:482 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_nopty.c:226
+#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
+#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
+#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
+#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
+#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
+#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
+#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
+#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
+#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
+#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
+#: src/exec_pty.c:1826 src/exec_pty.c:1853
msgid "unable to add event to queue"
msgstr "не могу да додам догађај у ред"
-#: src/exec_intercept.c:314
-msgid "invalid PolicyCheckRequest"
-msgstr "неиÑправан захтев провере политике"
-
-#: src/exec_intercept.c:362 src/sudo.c:1209 src/sudo.c:1254 src/sudo.c:1298
+#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
msgid "command rejected by policy"
msgstr "наредба је одбачена политиком"
-#: src/exec_intercept.c:455 src/sudo.c:1214 src/sudo.c:1259 src/sudo.c:1303
-#: src/sudo.c:1377
+#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
+#: src/sudo.c:1394
msgid "policy plugin error"
msgstr "грешка прикључка политике"
-#: src/exec_intercept.c:561
+#: src/exec_intercept.c:462
+msgid "invalid PolicyCheckRequest"
+msgstr "неиÑправан захтев провере политике"
+
+#: src/exec_intercept.c:584
#, c-format
msgid "client request too large: %zu"
msgstr "захтев клијента је превелик: %zu"
-#: src/exec_intercept.c:659
+#: src/exec_intercept.c:622
+#, c-format
+msgid "unable to unpack %s size %zu"
+msgstr "не могу да раÑпакујем „%s“ величине %zu"
+
+#: src/exec_intercept.c:665
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "неочекивана вредноÑÑ‚ врÑте_Ñлова %d у „%s“ из „%s“"
-#: src/exec_intercept.c:694
+#: src/exec_intercept.c:695
#, c-format
msgid "server message too large: %zu"
msgstr "порука Ñервера је превелика: %zu"
@@ -331,73 +362,117 @@ msgstr "грешка у читању из пара прикључка"
msgid "unexpected reply type on backchannel: %d"
msgstr "неочекивана врÑта одговора на повратном каналу: %d"
-#: src/exec_monitor.c:583
+#: src/exec_monitor.c:593
msgid "unable to set controlling tty"
msgstr "не могу да подеÑим контролиÑање tty"
-#: src/exec_monitor.c:591 src/exec_nopty.c:369 src/exec_pty.c:1490
-#: src/exec_pty.c:1511 src/exec_pty.c:1531 src/tgetpass.c:307
+#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
+#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "не могу да направим Ñпојку"
-#: src/exec_monitor.c:601
+#: src/exec_monitor.c:611
msgid "unable to receive message from parent"
msgstr "не могу да примим поруку од родитеља"
-#: src/exec_monitor.c:617 src/exec_nopty.c:407 src/exec_pty.c:1569
-#: src/sudo_edit.c:361 src/tgetpass.c:311
+#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "не могу да поделим"
-#: src/exec_monitor.c:621 src/exec_monitor.c:722 src/exec_nopty.c:471
+#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
msgid "unable to restore tty label"
msgstr "не могу да повратим tty натпиÑ"
-#: src/exec_monitor.c:637 src/sesh.c:123 src/sudo.c:1160
+#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
#, c-format
msgid "unable to execute %s"
msgstr "не могу да извршим %s"
-#: src/exec_nopty.c:363 src/exec_pty.c:1420
+#: src/exec_nopty.c:376 src/exec_pty.c:1456
msgid "policy plugin failed session initialization"
msgstr "није уÑпело покретање ÑеÑије прикључка политике"
-#: src/exec_nopty.c:377 src/exec_pty.c:1391 src/exec_pty.c:1399
+#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
msgid "unable to create sockets"
msgstr "не могу да направим утичнице"
-#: src/exec_nopty.c:459 src/exec_pty.c:1666
+#: src/exec_nopty.c:506 src/exec_pty.c:1703
msgid "error in event loop"
msgstr "грешка у петљи догађаја"
-#: src/exec_nopty.c:569 src/exec_pty.c:619 src/signal.c:101
+#: src/exec_ptrace.c:647
+msgid "insufficient space for execve arguments"
+msgstr "недовољно проÑтора за „execve“ аргументе"
+
+#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
#, c-format
-msgid "unable to restore handler for signal %d"
-msgstr "не могу да повратим руковаоца за Ñигнал „%d“"
+msgid "unable to read execve %s for process %d"
+msgstr "не могу да прочитам „execve %s“ за Ð¿Ñ€Ð¾Ñ†ÐµÑ %d"
+
+#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#, c-format
+msgid "unable to set registers for process %d"
+msgstr "не могу да поÑтавим региÑтре за Ð¿Ñ€Ð¾Ñ†ÐµÑ %d"
-#: src/exec_pty.c:158
+#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#, c-format
+msgid "process %d exited unexpectedly"
+msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ %d је изашао неочекивано"
+
+#: src/exec_ptrace.c:843
+msgid "unable to set seccomp filter"
+msgstr "не могу да поÑтавим „seccomp“ филтер"
+
+#: src/exec_ptrace.c:934
+#, c-format
+msgid "pathname mismatch, expected \"%s\", got \"%s\""
+msgstr "назив путање не одговара, очекивах „%s“, добих „%s“"
+
+#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
+#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#, c-format
+msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
+msgstr "%s[%d] не одговара, очекивах „%s“, добих „%s“"
+
+#: src/exec_ptrace.c:1013
+#, c-format
+msgid "unable to get event message for process %d"
+msgstr "не могу да добавим поруку догађаја за Ð¿Ñ€Ð¾Ñ†ÐµÑ %d"
+
+#: src/exec_ptrace.c:1019
+#, c-format
+msgid "unable to get registers for process %d"
+msgstr "не могу да добавим региÑтре за Ð¿Ñ€Ð¾Ñ†ÐµÑ %d"
+
+#: src/exec_pty.c:163
msgid "unable to allocate pty"
msgstr "не могу да доделим pty"
-#: src/exec_pty.c:222 src/exec_pty.c:262 src/exec_pty.c:302 src/exec_pty.c:353
-#: src/exec_pty.c:404
+#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
+#: src/exec_pty.c:409
msgid "I/O plugin error"
msgstr "грешка У/И прикључка"
-#: src/exec_pty.c:226 src/exec_pty.c:266 src/exec_pty.c:306 src/exec_pty.c:357
-#: src/exec_pty.c:408
+#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
+#: src/exec_pty.c:413
msgid "command rejected by I/O plugin"
msgstr "наредбу је одбацио У/И прикључак"
-#: src/exec_pty.c:455
+#: src/exec_pty.c:460
msgid "error logging suspend"
msgstr "грешка обуÑтаве пиÑања дневника"
-#: src/exec_pty.c:489
+#: src/exec_pty.c:494
msgid "error changing window size"
msgstr "грешка промене величине прозора"
-#: src/exec_pty.c:1615
+#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#, c-format
+msgid "unable to restore handler for signal %d"
+msgstr "не могу да повратим руковаоца за Ñигнал „%d“"
+
+#: src/exec_pty.c:1651
msgid "unable to send message to monitor process"
msgstr "не могу да пошаљем поруку процеÑу праћења"
@@ -463,48 +538,48 @@ msgstr "прикључак ÑигурноÑти %s не Ñадржи метод
msgid "internal error, %s overflow"
msgstr "унутрашња грешка, прекорачење функције „%s“"
-#: src/parse_args.c:234
+#: src/parse_args.c:211
#, c-format
msgid "invalid environment variable name: %s"
msgstr "неиÑправан назив променљиве окружења: %s"
-#: src/parse_args.c:337
+#: src/parse_args.c:314
msgid "the argument to -C must be a number greater than or equal to 3"
msgstr "аргумент уз -C мора бити број већи или једнак 3"
-#: src/parse_args.c:568
+#: src/parse_args.c:545
msgid "you may not specify both the -i and -s options"
msgstr "не можете да наведете обе опције „-i“ и „-s“"
-#: src/parse_args.c:573
+#: src/parse_args.c:550
msgid "you may not specify both the -i and -E options"
msgstr "не можете да наведете обе опције „-i“ и „-E“"
-#: src/parse_args.c:583
+#: src/parse_args.c:560
msgid "the -E option is not valid in edit mode"
msgstr "опција „-E“ није иÑправна у режиму уређивања"
-#: src/parse_args.c:586
+#: src/parse_args.c:563
msgid "you may not specify environment variables in edit mode"
msgstr "не можете да одредите променљиве окружења у режиму уређивања"
-#: src/parse_args.c:596
+#: src/parse_args.c:573
msgid "the -U option may only be used with the -l option"
msgstr "опција „-U“ може бити коришћена Ñамо Ñа опцијом „-l“"
-#: src/parse_args.c:600
+#: src/parse_args.c:577
msgid "the -A and -S options may not be used together"
msgstr "опције „-A“ и „-S“ не могу бити коришћене заједно"
-#: src/parse_args.c:693
+#: src/parse_args.c:674
msgid "sudoedit is not supported on this platform"
msgstr "„sudoedit“ није подржано на овој платформи"
-#: src/parse_args.c:776
+#: src/parse_args.c:757
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:792
+#: src/parse_args.c:773
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -513,7 +588,7 @@ msgstr ""
"%s — уредите датотеке као други кориÑник\n"
"\n"
-#: src/parse_args.c:794
+#: src/parse_args.c:775
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -522,7 +597,7 @@ msgstr ""
"%s — извршите наредбу као други кориÑник\n"
"\n"
-#: src/parse_args.c:800
+#: src/parse_args.c:781
msgid ""
"\n"
"Options:\n"
@@ -530,131 +605,131 @@ msgstr ""
"\n"
"Опције:\n"
-#: src/parse_args.c:802
+#: src/parse_args.c:783
msgid "use a helper program for password prompting"
msgstr "кориÑти програм иÑпомоћи за упит лозинке"
-#: src/parse_args.c:805
+#: src/parse_args.c:786
msgid "use specified BSD authentication type"
msgstr "кориÑти наведену врÑту БСД потврде идентитета"
-#: src/parse_args.c:809
+#: src/parse_args.c:790
msgid "run command in the background"
msgstr "покреће наредбу у позадини"
-#: src/parse_args.c:812
+#: src/parse_args.c:793
msgid "ring bell when prompting"
msgstr "звони приликом поÑтављања упита"
-#: src/parse_args.c:814
+#: src/parse_args.c:795
msgid "close all file descriptors >= num"
msgstr "затвара Ñве опиÑнике датотеке >= fd"
-#: src/parse_args.c:817
+#: src/parse_args.c:798
msgid "run command with the specified BSD login class"
msgstr "покреће наредбу Ñа наведеним разредом БСД пријаве"
-#: src/parse_args.c:820
+#: src/parse_args.c:801
msgid "change the working directory before running command"
msgstr "мења радни директоријум пре покретања наредбе"
-#: src/parse_args.c:823
+#: src/parse_args.c:804
msgid "preserve user environment when running command"
msgstr "чува кориÑничко окружење приликом покретања наредбе"
-#: src/parse_args.c:825
+#: src/parse_args.c:806
msgid "preserve specific environment variables"
msgstr "чува нарочите променљиве окружења"
-#: src/parse_args.c:827
+#: src/parse_args.c:808
msgid "edit files instead of running a command"
msgstr "уређује датотеке умеÑто да изврши наредбу"
-#: src/parse_args.c:830
+#: src/parse_args.c:811
msgid "run command as the specified group name or ID"
msgstr "извршава наредбу као наведени назив групе или ИБ"
-#: src/parse_args.c:833
+#: src/parse_args.c:814
msgid "set HOME variable to target user's home dir"
msgstr "подешава променљиву ЛИЧÐО у циљну кориÑничку личну фаÑциклу"
-#: src/parse_args.c:836
+#: src/parse_args.c:817
msgid "display help message and exit"
msgstr "приказује поруку помоћи и излази"
-#: src/parse_args.c:838
+#: src/parse_args.c:819
msgid "run command on host (if supported by plugin)"
msgstr "покреће наредбу на домаћину (ако је подржано прикључком)"
-#: src/parse_args.c:841
+#: src/parse_args.c:822
msgid "run login shell as the target user; a command may also be specified"
msgstr "покреће љуÑку пријаве као крајњи кориÑник; наредба може такође бити наведена"
-#: src/parse_args.c:843
+#: src/parse_args.c:824
msgid "remove timestamp file completely"
msgstr "потпуно уклања датотеку запиÑа датума и времена"
-#: src/parse_args.c:846
+#: src/parse_args.c:827
msgid "invalidate timestamp file"
msgstr "чини неиÑправном датотеку датума и времена"
-#: src/parse_args.c:849
+#: src/parse_args.c:830
msgid "list user's privileges or check a specific command; use twice for longer format"
msgstr "иÑпиÑује привилегије кориÑника или проверава поÑебну наредбу; кориÑти Ñе двапута за дуже запиÑе"
-#: src/parse_args.c:852
+#: src/parse_args.c:833
msgid "non-interactive mode, no prompts are used"
msgstr "немеђудејÑтвени режим, не кориÑти упите"
-#: src/parse_args.c:855
+#: src/parse_args.c:836
msgid "preserve group vector instead of setting to target's"
msgstr "чува вектор групе умеÑто да подеÑи на циљеве"
-#: src/parse_args.c:858
+#: src/parse_args.c:839
msgid "use the specified password prompt"
msgstr "кориÑти упит наведене лозинке"
-#: src/parse_args.c:860
+#: src/parse_args.c:841
msgid "change the root directory before running command"
msgstr "мења корени директоријум пре покретања наредбе"
-#: src/parse_args.c:863
+#: src/parse_args.c:844
msgid "create SELinux security context with specified role"
msgstr "Ñтвара Ð¡Ð•Ð›Ð¸Ð½ÑƒÐºÑ ÑигурноÑни контекÑÑ‚ Ñа наведеном улогом"
-#: src/parse_args.c:866
+#: src/parse_args.c:847
msgid "read password from standard input"
msgstr "чита лозинку Ñа Ñтандардног улаза"
-#: src/parse_args.c:869
+#: src/parse_args.c:850
msgid "run shell as the target user; a command may also be specified"
msgstr "покреће љуÑку као крајњи кориÑник; наредба такође може бити наведена"
-#: src/parse_args.c:873
+#: src/parse_args.c:854
msgid "create SELinux security context with specified type"
msgstr "Ñтвара Ð¡Ð•Ð›Ð¸Ð½ÑƒÐºÑ ÑигурноÑни контекÑÑ‚ Ñа наведеном улогом"
-#: src/parse_args.c:876
+#: src/parse_args.c:857
msgid "terminate command after the specified time limit"
msgstr "окончава наредбу након наведеног временÑког ограничења"
-#: src/parse_args.c:879
+#: src/parse_args.c:860
msgid "in list mode, display privileges for user"
msgstr "у режиму ÑпиÑка, приказује привилегије за кориÑника"
-#: src/parse_args.c:882
+#: src/parse_args.c:863
msgid "run command (or edit file) as specified user name or ID"
msgstr "покреће наредбу (или уређује датотеку) као наведени кориÑник"
-#: src/parse_args.c:884
+#: src/parse_args.c:865
msgid "display version information and exit"
msgstr "приказује податке о издању и излази"
-#: src/parse_args.c:887
+#: src/parse_args.c:868
msgid "update user's timestamp without running a command"
msgstr "оÑвежава кориÑнички Ð·Ð°Ð¿Ð¸Ñ Ð´Ð°Ñ‚ÑƒÐ¼Ð° и времена без покретања наредбе"
-#: src/parse_args.c:890
+#: src/parse_args.c:871
msgid "stop processing command line arguments"
msgstr "зауÑтавља обрађивање аргумената линије наредби"
@@ -868,115 +943,115 @@ msgstr "не поÑтојите у „%s“ бази података"
msgid "unable to determine tty"
msgstr "не могу да одредим конзолу"
-#: src/sudo.c:908
+#: src/sudo.c:925
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "Опција „no new privileges“ је поÑтављена, што Ñпречава „sudo“-а да ради као админиÑтратор."
-#: src/sudo.c:910
+#: src/sudo.c:927
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "Ðко Ñудо ради у Ñадржаоцу, треба да прилагодите подешавање Ñадржаоца да иÑкључи опцију."
-#: src/sudo.c:944
+#: src/sudo.c:961
#, c-format
msgid "%s must be owned by uid %d and have the setuid bit set"
msgstr "%s мора бити влаÑништвo уида %d и треба да има подешен бит „setuid“"
-#: src/sudo.c:947
+#: src/sudo.c:964
#, 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:953
+#: src/sudo.c:970
#, c-format
msgid "effective uid is not %d, is sudo installed setuid root?"
msgstr "Ñтварни уид није %d, већ Ñетуид админиÑтратор инÑталиран Ñудоом?"
-#: src/sudo.c:969 src/tgetpass.c:333
+#: src/sudo.c:986 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "не могу да подеÑим додатне ИБ-ове групе"
-#: src/sudo.c:976
+#: src/sudo.c:993
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr "не могу да подеÑим ефективан гид да Ñе покрене_као гид %u"
-#: src/sudo.c:982
+#: src/sudo.c:999
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "не могу да подеÑим гид да Ñе покрене као гид %u"
-#: src/sudo.c:1025
+#: src/sudo.c:1042
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "неочекивани уÑлов завршетка потпроцеÑа: %d"
-#: src/sudo.c:1132
+#: src/sudo.c:1149
msgid "unable to initialize policy plugin"
msgstr "не могу да започнем прикључак ÑигурноÑти"
-#: src/sudo.c:1194
+#: src/sudo.c:1211
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "прикључак ÑигурноÑти %s не Ñадржи метод „check_policy“"
-#: src/sudo.c:1240
+#: src/sudo.c:1257
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr "прикључак ÑигурноÑти %s не подржава привилегије иÑпиÑивања"
-#: src/sudo.c:1284
+#: src/sudo.c:1301
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr "прикључак ÑигурноÑти %s не подржава опцију -v"
-#: src/sudo.c:1322
+#: src/sudo.c:1339
#, c-format
msgid "policy plugin %s does not support the -k/-K options"
msgstr "прикључак ÑигурноÑти %s не подржава опције -k/-K"
-#: src/sudo.c:1451
+#: src/sudo.c:1468
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "грешка приликом покретања У/И прикључка %s"
-#: src/sudo.c:1454
+#: src/sudo.c:1471
msgid "error initializing I/O plugin"
msgstr "грешка приликом покретања У/И прикључка"
-#: src/sudo.c:1603
+#: src/sudo.c:1620
#, c-format
msgid "error initializing audit plugin %s"
msgstr "грешка покретања аудит прикључка „%s“"
-#: src/sudo.c:1682
+#: src/sudo.c:1699
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: не могу да забележим догађај грешке%s%s"
-#: src/sudo.c:1718
+#: src/sudo.c:1735
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: не могу да забележим догађај прихватања%s%s"
-#: src/sudo.c:1723 src/sudo.c:1761
+#: src/sudo.c:1740 src/sudo.c:1778
msgid "audit plugin error"
msgstr "грешка аудит прикључка"
-#: src/sudo.c:1756
+#: src/sudo.c:1773
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: не могу да забележим догађај одбијања%s%s"
-#: src/sudo.c:1816
+#: src/sudo.c:1833
#, c-format
msgid "error initializing approval plugin %s"
msgstr "грешка покретања прикључка одобравања „%s“"
-#: src/sudo.c:1886
+#: src/sudo.c:1903
msgid "command rejected by approver"
msgstr "наредбу је одбацио одобравач"
-#: src/sudo.c:1896
+#: src/sudo.c:1913
msgid "approval plugin error"
msgstr "грешка прикључка одобравања"
@@ -1056,17 +1131,17 @@ msgstr "терминал је потребан за читање лозинке;
msgid "no askpass program specified, try setting SUDO_ASKPASS"
msgstr "није наведен програм за пропуштање, покушајте да подеÑите SUDO_ASKPASS"
-#: src/tgetpass.c:328
+#: src/tgetpass.c:326
#, c-format
msgid "unable to set gid to %u"
msgstr "не могу да подеÑим гид у %u"
-#: src/tgetpass.c:338
+#: src/tgetpass.c:336
#, c-format
msgid "unable to set uid to %u"
msgstr "не могу да подеÑим уид у %u"
-#: src/tgetpass.c:343
+#: src/tgetpass.c:341
#, c-format
msgid "unable to run %s"
msgstr "не могу да покренем %s"
diff --git a/po/sudo.pot b/po/sudo.pot
index 4d00bd8bf..cc7a6307f 100644
--- a/po/sudo.pot
+++ b/po/sudo.pot
@@ -5,9 +5,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11\n"
+"Project-Id-Version: sudo 1.9.12\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,76 +30,75 @@ msgid "unable to restore registry"
msgstr ""
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr ""
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112 src/sudo.c:1133
+#: src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822 src/sudo.c:2156
+#: src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr ""
@@ -113,21 +112,21 @@ msgstr ""
msgid "%.*s exists but is not a directory (0%o)"
msgstr ""
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr ""
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
-msgid "unable to open %.*s"
+msgid "unable to mkdir %.*s"
msgstr ""
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
#, c-format
-msgid "unable to mkdir %.*s"
+msgid "unable to open %.*s"
msgstr ""
#: lib/util/regex.c:103
@@ -138,8 +137,8 @@ msgstr ""
msgid "Unknown signal"
msgstr ""
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr ""
@@ -151,86 +150,86 @@ msgstr ""
msgid "value too small"
msgstr ""
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, c-format
msgid "invalid Path value \"%s\" in %s, line %u"
msgstr ""
-#: lib/util/sudo_conf.c:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, c-format
msgid "invalid value for %s \"%s\" in %s, line %u"
msgstr ""
-#: lib/util/sudo_conf.c:440
+#: lib/util/sudo_conf.c:441
#, c-format
msgid "unsupported group source \"%s\" in %s, line %u"
msgstr ""
-#: lib/util/sudo_conf.c:456
+#: lib/util/sudo_conf.c:457
#, c-format
msgid "invalid max groups \"%s\" in %s, line %u"
msgstr ""
-#: lib/util/sudo_conf.c:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr ""
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr ""
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr ""
-#: lib/util/sudo_conf.c:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr ""
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr ""
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr ""
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr ""
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr ""
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr ""
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr ""
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr ""
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr ""
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr ""
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr ""
@@ -239,60 +238,59 @@ msgstr ""
msgid "unable to restore current working directory"
msgstr ""
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr ""
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr ""
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr ""
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr ""
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr ""
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr ""
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr ""
-#: src/exec.c:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr ""
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr ""
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr ""
-#: src/exec.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr ""
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr ""
@@ -300,58 +298,84 @@ msgstr ""
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr ""
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr ""
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr ""
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr ""
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr ""
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr ""
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr ""
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr ""
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr ""
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr ""
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr ""
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr ""
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr ""
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr ""
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr ""
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr ""
@@ -361,371 +385,360 @@ msgstr ""
msgid "unexpected reply type on backchannel: %d"
msgstr ""
-#: src/exec_monitor.c:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr ""
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr ""
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr ""
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr ""
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr ""
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr ""
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr ""
-#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr ""
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr ""
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr ""
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372 src/net_ifs.c:433
+#: src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486 src/sudo_edit.c:398
+#: src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
+msgid "internal error, %s overflow"
msgstr ""
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr ""
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr ""
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr ""
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr ""
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr ""
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr ""
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr ""
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr ""
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr ""
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr ""
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr ""
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr ""
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr ""
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr ""
-
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, c-format
msgid "unable to restore handler for signal %d"
msgstr ""
-#: src/exec_pty.c:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr ""
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, c-format
msgid "error in %s, line %d while loading plugin \"%s\""
msgstr ""
-#: src/load_plugins.c:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr ""
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr ""
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr ""
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr ""
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr ""
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, c-format
msgid "incompatible plugin major version %d (expected %d) found in %s"
msgstr ""
-#: src/load_plugins.c:317
+#: src/load_plugins.c:319
#, c-format
msgid "ignoring policy plugin \"%s\" in %s, line %d"
msgstr ""
-#: src/load_plugins.c:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr ""
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr ""
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, c-format
msgid "policy plugin %s does not include a check_policy method"
msgstr ""
-#: src/net_ifs.c:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr ""
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr ""
-#: src/parse_args.c:314
+#: src/parse_args.c:317
msgid "the argument to -C must be a number greater than or equal to 3"
msgstr ""
-#: src/parse_args.c:545
+#: src/parse_args.c:554
msgid "you may not specify both the -i and -s options"
msgstr ""
-#: src/parse_args.c:550
+#: src/parse_args.c:559
msgid "you may not specify both the -i and -E options"
msgstr ""
-#: src/parse_args.c:560
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr ""
-#: src/parse_args.c:563
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr ""
-#: src/parse_args.c:573
+#: src/parse_args.c:582
msgid "the -U option may only be used with the -l option"
msgstr ""
-#: src/parse_args.c:577
+#: src/parse_args.c:586
msgid "the -A and -S options may not be used together"
msgstr ""
-#: src/parse_args.c:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr ""
-#: src/parse_args.c:757
+#: src/parse_args.c:767
msgid ""
"Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified"
msgstr ""
-#: src/parse_args.c:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr ""
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
"\n"
msgstr ""
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
"\n"
msgstr ""
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
msgstr ""
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr ""
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr ""
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr ""
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr ""
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr ""
-#: src/parse_args.c:798
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr ""
-#: src/parse_args.c:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr ""
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr ""
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr ""
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr ""
-#: src/parse_args.c:811
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr ""
-#: src/parse_args.c:814
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr ""
-#: src/parse_args.c:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr ""
-#: src/parse_args.c:819
+#: src/parse_args.c:842
msgid "run command on host (if supported by plugin)"
msgstr ""
-#: src/parse_args.c:822
+#: src/parse_args.c:845
msgid "run login shell as the target user; a command may also be specified"
msgstr ""
-#: src/parse_args.c:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr ""
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr ""
-#: src/parse_args.c:830
+#: src/parse_args.c:853
msgid ""
"list user's privileges or check a specific command; use twice for longer "
"format"
msgstr ""
-#: src/parse_args.c:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr ""
-#: src/parse_args.c:836
+#: src/parse_args.c:859
msgid "preserve group vector instead of setting to target's"
msgstr ""
-#: src/parse_args.c:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr ""
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr ""
-#: src/parse_args.c:844
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr ""
-#: src/parse_args.c:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr ""
-#: src/parse_args.c:850
+#: src/parse_args.c:873
msgid "run shell as the target user; a command may also be specified"
msgstr ""
-#: src/parse_args.c:854
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr ""
-#: src/parse_args.c:857
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr ""
-#: src/parse_args.c:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr ""
-#: src/parse_args.c:863
+#: src/parse_args.c:886
msgid "run command (or edit file) as specified user name or ID"
msgstr ""
-#: src/parse_args.c:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr ""
-#: src/parse_args.c:868
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr ""
-#: src/parse_args.c:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr ""
@@ -825,37 +838,42 @@ msgstr ""
msgid "unable to set key creation context to %s"
msgstr ""
-#: src/sesh.c:72
-msgid "requires at least one argument"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
msgstr ""
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr ""
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
#, c-format
-msgid "unable to run %s as a login shell"
+msgid "The -%c option may not be used in edit mode."
msgstr ""
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:184 src/sesh.c:189
+#, c-format
+msgid "The -%c option may only be used in edit mode."
+msgstr ""
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr ""
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, c-format
msgid "%s: editing files in a writable directory is not permitted"
msgstr ""
-#: src/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr ""
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr ""
@@ -939,124 +957,128 @@ msgstr ""
msgid "unable to determine tty"
msgstr ""
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid ""
"The \"no new privileges\" flag is set, which prevents sudo from running as "
"root."
msgstr ""
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid ""
"If sudo is running in a container, you may need to adjust the container "
"configuration to disable the flag."
msgstr ""
-#: src/sudo.c:961
+#: src/sudo.c:954
#, c-format
msgid "%s must be owned by uid %d and have the setuid bit set"
msgstr ""
-#: src/sudo.c:964
+#: src/sudo.c:957
#, 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:970
+#: src/sudo.c:963
#, c-format
msgid "effective uid is not %d, is sudo installed setuid root?"
msgstr ""
-#: src/sudo.c:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr ""
-#: src/sudo.c:993
+#: src/sudo.c:986
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr ""
-#: src/sudo.c:999
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr ""
-#: src/sudo.c:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr ""
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr ""
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr ""
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr ""
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr ""
-#: src/sudo.c:1257
+#: src/sudo.c:1269
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr ""
-#: src/sudo.c:1301
+#: src/sudo.c:1313
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr ""
-#: src/sudo.c:1339
+#: src/sudo.c:1351
#, c-format
msgid "policy plugin %s does not support the -k/-K options"
msgstr ""
-#: src/sudo.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr ""
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr ""
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr ""
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr ""
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr ""
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr ""
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr ""
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr ""
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr ""
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr ""
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr ""
@@ -1066,7 +1088,7 @@ msgstr ""
msgid "%s left unmodified"
msgstr ""
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr ""
@@ -1079,38 +1101,38 @@ msgstr ""
msgid "sesh: unable to create temporary files"
msgstr ""
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr ""
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr ""
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
msgid "unable to copy temporary files back to their original location"
msgstr ""
-#: src/sudo_edit.c:606
+#: src/sudo_edit.c:601
msgid ""
"unable to copy some of the temporary files back to their original location"
msgstr ""
-#: src/sudo_edit.c:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr ""
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr ""
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr ""
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr ""
diff --git a/po/sv.mo b/po/sv.mo
index 115cc142c..beddaad0b 100644
--- a/po/sv.mo
+++ b/po/sv.mo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 396e63a00..bb68e1735 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,24 +1,24 @@
# Swedish translation for sudo.
-# Copyright © 2012, 2016, 2017, 2018, 2019, 2020 Free Software Foundation, Inc.
+# Copyright © 2012, 2016, 2017, 2018, 2019, 2020, 2022 Free Software Foundation, Inc.
# This file is put in the public domain.
# Daniel Nylander <po@danielnylander.se>, 2012.
-# Sebastian Rasmussen <sebras@gmail.com>, 2016, 2017, 2018, 2019, 2020.
+# Sebastian Rasmussen <sebras@gmail.com>, 2016, 2017, 2018, 2019, 2020, 2022.
#
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.3b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-09-12 08:28-0600\n"
-"PO-Revision-Date: 2020-12-26 03:44+0100\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-11 13:40+0200\n"
"Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\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.4.2\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 3.1.1\n"
"X-Poedit-Bookmarks: -1,0,-1,-1,-1,-1,-1,-1,-1,-1\n"
#: lib/util/aix.c:89 lib/util/aix.c:169
@@ -35,97 +35,115 @@ msgid "unable to restore registry"
msgstr "kunde inte återställa registret"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:180 lib/util/sudo_conf.c:186
-#: lib/util/sudo_conf.c:272 lib/util/sudo_conf.c:349 lib/util/sudo_conf.c:575
-#: src/conversation.c:80 src/exec_common.c:106 src/exec_common.c:122
-#: src/exec_common.c:131 src/exec_monitor.c:206 src/exec_monitor.c:455
-#: src/exec_monitor.c:461 src/exec_monitor.c:469 src/exec_monitor.c:477
-#: src/exec_monitor.c:484 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_nopty.c:212 src/exec_nopty.c:221
-#: src/exec_nopty.c:228 src/exec_nopty.c:235 src/exec_nopty.c:242
-#: src/exec_nopty.c:249 src/exec_nopty.c:256 src/exec_nopty.c:263
-#: src/exec_nopty.c:270 src/exec_nopty.c:277 src/exec_nopty.c:284
-#: src/exec_nopty.c:291 src/exec_nopty.c:299 src/exec_nopty.c:473
-#: src/exec_pty.c:827 src/exec_pty.c:836 src/exec_pty.c:893
-#: src/exec_pty.c:1046 src/exec_pty.c:1218 src/exec_pty.c:1227
-#: src/exec_pty.c:1234 src/exec_pty.c:1241 src/exec_pty.c:1248
-#: src/exec_pty.c:1255 src/exec_pty.c:1262 src/exec_pty.c:1269
-#: src/exec_pty.c:1276 src/exec_pty.c:1283 src/exec_pty.c:1290
-#: src/exec_pty.c:1298 src/exec_pty.c:1740 src/load_plugins.c:52
-#: src/load_plugins.c:65 src/load_plugins.c:163 src/load_plugins.c:188
-#: src/load_plugins.c:223 src/load_plugins.c:463 src/load_plugins.c:469
-#: src/parse_args.c:181 src/parse_args.c:202 src/parse_args.c:275
-#: src/parse_args.c:616 src/parse_args.c:638 src/parse_args.c:663
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:90
-#: src/selinux.c:360 src/selinux.c:489 src/selinux.c:498 src/sesh.c:115
-#: src/sudo.c:632 src/sudo.c:701 src/sudo.c:711 src/sudo.c:732 src/sudo.c:751
-#: src/sudo.c:760 src/sudo.c:769 src/sudo.c:786 src/sudo.c:828 src/sudo.c:838
-#: src/sudo.c:867 src/sudo.c:1053 src/sudo.c:1075 src/sudo.c:1373
-#: src/sudo.c:1546 src/sudo.c:1740 src/sudo.c:2084 src/sudo_edit.c:263
-#: src/sudo_edit.c:770 src/sudo_edit.c:854 src/sudo_edit.c:976
-#: src/sudo_edit.c:996
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
-#: lib/util/json.c:181 lib/util/sudo_conf.c:187 lib/util/sudo_conf.c:272
-#: lib/util/sudo_conf.c:349 lib/util/sudo_conf.c:575 src/conversation.c:81
-#: src/exec_common.c:106 src/exec_common.c:123 src/exec_common.c:132
-#: src/exec_monitor.c:455 src/exec_monitor.c:461 src/exec_monitor.c:469
-#: src/exec_monitor.c:477 src/exec_monitor.c:484 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_nopty.c:212
-#: src/exec_nopty.c:221 src/exec_nopty.c:228 src/exec_nopty.c:235
-#: src/exec_nopty.c:242 src/exec_nopty.c:249 src/exec_nopty.c:256
-#: src/exec_nopty.c:263 src/exec_nopty.c:270 src/exec_nopty.c:277
-#: src/exec_nopty.c:284 src/exec_nopty.c:291 src/exec_nopty.c:299
-#: src/exec_pty.c:827 src/exec_pty.c:836 src/exec_pty.c:893
-#: src/exec_pty.c:1218 src/exec_pty.c:1227 src/exec_pty.c:1234
-#: src/exec_pty.c:1241 src/exec_pty.c:1248 src/exec_pty.c:1255
-#: src/exec_pty.c:1262 src/exec_pty.c:1269 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1298
-#: src/exec_pty.c:1740 src/load_plugins.c:163 src/load_plugins.c:188
-#: src/load_plugins.c:223 src/load_plugins.c:463 src/load_plugins.c:469
-#: src/parse_args.c:181 src/parse_args.c:203 src/parse_args.c:275
-#: src/parse_args.c:616 src/parse_args.c:638 src/parse_args.c:663
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:90
-#: src/selinux.c:360 src/selinux.c:489 src/selinux.c:498 src/sesh.c:115
-#: src/sudo.c:235 src/sudo.c:632 src/sudo.c:867 src/sudo.c:1053
-#: src/sudo.c:1075 src/sudo.c:1373 src/sudo.c:1546 src/sudo.c:1740
-#: src/sudo.c:2084 src/sudo_edit.c:263 src/sudo_edit.c:770 src/sudo_edit.c:854
-#: src/sudo_edit.c:976 src/sudo_edit.c:996
+#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "kunde inte allokera minne"
-#: lib/util/mkdir_parents.c:69 lib/util/sudo_conf.c:614 src/selinux.c:234
-#: src/selinux.c:264 src/sudo.c:369
+#: lib/util/mkdir_parents.c:63
+#, c-format
+msgid "unable to stat %.*s"
+msgstr "kunde inte ta status på %.*s"
+
+#: lib/util/mkdir_parents.c:69
+#, c-format
+msgid "%.*s exists but is not a directory (0%o)"
+msgstr "%.*s existerar men är inte en katalog (0%o)"
+
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "kunde inte öppna %s"
-#: lib/util/mkdir_parents.c:84
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
-msgid "unable to mkdir %s"
-msgstr "kunde inte köra mkdir %s"
+msgid "unable to mkdir %.*s"
+msgstr "kunde inte köra mkdir %.*s"
-#: lib/util/mkdir_parents.c:93 lib/util/sudo_conf.c:591
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
#, c-format
-msgid "unable to stat %s"
-msgstr "kunde inte ta status på %s"
+msgid "unable to open %.*s"
+msgstr "kunde inte öppna %.*s"
-#: lib/util/mkdir_parents.c:98
-#, c-format
-msgid "%s exists but is not a directory (0%o)"
-msgstr "%s existerar men är inte en katalog (0%o)"
+#: lib/util/regex.c:103
+msgid "regular expression too large"
+msgstr "reguljärt uttryck för stort"
#: lib/util/strsignal.c:50
msgid "Unknown signal"
msgstr "Okänd signal"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "ogiltigt värde"
@@ -137,110 +155,232 @@ msgstr "värde för stort"
msgid "value too small"
msgstr "värde för litet"
-#: lib/util/sudo_conf.c:205
+#: lib/util/sudo_conf.c:238
#, 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:371 lib/util/sudo_conf.c:387 lib/util/sudo_conf.c:440
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, 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:408
+#: lib/util/sudo_conf.c:441
#, 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:424
+#: lib/util/sudo_conf.c:457
#, 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:594
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s är inte en vanlig fil"
-#: lib/util/sudo_conf.c:597
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, 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:601
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "%s är skrivbar för alla"
-#: lib/util/sudo_conf.c:604
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "%s är skrivbar för gruppen"
-#: src/copy_file.c:91
+#: src/apparmor.c:85
+msgid "failed to determine AppArmor confinement"
+msgstr "kunde inte fastställa AppArmor- läge."
+
+#: src/apparmor.c:93
+#, c-format
+msgid "unable to change AppArmor profile to %s"
+msgstr "kan inte ändra AppArmor-profil till %s"
+
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: trunkera %s till noll byte? (y för ja/n för nej) [n] "
-#: src/copy_file.c:95
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "skriver inte över %s"
-#: src/copy_file.c:117
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "kunde inte läsa från %s"
-#: src/copy_file.c:134 src/sudo_edit.c:695
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "kunde inte skriva till %s"
-#: src/exec.c:128
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "kunde inte ta status på %s"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
+#, c-format
+msgid "%s: not a regular file"
+msgstr "%s: inte en vanlig fil"
+
+#: src/copy_file.c:159
+#, c-format
+msgid "%s: bad file mode: 0%o"
+msgstr "%s: felaktigt filläge: 0%o"
+
+#: src/edit_open.c:331
+msgid "unable to restore current working directory"
+msgstr "kunde inte återställa aktuell arbetskatalog"
+
+#: src/exec.c:111
+msgid "unable to set privileges"
+msgstr "kan inte sätta privilegier"
+
+#: src/exec.c:117 src/exec.c:122
+msgid "unable to set limit privileges"
+msgstr "kan inte sätta begränsning av privilegier"
+
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "okänd inloggningsklass %s"
-#: src/exec.c:140
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "kunde inte ställa in användarens kontext"
-#: src/exec.c:156
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "kunde inte ställa in processprioritet"
-#: src/exec.c:170
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "kunde inte ändra rot till %s"
-#: src/exec.c:183 src/exec.c:189 src/exec.c:196
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "kunde inte ändra till runas uid (%u, %u)"
-#: src/exec.c:214
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "kunde inte ändra katalog till %s"
-#: src/exec.c:218
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "börjar från %s"
-#: src/exec.c:300 src/exec_monitor.c:564 src/exec_monitor.c:566
-#: src/exec_nopty.c:531 src/exec_pty.c:568 src/exec_pty.c:1386
-#: src/exec_pty.c:1388 src/signal.c:139 src/signal.c:153
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, 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:165
+#: src/exec.c:422
+msgid "intercept mode is not supported with SELinux RBAC on this system"
+msgstr "infångningsläge stöds in med SELinux RBAC på detta system"
+
+#: src/exec.c:427
+msgid "unable to log sub-commands with SELinux RBAC on this system"
+msgstr "kan inte logga underkommandon med SELinux RBAC på detta system"
+
+#: src/exec_common.c:56
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "kan inte ta bort PRIV_PROC_EXEC från PRIV_LIMIT"
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
+msgid "unable to add event to queue"
+msgstr "kunde inte lägga till händelse till kö"
+
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "kommando inte satt enligt säkerhetspolicyn"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
+msgid "command rejected by policy"
+msgstr "kommando avböjt enligt policy"
+
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "fel i godkänningsinsticksmodul"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
+msgid "policy plugin error"
+msgstr "fel i policyinsticksmodul"
+
+#: src/exec_intercept.c:543
+msgid "invalid PolicyCheckRequest"
+msgstr "ogiltig PolicyCheckRequest"
+
+#: src/exec_intercept.c:678
+#, c-format
+msgid "client request too large: %zu"
+msgstr "klientbegäran för stor: %zu"
+
+#: src/exec_intercept.c:720
+#, c-format
+msgid "unable to unpack %s size %zu"
+msgstr "kunde inte packa upp %s storlek %zu"
+
+#: src/exec_intercept.c:768
+#, c-format
+msgid "unexpected type_case value %d in %s from %s"
+msgstr "oväntat type_case-värde %d i %s från %s"
+
+#: src/exec_intercept.c:794
+#, c-format
+msgid "server message too large: %zu"
+msgstr "servermeddelande för stort: %zu"
+
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "fel i I/O-insticksmodul"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "kommando avböjt av I/O-insticksmodul"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "felloggning avstängd"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "fel vid ändring av fönsterstorlek"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "fel vid läsning från uttagspar"
@@ -250,203 +390,213 @@ msgstr "fel vid läsning från uttagspar"
msgid "unexpected reply type on backchannel: %d"
msgstr "oväntad svarstyp i bakkanal: %d"
-#: src/exec_monitor.c:463 src/exec_monitor.c:471 src/exec_monitor.c:479
-#: src/exec_monitor.c:486 src/exec_monitor.c:493 src/exec_monitor.c:500
-#: src/exec_monitor.c:507 src/exec_monitor.c:514 src/exec_monitor.c:521
-#: src/exec_monitor.c:528 src/exec_nopty.c:214 src/exec_nopty.c:223
-#: src/exec_nopty.c:230 src/exec_nopty.c:237 src/exec_nopty.c:244
-#: src/exec_nopty.c:251 src/exec_nopty.c:258 src/exec_nopty.c:265
-#: src/exec_nopty.c:272 src/exec_nopty.c:279 src/exec_nopty.c:286
-#: src/exec_nopty.c:293 src/exec_nopty.c:301 src/exec_pty.c:693
-#: src/exec_pty.c:698 src/exec_pty.c:795 src/exec_pty.c:802 src/exec_pty.c:899
-#: src/exec_pty.c:1220 src/exec_pty.c:1229 src/exec_pty.c:1236
-#: src/exec_pty.c:1243 src/exec_pty.c:1250 src/exec_pty.c:1257
-#: src/exec_pty.c:1264 src/exec_pty.c:1271 src/exec_pty.c:1278
-#: src/exec_pty.c:1285 src/exec_pty.c:1292 src/exec_pty.c:1693
-#: src/exec_pty.c:1703 src/exec_pty.c:1748 src/exec_pty.c:1755
-#: src/exec_pty.c:1782
-msgid "unable to add event to queue"
-msgstr "kunde inte lägga till händelse till kö"
-
-#: src/exec_monitor.c:582
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "kan inte ställa in kontrollerande tty"
-#: src/exec_monitor.c:590 src/exec_nopty.c:358 src/exec_pty.c:1465
-#: src/exec_pty.c:1486 src/exec_pty.c:1506 src/tgetpass.c:306
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "kunde inte skapa rör"
-#: src/exec_monitor.c:598
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "kan inte ta emot meddelande från förälder"
-#: src/exec_monitor.c:612 src/exec_nopty.c:387 src/exec_pty.c:1544
-#: src/sudo_edit.c:735 src/tgetpass.c:310
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
+#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "kunde inte grena process"
-#: src/exec_monitor.c:616 src/exec_monitor.c:715 src/exec_nopty.c:441
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "kan inte återställa tty-etikett"
-#: src/exec_monitor.c:632 src/sesh.c:125 src/sudo.c:1131
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "kunde inte köra %s"
-#: src/exec_nopty.c:352 src/exec_pty.c:1395
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "policyinsticksmodul misslyckades att initiera session"
-#: src/exec_nopty.c:429 src/exec_pty.c:1632
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
+msgid "unable to create sockets"
+msgstr "kunde inte skapa uttag"
+
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "fel i händelseslinga"
-#: src/exec_nopty.c:539 src/exec_pty.c:606 src/signal.c:101
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to restore handler for signal %d"
-msgstr "kunde inte återställa hanterare för signal %d"
+msgid "internal error, %s overflow"
+msgstr "internt fel, %s spill"
-#: src/exec_pty.c:152
-msgid "unable to allocate pty"
-msgstr "kunde inte allokera pty"
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
+#, c-format
+msgid "unable to set registers for process %d"
+msgstr "kunde inte sätta register för process %d"
-#: src/exec_pty.c:216 src/exec_pty.c:255 src/exec_pty.c:294 src/exec_pty.c:344
-#: src/exec_pty.c:394
-msgid "I/O plugin error"
-msgstr "fel i I/O-insticksmodul"
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
+#, c-format
+msgid "process %d exited unexpectedly"
+msgstr "process %d avslutades oväntat"
-#: src/exec_pty.c:219 src/exec_pty.c:258 src/exec_pty.c:297 src/exec_pty.c:347
-#: src/exec_pty.c:397
-msgid "command rejected by I/O plugin"
-msgstr "kommando avböjt av I/O-insticksmodul"
+#: src/exec_ptrace.c:1207
+msgid "unable to set seccomp filter"
+msgstr "kan inte sätta seccomp-filter"
-#: src/exec_pty.c:444
-msgid "error logging suspend"
-msgstr "felloggning avstängd"
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "tolkargument , förväntade \"%s\", fick \"%s\""
-#: src/exec_pty.c:477
-msgid "error changing window size"
-msgstr "fel vid ändring av fönsterstorlek"
+#: src/exec_ptrace.c:1503
+#, c-format
+msgid "pathname mismatch, expected \"%s\", got \"%s\""
+msgstr "felmatchning i söknamn, förväntade \"%s\", fick \"%s\""
-#: src/exec_pty.c:1375
-msgid "unable to create sockets"
-msgstr "kunde inte skapa uttag"
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
+#, c-format
+msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
+msgstr "%s[%d] felmatchade, förväntade \"%s\", fick \"%s\""
+
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "process %d oväntad status 0x%x"
+
+#: src/exec_ptrace.c:1711
+#, c-format
+msgid "unable to get event message for process %d"
+msgstr "kan inte hämta händelsemeddelande för process %d"
-#: src/exec_pty.c:1587
+#: src/exec_ptrace.c:1718
+#, c-format
+msgid "unable to get registers for process %d"
+msgstr "kan inte hämta register för process %d"
+
+#: src/exec_pty.c:103
+msgid "unable to allocate pty"
+msgstr "kunde inte allokera pty"
+
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
+#, c-format
+msgid "unable to restore handler for signal %d"
+msgstr "kunde inte återställa hanterare för signal %d"
+
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "kan inte skicka meddelande till övervakningsprocess"
-#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85
-#: src/load_plugins.c:115 src/load_plugins.c:129 src/load_plugins.c:135
-#: src/load_plugins.c:287 src/load_plugins.c:297 src/load_plugins.c:307
-#: src/load_plugins.c:354
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, 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:87
-#, c-format
-msgid "%s%s: %s"
-msgstr "%s%s: %s"
-
-#: src/load_plugins.c:131
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s måste ägas av uid %d"
-#: src/load_plugins.c:137
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%s får endast vara skrivbar av ägaren"
-#: src/load_plugins.c:247 src/load_plugins.c:322
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "ignorerar dubblerad insticksmodul â€%s†i %s, rad %d"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "kunde inte läsa in %s: %s"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "kunde inte hitta symbol â€%s†i %s"
-#: src/load_plugins.c:309
+#: src/load_plugins.c:301
#, 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:327
+#: src/load_plugins.c:319
#, c-format
msgid "ignoring policy plugin \"%s\" in %s, line %d"
msgstr "ignorerar policyinsticksmodul â€%s†i %s, rad %d"
-#: src/load_plugins.c:330
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "bara en policyinsticksmodul kan anges"
-#: src/load_plugins.c:356
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "okänd insticksmodulstyp %d hittad i %s"
-#: src/load_plugins.c:552
+#: src/load_plugins.c:531
#, 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:178 src/net_ifs.c:195 src/net_ifs.c:340 src/sudo.c:479
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "internt fel, %s spill"
-
-#: src/parse_args.c:223
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "ogiltigt namn på miljövariabel: %s"
-#: src/parse_args.c:325
+#: src/parse_args.c:317
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:552
+#: src/parse_args.c:554
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:557
+#: src/parse_args.c:559
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:567
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "flaggan -E är inte giltig i redigeringsläget"
-#: src/parse_args.c:570
+#: src/parse_args.c:572
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:580
+#: src/parse_args.c:582
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:584
+#: src/parse_args.c:586
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:677
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "sudoedit stöds inte på denna plattform"
-#: src/parse_args.c:759
+#: src/parse_args.c:767
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:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "Endast en av flaggorna -K, -k eller -N får anges"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -455,7 +605,7 @@ msgstr ""
"%s - redigera filer som en annan användare\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -464,7 +614,7 @@ msgstr ""
"%s - kör ett kommando som en annan användare\n"
"\n"
-#: src/parse_args.c:780
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -472,248 +622,268 @@ msgstr ""
"\n"
"Flaggor:\n"
-#: src/parse_args.c:782
+#: src/parse_args.c:806
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:785
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "använd angiven BSD-autentiseringstyp"
-#: src/parse_args.c:788
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "kör kommando i bakgrunden"
-#: src/parse_args.c:790
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "ring i klockan vid fråga"
-#: src/parse_args.c:792
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "stäng alla fildeskriptorer >= num"
-#: src/parse_args.c:795
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "kör kommando med den angivna BSD-inloggningsklassen"
-#: src/parse_args.c:798
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "ändra arbetskatalog innan kommando körs"
-#: src/parse_args.c:800
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "bevara användarens miljö när kommandot körs"
-#: src/parse_args.c:802
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "bevara specifika miljövariabler"
-#: src/parse_args.c:804
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "redigera filer istället för att köra ett kommando"
-#: src/parse_args.c:806
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "kör kommando som angivet gruppnamn eller ID"
-#: src/parse_args.c:808
+#: src/parse_args.c:837
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:810
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "visa hjälpmeddelande och avsluta"
-#: src/parse_args.c:812
+#: src/parse_args.c:842
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:814
+#: src/parse_args.c:845
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:816
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "ta bort tidsstämpelfil helt"
-#: src/parse_args.c:818
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "ogiltigförklara tidsstämpelfil"
-#: src/parse_args.c:820
+#: src/parse_args.c:853
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:822
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "icke-interaktivt läge, inga frågor ställs"
-#: src/parse_args.c:824
+#: src/parse_args.c:859
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:826
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "använd angiven lösenordsprompt"
-#: src/parse_args.c:828
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "ändra rotkatalog innan kommando körs"
-#: src/parse_args.c:831
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "skapa SELinux-säkerhetskontext med angiven roll"
-#: src/parse_args.c:834
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "läs lösenord från standard in"
-#: src/parse_args.c:836
+#: src/parse_args.c:873
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:839
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "skapa SELinux-säkerhetskontext med angiven typ"
-#: src/parse_args.c:842
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "avsluta kommando efter den angivna tidsgränsen"
-#: src/parse_args.c:844
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "i listläge, visa rättigheter för användaren"
-#: src/parse_args.c:846
+#: src/parse_args.c:886
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:848
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "visa versionsinformation och avsluta"
-#: src/parse_args.c:850
+#: src/parse_args.c:891
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:852
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "sluta behandla kommandoradsargument"
-#: src/selinux.c:84
+#: src/selinux.c:83
msgid "unable to open audit system"
msgstr "kan inte öppna granskningssystem"
-#: src/selinux.c:94
+#: src/selinux.c:93
msgid "unable to send audit message"
msgstr "kan inte skicka granskningsmeddelande"
-#: src/selinux.c:128
+#: src/selinux.c:129
#, c-format
msgid "unable to fgetfilecon %s"
msgstr "kan inte köra fgetfilecon på %s"
-#: src/selinux.c:133
+#: src/selinux.c:134
#, c-format
msgid "%s changed labels"
msgstr "%s ändrade etiketter"
-#: src/selinux.c:141
+#: 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:189
+#: 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:193 src/selinux.c:238 src/selinux.c:268
+#: src/selinux.c:194 src/selinux.c:239 src/selinux.c:269
#, c-format
msgid "%s is not a character device, not relabeling tty"
msgstr "%s är inte en teckenenhet, ometiketterar inte tty"
-#: src/selinux.c:202
+#: 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:209
+#: 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:214
+#: 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:223
+#: src/selinux.c:224
msgid "unable to set new tty context"
msgstr "kan inte ställa in ny tty-kontext"
-#: src/selinux.c:321
+#: src/selinux.c:323
#, 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:327
+#: src/selinux.c:329
#, 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:339
+#: src/selinux.c:341
msgid "failed to get new context"
msgstr "misslyckades med att få tag på ny kontext"
-#: src/selinux.c:348
+#: src/selinux.c:350
#, c-format
msgid "failed to set new role %s"
msgstr "misslyckades med att ställa in nya rollen %s"
-#: src/selinux.c:352
+#: src/selinux.c:354
#, c-format
msgid "failed to set new type %s"
msgstr "misslyckades med att ställa in nya typen %s"
-#: src/selinux.c:364
+#: src/selinux.c:366
#, c-format
msgid "%s is not a valid context"
msgstr "%s är inte en giltig kontext"
-#: src/selinux.c:396
+#: src/selinux.c:394
msgid "failed to get old context"
msgstr "misslyckades med att få tag på gammal kontext"
-#: src/selinux.c:402
+#: src/selinux.c:400
msgid "unable to determine enforcing mode."
msgstr "kan inte fastställa påtvingande läge."
-#: src/selinux.c:419
-#, c-format
-msgid "unable to set tty context to %s"
-msgstr "kunde inte ställa in tty-kontext till %s"
-
-#: src/selinux.c:440
+#: src/selinux.c:425
#, c-format
msgid "unable to set exec context to %s"
msgstr "kunde inte ställa in körkontext till %s"
-#: src/selinux.c:447
+#: src/selinux.c:432
#, 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:77
-msgid "requires at least one argument"
-msgstr "kräver minst ett argument"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "Endast en av flaggorna -c eller -i får anges"
-#: src/sesh.c:106
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "ogiltigt fildeskriptornummer: %s"
-#: src/sesh.c:120
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
+#, c-format
+msgid "The -%c option may not be used in edit mode."
+msgstr "Flaggan -%c kan inte användas i redigeringsläge."
+
+#: src/sesh.c:184 src/sesh.c:189
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "kunde inte köra %s som ett inloggningsskal"
+msgid "The -%c option may only be used in edit mode."
+msgstr "Flaggan -%c får bara användas i redigeringsläge."
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
+#, c-format
+msgid "%s: editing symbolic links is not permitted"
+msgstr "%s: att redigera symboliska länkar är inte tillåtet"
+
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
+#, 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/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
+#: src/sudo_edit.c:331
+#, c-format
+msgid "contents of edit session left in %s"
+msgstr "innehåll av redigeringssession finns kvar i %s"
+
+#: src/sesh.c:476 src/sudo_edit.c:94
+msgid "unable to get group list"
+msgstr "kan inte hämta grupplista"
#: src/signal.c:79
#, c-format
@@ -763,203 +933,210 @@ msgstr "setproject misslyckades för projekt â€%sâ€"
msgid "warning, resource control assignment failed for project \"%s\""
msgstr "varning, tilldelning av resurskontroll misslyckades för projekt â€%sâ€"
-#: src/sudo.c:220
+#: src/sudo.c:216
#, c-format
msgid "Sudo version %s\n"
msgstr "Sudo version %s\n"
-#: src/sudo.c:222
+#: src/sudo.c:218
#, c-format
msgid "Configure options: %s\n"
msgstr "Konfigurationsflaggor: %s\n"
-#: src/sudo.c:231
+#: src/sudo.c:226
msgid "fatal error, unable to load plugins"
msgstr "ödesdigert fel, kunde inte läsa in insticksmoduler"
-#: src/sudo.c:277
+#: src/sudo.c:272
msgid "plugin did not return a command to execute"
msgstr "insticksmodul returnerade ett kommando att exekvera"
-#: src/sudo.c:312
+#: src/sudo.c:305
#, c-format
msgid "unexpected sudo mode 0x%x"
msgstr "oväntat sudo-läge 0x%x"
-#: src/sudo.c:546
+#: src/sudo.c:553
#, c-format
msgid "you do not exist in the %s database"
msgstr "du existerar inte i %s-databasen"
-#: src/sudo.c:603
+#: src/sudo.c:610
msgid "unable to determine tty"
msgstr "kan inte detektera tty"
-#: src/sudo.c:913
+#: src/sudo.c:918
+msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
+msgstr "Flaggan \"inga nya privilegier\" är satt, vilket förhindrar sudo från att köra som root."
+
+#: src/sudo.c:920
+msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
+msgstr "Om sudo kör i en behållare, kan du behöva justera behållarkonfigurationen för att inaktivera flaggan."
+
+#: src/sudo.c:954
#, 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:916
+#: src/sudo.c:957
#, 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:922
+#: src/sudo.c:963
#, 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:938
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "kan inte ställa in kompletterande grupp-ID:n"
-#: src/sudo.c:945
+#: src/sudo.c:986
#, 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:951
+#: src/sudo.c:992
#, 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:994
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "argv inte satt enligt säkerhetspolicyn"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "envp inte satt enligt säkerhetspolicyn"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "oväntat barnavslutsvillkor: %d"
-#: src/sudo.c:1103
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "kan inte initiera policy-instick"
-#: src/sudo.c:1166
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "policyinsticksmodul %s saknar metoden â€check_policyâ€"
-#: src/sudo.c:1181 src/sudo.c:1234 src/sudo.c:1278
-msgid "command rejected by policy"
-msgstr "kommando avböjt enligt policy"
-
-#: src/sudo.c:1186 src/sudo.c:1239 src/sudo.c:1283
-msgid "policy plugin error"
-msgstr "fel i policyinsticksmodul"
-
-#: src/sudo.c:1220
+#: src/sudo.c:1269
#, 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:1264
+#: src/sudo.c:1313
#, 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:1302
+#: src/sudo.c:1351
#, 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.c:1431
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "fel vid initiering av I/O-insticksmodul %s"
-#: src/sudo.c:1585
+#: src/sudo.c:1483
+msgid "error initializing I/O plugin"
+msgstr "fel vid initiering av I/O-insticksmodul"
+
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "fel vid initiering av granskningsinsticksmodul %s"
-#: src/sudo.c:1763
+#: src/sudo.c:1711
+#, c-format
+msgid "%s: unable to log error event%s%s"
+msgstr "%s: kunde inte logga felhändelse%s%s"
+
+#: src/sudo.c:1747
+#, c-format
+msgid "%s: unable to log accept event%s%s"
+msgstr "%s: kunde inte logga acceptanshändelse%s%s"
+
+#: src/sudo.c:1752 src/sudo.c:1790
+msgid "audit plugin error"
+msgstr "fel i audit-insticksmodul"
+
+#: src/sudo.c:1785
+#, c-format
+msgid "%s: unable to log reject event%s%s"
+msgstr "%s: kunde inte logga avböjningshändelse%s%s"
+
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "fel vid initiering av godkänningsinsticksmodul %s"
-#: src/sudo.c:1839
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "kommando avböjt av godkännare"
-#: src/sudo.c:1848
-msgid "approval plugin error"
-msgstr "fel i godkänningsinsticksmodul"
-
-#: src/sudo_edit.c:226
+#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "ingen skrivbar temporärkatalog hittad"
-#: src/sudo_edit.c:351
-msgid "unable to restore current working directory"
-msgstr "kunde inte återställa aktuell arbetskatalog"
-
-#: src/sudo_edit.c:566 src/sudo_edit.c:666
-#, c-format
-msgid "%s: not a regular file"
-msgstr "%s: inte en vanlig fil"
-
-#: src/sudo_edit.c:573
-#, 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:576
-#, 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:667
+#: src/sudo_edit.c:291
#, c-format
msgid "%s left unmodified"
msgstr "%s lämnad oförändrad"
-#: src/sudo_edit.c:680 src/sudo_edit.c:871
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s oförändrad"
-#: src/sudo_edit.c:706 src/sudo_edit.c:909
-#, c-format
-msgid "contents of edit session left in %s"
-msgstr "innehåll av redigeringssession finns kvar i %s"
-
-#: src/sudo_edit.c:814
+#: src/sudo_edit.c:481
msgid "sesh: internal error: odd number of paths"
msgstr "sesh: internt fel: udda antal sökvägar"
-#: src/sudo_edit.c:816
+#: src/sudo_edit.c:483
msgid "sesh: unable to create temporary files"
msgstr "sesh: kunde inte skapa temporärfiler"
-#: src/sudo_edit.c:818 src/sudo_edit.c:902
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: dödad av en signal"
-#: src/sudo_edit.c:820 src/sudo_edit.c:905
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: okänt fel %d"
-#: src/sudo_edit.c:895
+#: src/sudo_edit.c:597
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:899
+#: src/sudo_edit.c:601
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:943
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "kunde inte ändra uid till root (%u)"
-#: src/sudo_edit.c:960
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "insticksfel: fillista för sudoedit saknas"
-#: src/sudo_edit.c:1011 src/sudo_edit.c:1024
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "kunde inte läsa klockan"
+#: src/sudo_intercept_common.c:365
+msgid "intercept port not set"
+msgstr "infångningsport inte satt"
+
#: src/tgetpass.c:95
msgid "timed out reading password"
msgstr "tidsgräns löpte ut vid lösenordsinläsning"
@@ -980,33 +1157,45 @@ msgstr "en terminal krävs för att läsa lösenordet; använd antingen flaggan
msgid "no askpass program specified, try setting SUDO_ASKPASS"
msgstr "inget askpass-program angivet, prova att ställ in SUDO_ASKPASS"
-#: src/tgetpass.c:327
+#: src/tgetpass.c:326
#, c-format
msgid "unable to set gid to %u"
msgstr "kunde inte ställa in gid till %u"
-#: src/tgetpass.c:331
+#: src/tgetpass.c:336
#, c-format
msgid "unable to set uid to %u"
msgstr "kunde inte ställa in uid till %u"
-#: src/tgetpass.c:336
+#: src/tgetpass.c:341
#, c-format
msgid "unable to run %s"
msgstr "kunde inte köra %s"
-#: src/utmp.c:287
+#: src/utmp.c:288
msgid "unable to save stdin"
msgstr "kunde inte spara standard in"
-#: src/utmp.c:289
+#: src/utmp.c:290
msgid "unable to dup2 stdin"
msgstr "kan inte köra dup2 på standard in"
-#: src/utmp.c:292
+#: src/utmp.c:293
msgid "unable to restore stdin"
msgstr "kan inte återställa standard in"
+#~ msgid "%s%s: %s"
+#~ msgstr "%s%s: %s"
+
+#~ msgid "unable to set tty context to %s"
+#~ msgstr "kunde inte ställa in tty-kontext till %s"
+
+#~ msgid "requires at least one argument"
+#~ msgstr "kräver minst ett argument"
+
+#~ msgid "unable to run %s as a login shell"
+#~ msgstr "kunde inte köra %s som ett inloggningsskal"
+
#~ msgid "%s: short write"
#~ msgstr "%s: kort skrivning"
@@ -1019,9 +1208,6 @@ 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?"
diff --git a/po/uk.mo b/po/uk.mo
index 6cbecffe2..fce6dc18f 100644
--- a/po/uk.mo
+++ b/po/uk.mo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index a6936569f..efe417b37 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -4,10 +4,10 @@
# Yuri Chornoivan <yurchor@ukr.net>, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022.
msgid ""
msgstr ""
-"Project-Id-Version: sudo 1.9.11b1\n"
+"Project-Id-Version: sudo 1.9.12b2\n"
"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2022-05-27 08:39-0600\n"
-"PO-Revision-Date: 2022-05-29 12:09+0300\n"
+"POT-Creation-Date: 2022-10-09 09:48-0600\n"
+"PO-Revision-Date: 2022-10-11 12:15+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
@@ -32,76 +32,75 @@ msgid "unable to restore registry"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ регіÑÑ‚Ñ€"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/gidlist.c:76
-#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:218
-#: lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381 lib/util/sudo_conf.c:665
-#: src/conversation.c:80 src/exec_monitor.c:205 src/exec_monitor.c:458
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:219
+#: lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382 lib/util/sudo_conf.c:666
+#: src/conversation.c:80 src/exec_iolog.c:124 src/exec_iolog.c:135
+#: src/exec_iolog.c:212 src/exec_monitor.c:205 src/exec_monitor.c:458
#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
#: 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_nopty.c:224 src/exec_nopty.c:233
-#: src/exec_nopty.c:240 src/exec_nopty.c:247 src/exec_nopty.c:254
-#: src/exec_nopty.c:261 src/exec_nopty.c:268 src/exec_nopty.c:275
-#: src/exec_nopty.c:282 src/exec_nopty.c:289 src/exec_nopty.c:296
-#: src/exec_nopty.c:303 src/exec_nopty.c:311 src/exec_nopty.c:549
-#: src/exec_preload.c:143 src/exec_preload.c:204 src/exec_ptrace.c:632
-#: src/exec_ptrace.c:730 src/exec_ptrace.c:895 src/exec_pty.c:845
-#: src/exec_pty.c:854 src/exec_pty.c:911 src/exec_pty.c:1075
-#: src/exec_pty.c:1265 src/exec_pty.c:1274 src/exec_pty.c:1281
-#: src/exec_pty.c:1288 src/exec_pty.c:1295 src/exec_pty.c:1302
-#: src/exec_pty.c:1309 src/exec_pty.c:1316 src/exec_pty.c:1323
-#: src/exec_pty.c:1330 src/exec_pty.c:1337 src/exec_pty.c:1345
-#: src/exec_pty.c:1811 src/load_plugins.c:156 src/load_plugins.c:181
-#: src/load_plugins.c:217 src/load_plugins.c:449 src/load_plugins.c:455
-#: src/parse_args.c:169 src/parse_args.c:190 src/parse_args.c:264
-#: src/parse_args.c:613 src/parse_args.c:635 src/parse_args.c:660
-#: src/preserve_fds.c:46 src/preserve_fds.c:131 src/selinux.c:89
-#: src/selinux.c:362 src/selinux.c:474 src/selinux.c:485 src/sesh.c:113
-#: src/sesh.c:146 src/sesh.c:152 src/sesh.c:159 src/sesh.c:165 src/sesh.c:410
-#: src/sudo.c:639 src/sudo.c:712 src/sudo.c:722 src/sudo.c:748 src/sudo.c:771
-#: src/sudo.c:780 src/sudo.c:789 src/sudo.c:806 src/sudo.c:848 src/sudo.c:858
-#: src/sudo.c:891 src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414
-#: src/sudo.c:1583 src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89
-#: src/sudo_edit.c:149 src/sudo_edit.c:429 src/sudo_edit.c:438
-#: src/sudo_edit.c:539 src/sudo_edit.c:546 src/sudo_edit.c:677
-#: src/sudo_edit.c:697 src/sudo_intercept_common.c:113
-#: src/sudo_intercept_common.c:317
+#: src/exec_monitor.c:529 src/exec_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_nopty.c:732 src/exec_preload.c:341 src/exec_ptrace.c:474
+#: src/exec_ptrace.c:767 src/exec_ptrace.c:982 src/exec_ptrace.c:1094
+#: src/exec_ptrace.c:1269 src/exec_ptrace.c:1611 src/exec_ptrace.c:1638
+#: src/exec_pty.c:506 src/exec_pty.c:687 src/exec_pty.c:873 src/exec_pty.c:882
+#: src/exec_pty.c:889 src/exec_pty.c:896 src/exec_pty.c:903 src/exec_pty.c:910
+#: src/exec_pty.c:917 src/exec_pty.c:924 src/exec_pty.c:931 src/exec_pty.c:938
+#: src/exec_pty.c:945 src/exec_pty.c:953 src/load_plugins.c:157
+#: src/load_plugins.c:182 src/load_plugins.c:218 src/load_plugins.c:451
+#: src/load_plugins.c:457 src/parse_args.c:172 src/parse_args.c:193
+#: src/parse_args.c:267 src/parse_args.c:623 src/parse_args.c:645
+#: src/parse_args.c:670 src/preserve_fds.c:46 src/preserve_fds.c:131
+#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:472 src/selinux.c:489
+#: src/selinux.c:496 src/sesh.c:206 src/sesh.c:240 src/sesh.c:246
+#: src/sesh.c:253 src/sesh.c:259 src/sesh.c:470 src/sudo.c:639 src/sudo.c:704
+#: src/sudo.c:714 src/sudo.c:741 src/sudo.c:764 src/sudo.c:773 src/sudo.c:782
+#: src/sudo.c:799 src/sudo.c:841 src/sudo.c:851 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
#, c-format
msgid "%s: %s"
msgstr "%s: %s"
#: lib/util/aix.c:272 lib/util/gidlist.c:66 lib/util/json.c:55
#: lib/util/json.c:184 lib/util/regex.c:113 lib/util/regex.c:121
-#: lib/util/sudo_conf.c:219 lib/util/sudo_conf.c:304 lib/util/sudo_conf.c:381
-#: lib/util/sudo_conf.c:665 src/conversation.c:81 src/exec_intercept.c:68
-#: src/exec_intercept.c:336 src/exec_intercept.c:359 src/exec_intercept.c:367
-#: src/exec_intercept.c:392 src/exec_intercept.c:398 src/exec_intercept.c:407
-#: src/exec_intercept.c:413 src/exec_intercept.c:478 src/exec_intercept.c:588
-#: src/exec_intercept.c:707 src/exec_monitor.c:458 src/exec_monitor.c:464
-#: src/exec_monitor.c:472 src/exec_monitor.c:480 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_nopty.c:224 src/exec_nopty.c:233 src/exec_nopty.c:240
-#: src/exec_nopty.c:247 src/exec_nopty.c:254 src/exec_nopty.c:261
-#: src/exec_nopty.c:268 src/exec_nopty.c:275 src/exec_nopty.c:282
-#: src/exec_nopty.c:289 src/exec_nopty.c:296 src/exec_nopty.c:303
-#: src/exec_nopty.c:311 src/exec_preload.c:143 src/exec_preload.c:204
-#: src/exec_ptrace.c:632 src/exec_pty.c:845 src/exec_pty.c:854
-#: src/exec_pty.c:911 src/exec_pty.c:1265 src/exec_pty.c:1274
-#: src/exec_pty.c:1281 src/exec_pty.c:1288 src/exec_pty.c:1295
-#: src/exec_pty.c:1302 src/exec_pty.c:1309 src/exec_pty.c:1316
-#: src/exec_pty.c:1323 src/exec_pty.c:1330 src/exec_pty.c:1337
-#: src/exec_pty.c:1345 src/exec_pty.c:1811 src/load_plugins.c:156
-#: src/load_plugins.c:181 src/load_plugins.c:217 src/load_plugins.c:449
-#: src/load_plugins.c:455 src/parse_args.c:169 src/parse_args.c:191
-#: src/parse_args.c:264 src/parse_args.c:613 src/parse_args.c:635
-#: src/parse_args.c:660 src/preserve_fds.c:46 src/preserve_fds.c:131
-#: src/selinux.c:89 src/selinux.c:362 src/selinux.c:474 src/selinux.c:485
-#: src/sesh.c:113 src/sesh.c:411 src/sudo.c:230 src/sudo.c:639 src/sudo.c:891
-#: src/sudo.c:1100 src/sudo.c:1121 src/sudo.c:1414 src/sudo.c:1583
-#: src/sudo.c:1810 src/sudo.c:2144 src/sudo_edit.c:89 src/sudo_edit.c:149
-#: src/sudo_edit.c:429 src/sudo_edit.c:438 src/sudo_edit.c:539
-#: src/sudo_edit.c:546 src/sudo_edit.c:677 src/sudo_edit.c:697
-#: src/sudo_intercept_common.c:113 src/sudo_intercept_common.c:317
+#: lib/util/sudo_conf.c:220 lib/util/sudo_conf.c:305 lib/util/sudo_conf.c:382
+#: lib/util/sudo_conf.c:666 src/conversation.c:81 src/exec_intercept.c:111
+#: src/exec_intercept.c:344 src/exec_intercept.c:504 src/exec_intercept.c:566
+#: src/exec_intercept.c:682 src/exec_intercept.c:806 src/exec_iolog.c:124
+#: src/exec_iolog.c:135 src/exec_iolog.c:212 src/exec_monitor.c:458
+#: src/exec_monitor.c:464 src/exec_monitor.c:472 src/exec_monitor.c:480
+#: 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_nopty.c:227 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:306 src/exec_nopty.c:314 src/exec_nopty.c:322
+#: src/exec_preload.c:341 src/exec_ptrace.c:474 src/exec_ptrace.c:767
+#: src/exec_ptrace.c:982 src/exec_ptrace.c:1638 src/exec_pty.c:506
+#: src/exec_pty.c:873 src/exec_pty.c:882 src/exec_pty.c:889 src/exec_pty.c:896
+#: src/exec_pty.c:903 src/exec_pty.c:910 src/exec_pty.c:917 src/exec_pty.c:924
+#: src/exec_pty.c:931 src/exec_pty.c:938 src/exec_pty.c:945 src/exec_pty.c:953
+#: src/load_plugins.c:157 src/load_plugins.c:182 src/load_plugins.c:218
+#: src/load_plugins.c:451 src/load_plugins.c:457 src/parse_args.c:172
+#: src/parse_args.c:194 src/parse_args.c:267 src/parse_args.c:623
+#: src/parse_args.c:645 src/parse_args.c:670 src/preserve_fds.c:46
+#: src/preserve_fds.c:131 src/selinux.c:89 src/selinux.c:362 src/selinux.c:472
+#: src/selinux.c:489 src/selinux.c:496 src/sesh.c:206 src/sesh.c:471
+#: src/sudo.c:230 src/sudo.c:639 src/sudo.c:884 src/sudo.c:1112
+#: src/sudo.c:1133 src/sudo.c:1426 src/sudo.c:1595 src/sudo.c:1822
+#: src/sudo.c:2156 src/sudo_edit.c:89 src/sudo_edit.c:149 src/sudo_edit.c:429
+#: src/sudo_edit.c:438 src/sudo_edit.c:538 src/sudo_edit.c:545
+#: src/sudo_edit.c:673 src/sudo_edit.c:693 src/sudo_intercept_common.c:115
+#: src/sudo_intercept_common.c:340
msgid "unable to allocate memory"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ потрібний об’єм пам’ÑÑ‚Ñ–"
@@ -115,23 +114,23 @@ msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ stat Ð´Ð»Ñ %.*s"
msgid "%.*s exists but is not a directory (0%o)"
msgstr "%.*s Ñ–Ñнує, але не Ñ” каталогом (0%o)"
-#: lib/util/mkdir_parents.c:102 lib/util/sudo_conf.c:704 src/selinux.c:235
-#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:559
+#: lib/util/mkdir_parents.c:103 lib/util/sudo_conf.c:677
+#: lib/util/sudo_conf.c:689 lib/util/sudo_conf.c:715 src/selinux.c:235
+#: src/selinux.c:265 src/sudo.c:371 src/sudo_edit.c:494 src/sudo_edit.c:557
#, c-format
msgid "unable to open %s"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %s"
-#: lib/util/mkdir_parents.c:119 lib/util/mkdir_parents.c:127
-#: lib/util/mkdir_parents.c:136
-#, c-format
-msgid "unable to open %.*s"
-msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %.*s"
-
-#: lib/util/mkdir_parents.c:157
+#: lib/util/mkdir_parents.c:120 lib/util/mkdir_parents.c:160
#, c-format
msgid "unable to mkdir %.*s"
msgstr "не вдалоÑÑ Ñтворити каталог %.*s"
+#: lib/util/mkdir_parents.c:130 lib/util/mkdir_parents.c:139
+#, c-format
+msgid "unable to open %.*s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %.*s"
+
#: lib/util/regex.c:103
msgid "regular expression too large"
msgstr "задовгий формальний вираз"
@@ -140,8 +139,8 @@ msgstr "задовгий формальний вираз"
msgid "Unknown signal"
msgstr "Ðевідомий Ñигнал"
-#: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187 src/sesh.c:146 src/sesh.c:159
+#: lib/util/strtoid.c:84 lib/util/strtomode.c:52 lib/util/strtonum.c:148
+#: lib/util/strtonum.c:187 src/sesh.c:240 src/sesh.c:253
msgid "invalid value"
msgstr "некоректне значеннÑ"
@@ -153,86 +152,86 @@ msgstr "надто велике значеннÑ"
msgid "value too small"
msgstr "надто мале значеннÑ"
-#: lib/util/sudo_conf.c:237
+#: lib/util/sudo_conf.c:238
#, c-format
msgid "invalid Path value \"%s\" in %s, line %u"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Path, «%s», у %s, Ñ€Ñдок %u"
-#: lib/util/sudo_conf.c:403 lib/util/sudo_conf.c:419 lib/util/sudo_conf.c:472
+#: lib/util/sudo_conf.c:404 lib/util/sudo_conf.c:420 lib/util/sudo_conf.c:473
#, c-format
msgid "invalid value for %s \"%s\" in %s, line %u"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s, «%s», у %s, Ñ€Ñдок %u"
-#: lib/util/sudo_conf.c:440
+#: lib/util/sudo_conf.c:441
#, c-format
msgid "unsupported group source \"%s\" in %s, line %u"
msgstr "непідтримуване джерело групи, «%s», у %s, Ñ€Ñдок %u"
-#: lib/util/sudo_conf.c:456
+#: lib/util/sudo_conf.c:457
#, c-format
msgid "invalid max groups \"%s\" in %s, line %u"
msgstr "некоректна макÑимальна кількіÑÑ‚ÑŒ груп, «%s», у %s, Ñ€Ñдок %u"
-#: lib/util/sudo_conf.c:681 src/copy_file.c:150
-#, c-format
-msgid "unable to stat %s"
-msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ stat Ð´Ð»Ñ %s"
-
-#: lib/util/sudo_conf.c:684
+#: lib/util/sudo_conf.c:692
#, c-format
msgid "%s is not a regular file"
msgstr "%s не є звичайним файлом"
-#: lib/util/sudo_conf.c:687 src/copy_file.c:163
+#: lib/util/sudo_conf.c:695 src/copy_file.c:164
#, c-format
msgid "%s is owned by uid %u, should be %u"
msgstr "%s належить uid %u, має належати %u"
-#: lib/util/sudo_conf.c:691
+#: lib/util/sudo_conf.c:699
#, c-format
msgid "%s is world writable"
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð´Ð¾ «%s» можливий Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð»ÑŒÐ½Ð¾Ð³Ð¾ кориÑтувача"
-#: lib/util/sudo_conf.c:694
+#: lib/util/sudo_conf.c:702
#, c-format
msgid "%s is group writable"
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð´Ð¾ «%s» може здійÑнювати будь-Ñкий кориÑтувач з групи"
-#: src/apparmor.c:79
+#: src/apparmor.c:85
msgid "failed to determine AppArmor confinement"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ контейнер AppArmor"
-#: src/apparmor.c:87
+#: src/apparmor.c:93
#, c-format
msgid "unable to change AppArmor profile to %s"
msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ профіль AppArmor на %s"
-#: src/copy_file.c:93
+#: src/copy_file.c:94
#, c-format
msgid "%s: truncate %s to zero bytes? (y/n) [n] "
msgstr "%s: обрізати %s до Ð½ÑƒÐ»Ñ Ð±Ð°Ð¹Ñ‚Ñ–Ð²? (y/n) [n] "
-#: src/copy_file.c:97
+#: src/copy_file.c:98
#, c-format
msgid "not overwriting %s"
msgstr "не перезапиÑуємо %s"
-#: src/copy_file.c:119
+#: src/copy_file.c:120
#, c-format
msgid "unable to read from %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· %s"
-#: src/copy_file.c:136 src/sudo_edit.c:320
+#: src/copy_file.c:137 src/sudo_edit.c:320
#, c-format
msgid "unable to write to %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ %s"
-#: src/copy_file.c:154 src/sesh.c:218 src/sudo_edit.c:197
+#: src/copy_file.c:151
+#, c-format
+msgid "unable to stat %s"
+msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ stat Ð´Ð»Ñ %s"
+
+#: src/copy_file.c:155 src/sesh.c:312 src/sudo_edit.c:197
#, c-format
msgid "%s: not a regular file"
msgstr "%s: не є звичайним файлом"
-#: src/copy_file.c:158
+#: src/copy_file.c:159
#, c-format
msgid "%s: bad file mode: 0%o"
msgstr "%s: помилковий режим доÑтупу до файла: 0%o"
@@ -241,60 +240,59 @@ msgstr "%s: помилковий режим доÑтупу до файла: 0%o"
msgid "unable to restore current working directory"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ поточний робочий каталог"
-#: src/exec.c:103
+#: src/exec.c:111
msgid "unable to set privileges"
msgstr "не вдалоÑÑ Ð²Ñтановити привілеї"
-#: src/exec.c:109 src/exec.c:114
+#: src/exec.c:117 src/exec.c:122
msgid "unable to set limit privileges"
msgstr "не вдалоÑÑ Ð²Ñтановити привілеї щодо обмеженнÑ"
-#: src/exec.c:137
+#: src/exec.c:145
#, c-format
msgid "unknown login class %s"
msgstr "невідомий ÐºÐ»Ð°Ñ Ð²Ñ…Ð¾Ð´Ñƒ %s"
-#: src/exec.c:149
+#: src/exec.c:157
msgid "unable to set user context"
msgstr "не вдалоÑÑ Ð²Ñтановити контекÑÑ‚ кориÑтувача"
-#: src/exec.c:165
+#: src/exec.c:173
msgid "unable to set process priority"
msgstr "не вдалоÑÑ Ð²Ñтановити пріоритет процеÑу"
-#: src/exec.c:182
+#: src/exec.c:190
#, c-format
msgid "unable to change root to %s"
msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ root на %s"
-#: src/exec.c:195 src/exec.c:201 src/exec.c:208
+#: src/exec.c:203 src/exec.c:209 src/exec.c:216
#, c-format
msgid "unable to change to runas uid (%u, %u)"
msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ uid кориÑтувача, від імені Ñкого відбуваєтьÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ (%u, %u)"
-#: src/exec.c:226
+#: src/exec.c:238 src/sesh.c:199
#, c-format
msgid "unable to change directory to %s"
msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на %s"
-#: src/exec.c:230
+#: src/exec.c:243
#, c-format
msgid "starting from %s"
msgstr "починаючи з %s"
-#: src/exec.c:312 src/exec_monitor.c:575 src/exec_monitor.c:577
-#: src/exec_monitor.c:648 src/exec_nopty.c:439 src/exec_pty.c:586
-#: src/exec_pty.c:1447 src/exec_pty.c:1449 src/signal.c:144 src/signal.c:151
-#: src/signal.c:165 src/suspend_nopty.c:89
+#: src/exec.c:278 src/exec.c:351 src/exec_monitor.c:567 src/exec_monitor.c:569
+#: src/exec_pty.c:225 src/exec_pty.c:1017 src/exec_pty.c:1019 src/signal.c:144
+#: src/signal.c:151 src/signal.c:165 src/suspend_nopty.c:93
#, c-format
msgid "unable to set handler for signal %d"
msgstr "не вдалоÑÑ Ð²Ñтановити обробник Ð´Ð»Ñ Ñигналу %d"
-#: src/exec.c:391
+#: src/exec.c:422
msgid "intercept mode is not supported with SELinux RBAC on this system"
msgstr "у цій ÑиÑтемі з RBAC SELinux не передбачено підтримки режиму перехопленнÑ"
-#: src/exec.c:396
+#: src/exec.c:427
msgid "unable to log sub-commands with SELinux RBAC on this system"
msgstr "у цій ÑиÑтемі неможливо запиÑувати до журналу підкоманди з RBAC SELinux"
@@ -302,58 +300,84 @@ msgstr "у цій ÑиÑтемі неможливо запиÑувати до ж
msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT"
msgstr "не вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ PRIV_PROC_EXEC з PRIV_LIMIT"
-#: src/exec_intercept.c:95 src/exec_intercept.c:674 src/exec_intercept.c:864
-#: src/exec_intercept.c:876 src/exec_monitor.c:466 src/exec_monitor.c:474
-#: src/exec_monitor.c:482 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_nopty.c:226
-#: src/exec_nopty.c:235 src/exec_nopty.c:242 src/exec_nopty.c:249
-#: src/exec_nopty.c:256 src/exec_nopty.c:263 src/exec_nopty.c:270
-#: src/exec_nopty.c:277 src/exec_nopty.c:284 src/exec_nopty.c:291
-#: src/exec_nopty.c:298 src/exec_nopty.c:305 src/exec_nopty.c:313
-#: src/exec_pty.c:711 src/exec_pty.c:716 src/exec_pty.c:813 src/exec_pty.c:820
-#: src/exec_pty.c:917 src/exec_pty.c:1267 src/exec_pty.c:1276
-#: src/exec_pty.c:1283 src/exec_pty.c:1290 src/exec_pty.c:1297
-#: src/exec_pty.c:1304 src/exec_pty.c:1311 src/exec_pty.c:1318
-#: src/exec_pty.c:1325 src/exec_pty.c:1332 src/exec_pty.c:1339
-#: src/exec_pty.c:1764 src/exec_pty.c:1774 src/exec_pty.c:1819
-#: src/exec_pty.c:1826 src/exec_pty.c:1853
+#: src/exec_intercept.c:70 src/exec_iolog.c:165 src/exec_iolog.c:175
+#: src/exec_iolog.c:220 src/exec_iolog.c:227 src/exec_iolog.c:254
+#: src/exec_monitor.c:466 src/exec_monitor.c:474 src/exec_monitor.c:482
+#: 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_nopty.c:229 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:308 src/exec_nopty.c:316 src/exec_nopty.c:324
+#: src/exec_nopty.c:383 src/exec_nopty.c:449 src/exec_pty.c:355
+#: src/exec_pty.c:457 src/exec_pty.c:512 src/exec_pty.c:875 src/exec_pty.c:884
+#: src/exec_pty.c:891 src/exec_pty.c:898 src/exec_pty.c:905 src/exec_pty.c:912
+#: src/exec_pty.c:919 src/exec_pty.c:926 src/exec_pty.c:933 src/exec_pty.c:940
+#: src/exec_pty.c:947
msgid "unable to add event to queue"
msgstr "не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ подію до черги обробки"
-#: src/exec_intercept.c:344 src/sudo.c:1226 src/sudo.c:1271 src/sudo.c:1315
+#: src/exec_intercept.c:317 src/sudo.c:1018
+msgid "command not set by the security policy"
+msgstr "команду не вÑтановлено правилами захиÑту"
+
+#: src/exec_intercept.c:393 src/exec_intercept.c:421 src/sudo.c:1238
+#: src/sudo.c:1283 src/sudo.c:1327
msgid "command rejected by policy"
msgstr "у виконанні команди відмовлено згідно правил"
-#: src/exec_intercept.c:437 src/sudo.c:1231 src/sudo.c:1276 src/sudo.c:1320
-#: src/sudo.c:1394
+#: src/exec_intercept.c:491 src/sudo.c:1925
+msgid "approval plugin error"
+msgstr "помилка у додатку підтвердженнÑ"
+
+#: src/exec_intercept.c:508 src/sudo.c:1243 src/sudo.c:1288 src/sudo.c:1332
+#: src/sudo.c:1406
msgid "policy plugin error"
msgstr "помилка у додатку правил"
-#: src/exec_intercept.c:462
+#: src/exec_intercept.c:543
msgid "invalid PolicyCheckRequest"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ PolicyCheckRequest"
-#: src/exec_intercept.c:584
+#: src/exec_intercept.c:678
#, c-format
msgid "client request too large: %zu"
msgstr "надто великий запит клієнта: %zu"
-#: src/exec_intercept.c:622
+#: src/exec_intercept.c:720
#, c-format
msgid "unable to unpack %s size %zu"
msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ %s, розмір %zu"
-#: src/exec_intercept.c:665
+#: src/exec_intercept.c:768
#, c-format
msgid "unexpected type_case value %d in %s from %s"
msgstr "неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ type_case %d у %s від %s"
-#: src/exec_intercept.c:695
+#: src/exec_intercept.c:794
#, c-format
msgid "server message too large: %zu"
msgstr "надто велике Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера: %zu"
+#: src/exec_iolog.c:323 src/exec_iolog.c:363 src/exec_iolog.c:403
+#: src/exec_iolog.c:454 src/exec_iolog.c:505
+msgid "I/O plugin error"
+msgstr "Помилка у додатку введеннÑ-виведеннÑ"
+
+#: src/exec_iolog.c:327 src/exec_iolog.c:367 src/exec_iolog.c:407
+#: src/exec_iolog.c:458 src/exec_iolog.c:509
+msgid "command rejected by I/O plugin"
+msgstr "відмова у Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ від додатка введеннÑ-виведеннÑ"
+
+#: src/exec_iolog.c:556
+msgid "error logging suspend"
+msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ñ€Ð¸Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ"
+
+#: src/exec_iolog.c:591
+msgid "error changing window size"
+msgstr "помилка під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ розмірів вікна"
+
#: src/exec_monitor.c:360
msgid "error reading from socketpair"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· пари Ñокетів"
@@ -363,224 +387,213 @@ msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· пари ÑÐ
msgid "unexpected reply type on backchannel: %d"
msgstr "неочікуваний тип відповіді на зворотному каналі: %d"
-#: src/exec_monitor.c:593
+#: src/exec_monitor.c:585
msgid "unable to set controlling tty"
msgstr "не вдалоÑÑ Ð²Ñтановити tty Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ"
-#: src/exec_monitor.c:601 src/exec_nopty.c:382 src/exec_pty.c:1526
-#: src/exec_pty.c:1547 src/exec_pty.c:1567 src/tgetpass.c:305
+#: src/exec_monitor.c:593 src/exec_nopty.c:494 src/exec_nopty.c:504
+#: src/exec_nopty.c:514 src/exec_nopty.c:548 src/exec_pty.c:1088
+#: src/exec_pty.c:1109 src/exec_pty.c:1129 src/tgetpass.c:305
msgid "unable to create pipe"
msgstr "не вдалоÑÑ Ñтворити канал"
-#: src/exec_monitor.c:611
+#: src/exec_monitor.c:603
msgid "unable to receive message from parent"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ батьківÑького процеÑу"
-#: src/exec_monitor.c:627 src/exec_nopty.c:422 src/exec_pty.c:1605
+#: src/exec_monitor.c:619 src/exec_nopty.c:591 src/exec_pty.c:1167
#: src/sudo_edit.c:361 src/tgetpass.c:309
msgid "unable to fork"
msgstr "не вдалоÑÑ Ñтворити відгалуженнÑ"
-#: src/exec_monitor.c:631 src/exec_monitor.c:749 src/exec_nopty.c:518
+#: src/exec_monitor.c:623 src/exec_monitor.c:721 src/exec_nopty.c:696
msgid "unable to restore tty label"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ позначку tty"
-#: src/exec_monitor.c:664 src/sesh.c:123 src/sudo.c:1177
+#: src/exec_monitor.c:636 src/sesh.c:217 src/sudo.c:1189
#, c-format
msgid "unable to execute %s"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ %s"
-#: src/exec_nopty.c:376 src/exec_pty.c:1456
+#: src/exec_nopty.c:542 src/exec_pty.c:1026
msgid "policy plugin failed session initialization"
msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ ініціалізацію ÑеанÑу через додаток правил"
-#: src/exec_nopty.c:391 src/exec_pty.c:1425 src/exec_pty.c:1434
+#: src/exec_nopty.c:557 src/exec_pty.c:995 src/exec_pty.c:1004
msgid "unable to create sockets"
msgstr "не вдалоÑÑ Ñтворити Ñокети"
-#: src/exec_nopty.c:506 src/exec_pty.c:1703
+#: src/exec_nopty.c:684 src/exec_pty.c:1265
msgid "error in event loop"
msgstr "помилка у циклі обробки подій"
-#: src/exec_ptrace.c:647
-msgid "insufficient space for execve arguments"
-msgstr "недоÑтатньо міÑÑ†Ñ Ð´Ð»Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² execve"
-
-#: src/exec_ptrace.c:658 src/exec_ptrace.c:668 src/exec_ptrace.c:678
+#: src/exec_preload.c:165 src/net_ifs.c:206 src/net_ifs.c:372
+#: src/net_ifs.c:433 src/net_ifs.c:620 src/net_ifs.c:851 src/sudo.c:486
+#: src/sudo_edit.c:398 src/sudo_edit.c:406
#, c-format
-msgid "unable to read execve %s for process %d"
-msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ %s execve Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу %d"
+msgid "internal error, %s overflow"
+msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ %s"
-#: src/exec_ptrace.c:714 src/exec_ptrace.c:739 src/exec_ptrace.c:1194
+#: src/exec_ptrace.c:1078 src/exec_ptrace.c:1103 src/exec_ptrace.c:1909
#, c-format
msgid "unable to set registers for process %d"
msgstr "не вдалоÑÑ Ð²Ñтановити регіÑтри Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу %d"
-#: src/exec_ptrace.c:734 src/exec_ptrace.c:899
+#: src/exec_ptrace.c:1098 src/exec_ptrace.c:1273 src/exec_ptrace.c:1615
#, c-format
msgid "process %d exited unexpectedly"
msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ %d неочікувано завершив роботу"
-#: src/exec_ptrace.c:843
+#: src/exec_ptrace.c:1207
msgid "unable to set seccomp filter"
msgstr "не вдалоÑÑ Ð²Ñтановити фільтр seccomp"
-#: src/exec_ptrace.c:934
+#: src/exec_ptrace.c:1404
+#, c-format
+msgid "interpreter argument , expected \"%s\", got \"%s\""
+msgstr "аргумент інтерпретатора , мало бути «%s», маємо «%s»"
+
+#: src/exec_ptrace.c:1503
#, c-format
msgid "pathname mismatch, expected \"%s\", got \"%s\""
msgstr "невідповідніÑÑ‚ÑŒ шлÑхів: мало бути «%s», маємо «%s»"
-#: src/exec_ptrace.c:942 src/exec_ptrace.c:948 src/exec_ptrace.c:954
-#: src/exec_ptrace.c:962 src/exec_ptrace.c:968 src/exec_ptrace.c:974
+#: src/exec_ptrace.c:1512 src/exec_ptrace.c:1519 src/exec_ptrace.c:1532
+#: src/exec_ptrace.c:1540 src/exec_ptrace.c:1546 src/exec_ptrace.c:1552
#, c-format
msgid "%s[%d] mismatch, expected \"%s\", got \"%s\""
msgstr "невідповідніÑÑ‚ÑŒ %s[%d]: мало бути «%s», маємо «%s»"
-#: src/exec_ptrace.c:1013
+#: src/exec_ptrace.c:1619
+#, c-format
+msgid "process %d unexpected status 0x%x"
+msgstr "неочікуваний Ñтан процеÑу %d: 0x%x"
+
+#: src/exec_ptrace.c:1711
#, c-format
msgid "unable to get event message for process %d"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ— Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу %d"
-#: src/exec_ptrace.c:1019
+#: src/exec_ptrace.c:1718
#, c-format
msgid "unable to get registers for process %d"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ регіÑтри Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу %d"
-#: src/exec_pty.c:163
+#: src/exec_pty.c:103
msgid "unable to allocate pty"
msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñтити pty"
-#: src/exec_pty.c:227 src/exec_pty.c:267 src/exec_pty.c:307 src/exec_pty.c:358
-#: src/exec_pty.c:409
-msgid "I/O plugin error"
-msgstr "Помилка у додатку введеннÑ-виведеннÑ"
-
-#: src/exec_pty.c:231 src/exec_pty.c:271 src/exec_pty.c:311 src/exec_pty.c:362
-#: src/exec_pty.c:413
-msgid "command rejected by I/O plugin"
-msgstr "відмова у Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ від додатка введеннÑ-виведеннÑ"
-
-#: src/exec_pty.c:460
-msgid "error logging suspend"
-msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ñ€Ð¸Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ"
-
-#: src/exec_pty.c:494
-msgid "error changing window size"
-msgstr "помилка під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ розмірів вікна"
-
-#: src/exec_pty.c:624 src/signal.c:101 src/suspend_nopty.c:95
+#: src/exec_pty.c:263 src/signal.c:101 src/suspend_nopty.c:99
#, c-format
msgid "unable to restore handler for signal %d"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ обробник Ð´Ð»Ñ Ñигналу %d"
-#: src/exec_pty.c:1651
+#: src/exec_pty.c:1213
msgid "unable to send message to monitor process"
msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ процеÑу аудиту"
-#: src/load_plugins.c:108 src/load_plugins.c:122 src/load_plugins.c:128
-#: src/load_plugins.c:277 src/load_plugins.c:287 src/load_plugins.c:297
-#: src/load_plugins.c:344
+#: src/load_plugins.c:109 src/load_plugins.c:123 src/load_plugins.c:129
+#: src/load_plugins.c:279 src/load_plugins.c:289 src/load_plugins.c:299
+#: src/load_plugins.c:346
#, c-format
msgid "error in %s, line %d while loading plugin \"%s\""
msgstr "помилка у %s, Ñ€Ñдок %d під Ñ‡Ð°Ñ Ñпроби Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ° «%s»"
-#: src/load_plugins.c:124
+#: src/load_plugins.c:125
#, c-format
msgid "%s must be owned by uid %d"
msgstr "%s має належати кориÑтувачеві з uid %d"
-#: src/load_plugins.c:130
+#: src/load_plugins.c:131
#, c-format
msgid "%s must be only be writable by owner"
msgstr "%s має бути доÑтупним до запиÑу лише Ð´Ð»Ñ Ð²Ð»Ð°Ñника"
-#: src/load_plugins.c:241 src/load_plugins.c:312
+#: src/load_plugins.c:243 src/load_plugins.c:314
#, c-format
msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
msgstr "ігноруємо повторний Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ°, «%s», у %s, Ñ€Ñдок %d"
-#: src/load_plugins.c:279
+#: src/load_plugins.c:281
#, c-format
msgid "unable to load %s: %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ %s: %s"
-#: src/load_plugins.c:289
+#: src/load_plugins.c:291
#, c-format
msgid "unable to find symbol \"%s\" in %s"
msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñимвол «%s» у %s"
-#: src/load_plugins.c:299
+#: src/load_plugins.c:301
#, c-format
msgid "incompatible plugin major version %d (expected %d) found in %s"
msgstr "неÑуміÑна оÑновна верÑÑ–Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ°, %d, (мало бути %d) у %s"
-#: src/load_plugins.c:317
+#: src/load_plugins.c:319
#, c-format
msgid "ignoring policy plugin \"%s\" in %s, line %d"
msgstr "ігноруємо додаток правил, «%s», у %s, Ñ€Ñдок %d"
-#: src/load_plugins.c:320
+#: src/load_plugins.c:322
msgid "only a single policy plugin may be specified"
msgstr "можна визначати лише один додаток обробки правил"
-#: src/load_plugins.c:346
+#: src/load_plugins.c:348
#, c-format
msgid "unknown plugin type %d found in %s"
msgstr "у %2$s виÑвлено невідомий тип додатка, %1$d"
-#: src/load_plugins.c:529
+#: src/load_plugins.c:531
#, c-format
msgid "policy plugin %s does not include a check_policy method"
msgstr "до додатка правил %s не включено метод check_policy"
-#: src/net_ifs.c:210 src/net_ifs.c:376 src/net_ifs.c:437 src/net_ifs.c:624
-#: src/net_ifs.c:855 src/sudo.c:486 src/sudo_edit.c:398 src/sudo_edit.c:406
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ %s"
-
-#: src/parse_args.c:211
+#: src/parse_args.c:214
#, c-format
msgid "invalid environment variable name: %s"
msgstr "некоректна назва змінної Ñередовища: %s"
-#: src/parse_args.c:314
+#: src/parse_args.c:317
msgid "the argument to -C must be a number greater than or equal to 3"
msgstr "аргументом параметра -C mмає бути чиÑло не менше за 3"
-#: src/parse_args.c:545
+#: src/parse_args.c:554
msgid "you may not specify both the -i and -s options"
msgstr "не можна одночаÑно вказувати параметри -i Ñ– -s"
-#: src/parse_args.c:550
+#: src/parse_args.c:559
msgid "you may not specify both the -i and -E options"
msgstr "не можна одночаÑно вказувати параметри -i Ñ– -E"
-#: src/parse_args.c:560
+#: src/parse_args.c:569
msgid "the -E option is not valid in edit mode"
msgstr "не можна викориÑтовувати -E у режимі редагуваннÑ"
-#: src/parse_args.c:563
+#: src/parse_args.c:572
msgid "you may not specify environment variables in edit mode"
msgstr "не можна вказувати змінні Ñередовища у режимі редагуваннÑ"
-#: src/parse_args.c:573
+#: src/parse_args.c:582
msgid "the -U option may only be used with the -l option"
msgstr "параметр -U можна викориÑтовувати лише разом з параметром -l"
-#: src/parse_args.c:577
+#: src/parse_args.c:586
msgid "the -A and -S options may not be used together"
msgstr "параметри -A Ñ– -S не можна викориÑтовувати одночаÑно"
-#: src/parse_args.c:674
+#: src/parse_args.c:684
msgid "sudoedit is not supported on this platform"
msgstr "підтримки sudoedit Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— платформи не передбачено"
-#: src/parse_args.c:757
+#: src/parse_args.c:767
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:773
+#: src/parse_args.c:780
+msgid "Only one of the -K, -k or -N options may be specified"
+msgstr "Може бути вказано лише один параметр з набору -K, -k і -N"
+
+#: src/parse_args.c:796
#, c-format
msgid ""
"%s - edit files as another user\n"
@@ -589,7 +602,7 @@ msgstr ""
"%s — редагувати файли від імені іншого кориÑтувача\n"
"\n"
-#: src/parse_args.c:775
+#: src/parse_args.c:798
#, c-format
msgid ""
"%s - execute a command as another user\n"
@@ -598,7 +611,7 @@ msgstr ""
"%s — виконати команду від імені іншого кориÑтувача\n"
"\n"
-#: src/parse_args.c:781
+#: src/parse_args.c:804
msgid ""
"\n"
"Options:\n"
@@ -606,131 +619,131 @@ msgstr ""
"\n"
"Параметри:\n"
-#: src/parse_args.c:783
+#: src/parse_args.c:806
msgid "use a helper program for password prompting"
msgstr "викориÑтовувати допоміжну програму Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² щодо паролÑ"
-#: src/parse_args.c:786
+#: src/parse_args.c:809
msgid "use specified BSD authentication type"
msgstr "викориÑтовувати вказаний тип Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ BSD"
-#: src/parse_args.c:790
+#: src/parse_args.c:813
msgid "run command in the background"
msgstr "виконати команду у фоновому режимі"
-#: src/parse_args.c:793
+#: src/parse_args.c:816
msgid "ring bell when prompting"
msgstr "звук дзвінка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ"
-#: src/parse_args.c:795
+#: src/parse_args.c:818
msgid "close all file descriptors >= num"
msgstr "закрити вÑÑ– деÑкриптори файлів >= num"
-#: src/parse_args.c:798
+#: src/parse_args.c:821
msgid "run command with the specified BSD login class"
msgstr "виконати команду з вказаним клаÑом доÑтупу BSD"
-#: src/parse_args.c:801
+#: src/parse_args.c:824
msgid "change the working directory before running command"
msgstr "змінити робочий каталог перед виконаннÑм команди"
-#: src/parse_args.c:804
+#: src/parse_args.c:827
msgid "preserve user environment when running command"
msgstr "зберегти Ñередовище кориÑтувача на Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
-#: src/parse_args.c:806
+#: src/parse_args.c:829
msgid "preserve specific environment variables"
msgstr "зберегти вказані змінні Ñередовища"
-#: src/parse_args.c:808
+#: src/parse_args.c:831
msgid "edit files instead of running a command"
msgstr "редагувати файли заміÑÑ‚ÑŒ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
-#: src/parse_args.c:811
+#: src/parse_args.c:834
msgid "run command as the specified group name or ID"
msgstr "виконати команду від імені групи кориÑтувачів, вказаної за назвою або ідентифікатором"
-#: src/parse_args.c:814
+#: src/parse_args.c:837
msgid "set HOME variable to target user's home dir"
msgstr "вÑтановити Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— HOME Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÑŒÐ¾Ð³Ð¾ каталогу вказаного кориÑтувача."
-#: src/parse_args.c:817
+#: src/parse_args.c:840
msgid "display help message and exit"
msgstr "показати довідкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ– завершити роботу"
-#: src/parse_args.c:819
+#: src/parse_args.c:842
msgid "run command on host (if supported by plugin)"
msgstr "виконати команду на комп’ютері (Ñкщо підтримуєтьÑÑ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð¼)"
-#: src/parse_args.c:822
+#: src/parse_args.c:845
msgid "run login shell as the target user; a command may also be specified"
msgstr "запуÑтити оболонку Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ до ÑиÑтеми від імені вказаного кориÑтувача; Ñлід вказати команду запуÑку"
-#: src/parse_args.c:824
+#: src/parse_args.c:847
msgid "remove timestamp file completely"
msgstr "повніÑÑ‚ÑŽ вилучити файл чаÑової позначки"
-#: src/parse_args.c:827
+#: src/parse_args.c:850
msgid "invalidate timestamp file"
msgstr "позбавити чинноÑÑ‚Ñ– файл чаÑової позначки"
-#: src/parse_args.c:830
+#: src/parse_args.c:853
msgid "list user's privileges or check a specific command; use twice for longer format"
msgstr "показати ÑпиÑок прав доÑтупу кориÑтувача або перевірити певну команду; Ð¿Ð¾Ð´Ð²Ð¾Ñ”Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° призводить до Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… даних"
-#: src/parse_args.c:833
+#: src/parse_args.c:856
msgid "non-interactive mode, no prompts are used"
msgstr "неінтерактивний режим, не проÑити кориÑтувача відповідати на питаннÑ"
-#: src/parse_args.c:836
+#: src/parse_args.c:859
msgid "preserve group vector instead of setting to target's"
msgstr "зберегти вектор групи, не вÑтановлювати вектор вказаного кориÑтувача"
-#: src/parse_args.c:839
+#: src/parse_args.c:862
msgid "use the specified password prompt"
msgstr "викориÑтовувати вказаний інÑтрумент Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð²"
-#: src/parse_args.c:841
+#: src/parse_args.c:864
msgid "change the root directory before running command"
msgstr "змінити кореневий каталог перед виконаннÑм команди"
-#: src/parse_args.c:844
+#: src/parse_args.c:867
msgid "create SELinux security context with specified role"
msgstr "Ñтворити контекÑÑ‚ захиÑту SELinux з вказаною роллю"
-#: src/parse_args.c:847
+#: src/parse_args.c:870
msgid "read password from standard input"
msgstr "прочитати пароль зі Ñтандартного джерела вхідних даних"
-#: src/parse_args.c:850
+#: src/parse_args.c:873
msgid "run shell as the target user; a command may also be specified"
msgstr "виконати командну оболонку від імені вказаного кориÑтувача; Ñлід також вказати команду"
-#: src/parse_args.c:854
+#: src/parse_args.c:877
msgid "create SELinux security context with specified type"
msgstr "Ñтворити контекÑÑ‚ захиÑту SELinux вказаного типу"
-#: src/parse_args.c:857
+#: src/parse_args.c:880
msgid "terminate command after the specified time limit"
msgstr "перервати Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ щойно буде перевищено вказане Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð° чаÑом"
-#: src/parse_args.c:860
+#: src/parse_args.c:883
msgid "in list mode, display privileges for user"
msgstr "у режимі ÑпиÑку, показати права доÑтупу кориÑтувача"
-#: src/parse_args.c:863
+#: src/parse_args.c:886
msgid "run command (or edit file) as specified user name or ID"
msgstr "виконати команду (або редагувати файл) від імені кориÑтувача, вказаного за іменем або ідентифікатором"
-#: src/parse_args.c:865
+#: src/parse_args.c:888
msgid "display version information and exit"
msgstr "показати дані щодо верÑÑ–Ñ— Ñ– завершити роботу"
-#: src/parse_args.c:868
+#: src/parse_args.c:891
msgid "update user's timestamp without running a command"
msgstr "оновити штамп чаÑу кориÑтувача без Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
-#: src/parse_args.c:871
+#: src/parse_args.c:894
msgid "stop processing command line arguments"
msgstr "зупинити обробку аргументів командного Ñ€Ñдка"
@@ -830,37 +843,42 @@ msgstr "не вдалоÑÑ Ð²Ñтановити контекÑÑ‚ виконан
msgid "unable to set key creation context to %s"
msgstr "не вдалоÑÑ Ð²Ñтановити контекÑÑ‚ ключа ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñƒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s"
-#: src/sesh.c:72
-msgid "requires at least one argument"
-msgstr "потребує принаймні одного аргументу"
+#: src/sesh.c:114 src/sesh.c:134
+msgid "Only one of the -c or -i options may be specified"
+msgstr "Може бути вказано лише один параметр, -c або -i"
-#: src/sesh.c:104
+#: src/sesh.c:129
#, c-format
msgid "invalid file descriptor number: %s"
msgstr "некоректний номер деÑкриптора файла: %s"
-#: src/sesh.c:118
+#: src/sesh.c:167 src/sesh.c:171 src/sesh.c:175
#, c-format
-msgid "unable to run %s as a login shell"
-msgstr "%s не можна працювати Ñк оболонка Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ"
+msgid "The -%c option may not be used in edit mode."
+msgstr "Параметром -%c не можна кориÑтуватиÑÑ Ñƒ режимі редагуваннÑ."
-#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:204
+#: src/sesh.c:184 src/sesh.c:189
+#, c-format
+msgid "The -%c option may only be used in edit mode."
+msgstr "Параметром -%c можна ÑкориÑтатиÑÑ Ð»Ð¸ÑˆÐµ у режимі редагуваннÑ."
+
+#: src/sesh.c:294 src/sesh.c:394 src/sudo_edit.c:204
#, c-format
msgid "%s: editing symbolic links is not permitted"
msgstr "%s: не можна редагувати Ñимволічні поÑиланнÑ"
-#: src/sesh.c:203 src/sesh.c:303 src/sudo_edit.c:207
+#: src/sesh.c:297 src/sesh.c:397 src/sudo_edit.c:207
#, c-format
msgid "%s: editing files in a writable directory is not permitted"
msgstr "%s: не можна редагувати файли у непридатному до запиÑу каталозі"
-#: src/sesh.c:287 src/sesh.c:308 src/sesh.c:317 src/sesh.c:325
+#: src/sesh.c:381 src/sesh.c:402 src/sesh.c:411 src/sesh.c:419
#: src/sudo_edit.c:331
#, c-format
msgid "contents of edit session left in %s"
msgstr "дані ÑеанÑу Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¸ÑÑ Ñƒ %s"
-#: src/sesh.c:416 src/sudo_edit.c:94
+#: src/sesh.c:476 src/sudo_edit.c:94
msgid "unable to get group list"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок груп"
@@ -944,118 +962,122 @@ msgstr "Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” у базі даних %s"
msgid "unable to determine tty"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ tty"
-#: src/sudo.c:925
+#: src/sudo.c:918
msgid "The \"no new privileges\" flag is set, which prevents sudo from running as root."
msgstr "Ð’Ñтановлено прапорець «без нових привілеїв», Ñкий заборонÑÑ” запуÑк sudo від імені кориÑтувача root."
-#: src/sudo.c:927
+#: src/sudo.c:920
msgid "If sudo is running in a container, you may need to adjust the container configuration to disable the flag."
msgstr "Якщо sudo запущено у контейнері, вам, можливо, Ñлід Ñкоригувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ð°, щоб вимкнути цей прапорець."
-#: src/sudo.c:961
+#: src/sudo.c:954
#, c-format
msgid "%s must be owned by uid %d and have the setuid bit set"
msgstr "%s має належати кориÑтувачеві з uid %d, крім того, має бути вÑтановлено біт setuid"
-#: src/sudo.c:964
+#: src/sudo.c:957
#, 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:970
+#: src/sudo.c:963
#, c-format
msgid "effective uid is not %d, is sudo installed setuid root?"
msgstr "поточним uid не Ñ” %d, sudo вÑтановлено з ідентифікатором кориÑтувача root?"
-#: src/sudo.c:986 src/tgetpass.c:331
+#: src/sudo.c:979 src/tgetpass.c:331
msgid "unable to set supplementary group IDs"
msgstr "не вдалоÑÑ Ð²Ñтановити ідентифікатори додаткових груп"
-#: src/sudo.c:993
+#: src/sudo.c:986
#, c-format
msgid "unable to set effective gid to runas gid %u"
msgstr "не вдалоÑÑ Ð²Ñтановити ефективний ідентифікатор групи Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° групи запуÑку %u"
-#: src/sudo.c:999
+#: src/sudo.c:992
#, c-format
msgid "unable to set gid to runas gid %u"
msgstr "не вдалоÑÑ Ð²Ñтановити ідентифікатор групи Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° групи запуÑку %u"
-#: src/sudo.c:1042
+#: src/sudo.c:1022
+msgid "argv not set by the security policy"
+msgstr "argv не вÑтановлено правилами захиÑту"
+
+#: src/sudo.c:1026
+msgid "envp not set by the security policy"
+msgstr "envp не вÑтановлено правилами захиÑту"
+
+#: src/sudo.c:1048
#, c-format
msgid "unexpected child termination condition: %d"
msgstr "неочікувана умова Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ процеÑу: %d"
-#: src/sudo.c:1149
+#: src/sudo.c:1161
msgid "unable to initialize policy plugin"
msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ додаток правил"
-#: src/sudo.c:1211
+#: src/sudo.c:1223
#, c-format
msgid "policy plugin %s is missing the \"check_policy\" method"
msgstr "до додатка правил %s не включено метод check_policy"
-#: src/sudo.c:1257
+#: src/sudo.c:1269
#, c-format
msgid "policy plugin %s does not support listing privileges"
msgstr "у додатку правил %s не передбачено підтримки побудови ÑпиÑку прав доÑтупу"
-#: src/sudo.c:1301
+#: src/sudo.c:1313
#, c-format
msgid "policy plugin %s does not support the -v option"
msgstr "у додатку правил %s не передбачено підтримки параметра -v"
-#: src/sudo.c:1339
+#: src/sudo.c:1351
#, c-format
msgid "policy plugin %s does not support the -k/-K options"
msgstr "у додатку правил %s не передбачено підтримки параметрів -k/-K"
-#: src/sudo.c:1468
+#: src/sudo.c:1480
#, c-format
msgid "error initializing I/O plugin %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ініціалізації додатка введеннÑ/Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… %s"
-#: src/sudo.c:1471
+#: src/sudo.c:1483
msgid "error initializing I/O plugin"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ініціалізації додатка введеннÑ/Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…"
-#: src/sudo.c:1620
+#: src/sudo.c:1632
#, c-format
msgid "error initializing audit plugin %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ініціалізації додатка аудиту %s"
-#: src/sudo.c:1699
+#: src/sudo.c:1711
#, c-format
msgid "%s: unable to log error event%s%s"
msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до журналу подію помилки%s%s"
-#: src/sudo.c:1735
+#: src/sudo.c:1747
#, c-format
msgid "%s: unable to log accept event%s%s"
msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до журналу подію прийнÑÑ‚Ñ‚Ñ%s%s"
-#: src/sudo.c:1740 src/sudo.c:1778
+#: src/sudo.c:1752 src/sudo.c:1790
msgid "audit plugin error"
msgstr "помилка у додатку аудиту"
-#: src/sudo.c:1773
+#: src/sudo.c:1785
#, c-format
msgid "%s: unable to log reject event%s%s"
msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до журналу подію відмови%s%s"
-#: src/sudo.c:1833
+#: src/sudo.c:1845
#, c-format
msgid "error initializing approval plugin %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ініціалізації додатка Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ %s"
-#: src/sudo.c:1903
+#: src/sudo.c:1915
msgid "command rejected by approver"
msgstr "у виконанні команди відмовлено заÑобом підтвердженнÑ"
-#: src/sudo.c:1913
-msgid "approval plugin error"
-msgstr "помилка у додатку підтвердженнÑ"
-
#: src/sudo_edit.c:113
msgid "no writable temporary directory found"
msgstr "не знайдено придатного до запиÑу тимчаÑового каталогу"
@@ -1065,7 +1087,7 @@ msgstr "не знайдено придатного до запиÑу тимчаÑ
msgid "%s left unmodified"
msgstr "%s залишено без змін"
-#: src/sudo_edit.c:304 src/sudo_edit.c:571
+#: src/sudo_edit.c:304 src/sudo_edit.c:569
#, c-format
msgid "%s unchanged"
msgstr "%s не змінено"
@@ -1078,37 +1100,37 @@ msgstr "sesh: Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: непарна кількіÑÑ‚
msgid "sesh: unable to create temporary files"
msgstr "sesh: не вдалоÑÑ Ñтворити тимчаÑові файли"
-#: src/sudo_edit.c:485 src/sudo_edit.c:609
+#: src/sudo_edit.c:485 src/sudo_edit.c:604
msgid "sesh: killed by a signal"
msgstr "sesh: завершено надÑиланнÑм Ñигналу"
-#: src/sudo_edit.c:487 src/sudo_edit.c:612
+#: src/sudo_edit.c:487 src/sudo_edit.c:607
#, c-format
msgid "sesh: unknown error %d"
msgstr "sesh: невідома помилка %d"
-#: src/sudo_edit.c:602
+#: src/sudo_edit.c:597
msgid "unable to copy temporary files back to their original location"
msgstr "не вдалоÑÑ Ñкопіювати тимчаÑові файли назад до початкового міÑÑ†Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ"
-#: src/sudo_edit.c:606
+#: src/sudo_edit.c:601
msgid "unable to copy some of the temporary files back to their original location"
msgstr "не вдалоÑÑ Ñкопіювати деÑкі з тимчаÑових файлів назад до початкового міÑÑ†Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ"
-#: src/sudo_edit.c:649
+#: src/sudo_edit.c:645
#, c-format
msgid "unable to change uid to root (%u)"
msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ uid на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ root (%u)"
-#: src/sudo_edit.c:670
+#: src/sudo_edit.c:666
msgid "plugin error: missing file list for sudoedit"
msgstr "помилка додатка: не виÑтачає ÑпиÑку файлів Ð´Ð»Ñ sudoedit"
-#: src/sudo_edit.c:713 src/sudo_edit.c:727
+#: src/sudo_edit.c:709 src/sudo_edit.c:723
msgid "unable to read the clock"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñ‡Ð°Ñ Ð½Ð° годиннику"
-#: src/sudo_intercept_common.c:341
+#: src/sudo_intercept_common.c:365
msgid "intercept port not set"
msgstr "порт Ð¿ÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð½Ðµ вÑтановлено"
@@ -1159,6 +1181,18 @@ msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ dup2 Ð´Ð»Ñ stdin"
msgid "unable to restore stdin"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ stdin"
+#~ msgid "insufficient space for execve arguments"
+#~ msgstr "недоÑтатньо міÑÑ†Ñ Ð´Ð»Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² execve"
+
+#~ msgid "unable to read execve %s for process %d"
+#~ msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ %s execve Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу %d"
+
+#~ msgid "requires at least one argument"
+#~ msgstr "потребує принаймні одного аргументу"
+
+#~ msgid "unable to run %s as a login shell"
+#~ msgstr "%s не можна працювати Ñк оболонка Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ"
+
#~ msgid "unable to dup intercept fd"
#~ msgstr "не вдалоÑÑ Ð·Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ перехоплений деÑкриптор файла"
diff --git a/scripts/log2cl.pl b/scripts/log2cl.pl
index 894736a65..a20cd220a 100755
--- a/scripts/log2cl.pl
+++ b/scripts/log2cl.pl
@@ -17,7 +17,7 @@
# 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.
+# The goal is to emulate "hg log --template=changelog" via perl format.
use Getopt::Std;
use Text::Wrap;
@@ -46,7 +46,7 @@ my $key_date = "";
my $log_size = 0;
my @lines;
-# Wrap like "hg log --style=changelog"
+# Wrap like "hg log --template=changelog"
$Text::Wrap::columns = 77;
while (<LOG>) {
diff --git a/scripts/mkdep.pl b/scripts/mkdep.pl
index 380439384..a6e10bcc1 100755
--- a/scripts/mkdep.pl
+++ b/scripts/mkdep.pl
@@ -2,7 +2,7 @@
#
# SPDX-License-Identifier: ISC
#
-# Copyright (c) 2011-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+# Copyright (c) 2011-2022 Todd C. Miller <Todd.Miller@sudo.ws>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
@@ -120,7 +120,7 @@ sub mkdep {
# 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_buf.lo arc4random_uniform.lo cfmakeraw.lo closefrom.lo dup3.lo explicit_bzero.lo fchmodat.lo freezero.lo fstatat.lo fnmatch.lo getaddrinfo.lo getcwd.lo getentropy.lo getgrouplist.lo getdelim.lo getopt_long.lo getusershell.lo glob.lo gmtime_r.lo inet_ntop_lo inet_pton.lo isblank.lo localtime_r.lo memrchr.lo mkdirat.lo mksiglist.lo mksigname.lo mktemp.lo nanosleep.lo openat.lo pipe2.lo pread.lo pwrite.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 timegm.lo unlinkat.lo utimens.lo:;
+ $makefile =~ s:\@LTLIBOBJS\@:arc4random.lo arc4random_buf.lo arc4random_uniform.lo cfmakeraw.lo closefrom.lo dup3.lo explicit_bzero.lo fchmodat.lo fchownat.lo freezero.lo fstatat.lo fnmatch.lo getaddrinfo.lo getcwd.lo getentropy.lo getgrouplist.lo getdelim.lo getopt_long.lo getusershell.lo glob.lo gmtime_r.lo inet_ntop_lo inet_pton.lo isblank.lo localtime_r.lo memrchr.lo mkdirat.lo mksiglist.lo mksigname.lo mktemp.lo nanosleep.lo openat.lo pipe2.lo pread.lo pwrite.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 timegm.lo unlinkat.lo utimens.lo:;
# Parse OBJS lines
my %objs;
@@ -216,17 +216,24 @@ sub mkdep {
if ($ext ne "o" || !exists($objs{"$base.lo"})) {
$imp = $implicit{"i"};
if (exists $implicit{"i"} && exists $implicit{"plog"}) {
- $imp = $implicit{"i"};
- $deps =~ s/\.l?o/.i/;
- $new_makefile .= $deps;
- $new_makefile .= "\t$imp\n";
-
- $imp = $implicit{"plog"};
- $imp =~ s/ifile=\$<; *//;
- $imp =~ s/\$\$\{ifile\%i\}c/$src/;
- $obj =~ /(.*)\.[a-z]+$/;
- $new_makefile .= "${1}.plog: ${1}.i\n";
- $new_makefile .= "\t$imp\n";
+ if ($src =~ /\.pb-c.c$/) {
+ # Do not check protobuf-c generated files
+ $obj =~ /(.*)\.[a-z]+$/;
+ $new_makefile .= "${1}.plog: ${src}\n";
+ $new_makefile .= "\ttouch \$@\n";
+ } else {
+ $imp = $implicit{"i"};
+ $deps =~ s/\.l?o/.i/;
+ $new_makefile .= $deps;
+ $new_makefile .= "\t$imp\n";
+
+ $imp = $implicit{"plog"};
+ $imp =~ s/ifile=\$<; *//;
+ $imp =~ s/\$\$\{ifile\%i\}c/$src/;
+ $obj =~ /(.*)\.[a-z]+$/;
+ $new_makefile .= "${1}.plog: ${1}.i\n";
+ $new_makefile .= "\t$imp\n";
+ }
}
}
}
diff --git a/src/Makefile.in b/src/Makefile.in
index 74eea89b4..bfa941565 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -35,6 +35,7 @@ cross_compiling = @CROSS_COMPILING@
# Compiler & tools to use
CC = @CC@
LIBTOOL = @LIBTOOL@
+GREP = @GREP@
SED = @SED@
AWK = @AWK@
@@ -140,13 +141,14 @@ SHELL = @SHELL@
PROGS = @PROGS@
-OBJS = conversation.o copy_file.o edit_open.o env_hooks.o exec.o exec_common.o \
- exec_intercept.o exec_monitor.o exec_nopty.o exec_preload.o \
- exec_ptrace.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 sudo.o sudo_edit.o \
- suspend_nopty.o tcsetpgrp_nobg.o tgetpass.o ttyname.o utmp.o @SUDO_OBJS@
+OBJS = conversation.o copy_file.o edit_open.o env_hooks.o exec.o \
+ exec_common.o exec_intercept.o exec_iolog.o exec_monitor.o \
+ exec_nopty.o exec_preload.o exec_ptrace.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 sudo.o sudo_edit.o suspend_nopty.o tcsetpgrp_nobg.o \
+ tgetpass.o ttyname.o utmp.o @SUDO_OBJS@
-IOBJS = $(OBJS:.o=.i) sesh.i
+IOBJS = $(OBJS:.o=.i) sesh.i sudo_intercept.i sudo_intercept_common.i
POBJS = $(IOBJS:.i=.plog)
@@ -330,7 +332,7 @@ check-fuzzer:
check: $(TEST_PROGS) check-fuzzer
@if test X"$(cross_compiling)" != X"yes"; then \
- if locale -a 2>&1 | grep '^C.UTF-8$$' >/dev/null 2>&1; then \
+ if locale -a 2>&1 | $(GREP) '^C.UTF-8$$' >/dev/null 2>&1; then \
LC_ALL=C.UTF-8; export LC_ALL; \
else \
LC_ALL=C; export LC_ALL; \
@@ -409,14 +411,14 @@ check_net_ifs.plog: check_net_ifs.i
check_noexec.o: $(srcdir)/regress/noexec/check_noexec.c \
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \
- $(incdir)/sudo_util.h $(srcdir)/sudo_exec.h \
- $(top_builddir)/config.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) $(HARDENING_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_plugin.h \
- $(incdir)/sudo_util.h $(srcdir)/sudo_exec.h \
- $(top_builddir)/config.h
+ $(incdir)/sudo_queue.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 $@
@@ -459,16 +461,16 @@ copy_file.o: $(srcdir)/copy_file.c $(incdir)/compat/stdbool.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)/sudo.h $(top_builddir)/config.h \
- $(top_builddir)/pathnames.h
+ $(incdir)/sudo_util.h $(srcdir)/sudo.h $(srcdir)/sudo_edit.h \
+ $(top_builddir)/config.h $(top_builddir)/pathnames.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_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_plugin.h $(incdir)/sudo_queue.h \
- $(incdir)/sudo_util.h $(srcdir)/sudo.h $(top_builddir)/config.h \
- $(top_builddir)/pathnames.h
+ $(incdir)/sudo_util.h $(srcdir)/sudo.h $(srcdir)/sudo_edit.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 $@
@@ -566,6 +568,26 @@ exec_intercept.i: $(srcdir)/exec_intercept.c $(incdir)/compat/stdbool.h \
$(CC) -E -o $@ $(CPPFLAGS) $<
exec_intercept.plog: exec_intercept.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exec_intercept.c --i-file $< --output-file $@
+exec_iolog.o: $(srcdir)/exec_iolog.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)/sudo.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) $(HARDENING_CFLAGS) $(srcdir)/exec_iolog.c
+exec_iolog.i: $(srcdir)/exec_iolog.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)/sudo.h $(srcdir)/sudo_exec.h \
+ $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+exec_iolog.plog: exec_iolog.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exec_iolog.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 \
@@ -711,11 +733,8 @@ hooks.plog: hooks.i
intercept.pb-c.lo: $(srcdir)/intercept.pb-c.c $(incdir)/intercept.pb-c.h \
$(incdir)/protobuf-c/protobuf-c.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/intercept.pb-c.c
-intercept.pb-c.i: $(srcdir)/intercept.pb-c.c $(incdir)/intercept.pb-c.h \
- $(incdir)/protobuf-c/protobuf-c.h
- $(CC) -E -o $@ $(CPPFLAGS) $<
-intercept.pb-c.plog: intercept.pb-c.i
- rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/intercept.pb-c.c --i-file $< --output-file $@
+intercept.pb-c.plog: $(srcdir)/intercept.pb-c.c
+ touch $@
intercept.pb-c.o: $(srcdir)/intercept.pb-c.c $(incdir)/intercept.pb-c.h \
$(incdir)/protobuf-c/protobuf-c.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/intercept.pb-c.c
@@ -757,15 +776,19 @@ 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_plugin.h \
- $(incdir)/sudo_queue.h $(top_builddir)/config.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)/sudo.h $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_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_plugin.h \
- $(incdir)/sudo_queue.h $(top_builddir)/config.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)/sudo.h $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.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 $@
@@ -807,11 +830,21 @@ parse_args.i: $(srcdir)/parse_args.c $(incdir)/compat/getopt.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
+preload.o: $(srcdir)/preload.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_dso.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)/sudo.h $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_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
+preload.i: $(srcdir)/preload.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_dso.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)/sudo.h $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.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 $@
@@ -851,16 +884,16 @@ selinux.i: $(srcdir)/selinux.c $(incdir)/compat/stdbool.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_event.h \
- $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+sesh.o: $(srcdir)/sesh.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)/sudo.h $(srcdir)/sudo_edit.h $(srcdir)/sudo_exec.h \
$(top_builddir)/config.h $(top_builddir)/pathnames.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_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_event.h \
- $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+sesh.i: $(srcdir)/sesh.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)/sudo.h $(srcdir)/sudo_edit.h $(srcdir)/sudo_exec.h \
$(top_builddir)/config.h $(top_builddir)/pathnames.h
diff --git a/src/apparmor.c b/src/apparmor.c
index 5f36f3064..cbfa2aa88 100644
--- a/src/apparmor.c
+++ b/src/apparmor.c
@@ -16,6 +16,11 @@
* 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 <config.h>
#ifdef HAVE_APPARMOR
@@ -39,7 +44,8 @@ apparmor_is_enabled(void)
FILE *fd;
debug_decl(apparmor_is_enabled, SUDO_DEBUG_APPARMOR);
- /* Check whether AppArmor is enabled by reading
+ /*
+ * Check whether AppArmor is enabled by reading
* /sys/module/apparmor/parameters/enabled
*
* When this file exists and its contents are equal to "Y", AppArmor
@@ -88,20 +94,21 @@ apparmor_prepare(const char *new_profile)
goto done;
}
- if (mode == NULL)
+ if (mode == NULL) {
sudo_debug_printf(SUDO_DEBUG_INFO,
- "%s: changing AppArmor profile: %s -> %s", __func__,
- old_profile, new_profile ? new_profile : "?"
- );
- else
+ "%s: changing AppArmor profile: %s -> %s", __func__,
+ old_profile, new_profile ? new_profile : "?");
+ } else {
sudo_debug_printf(SUDO_DEBUG_INFO,
- "%s: changing AppArmor profile: %s (%s) -> %s", __func__,
- old_profile, mode, new_profile ? new_profile : "?"
- );
+ "%s: changing AppArmor profile: %s (%s) -> %s", __func__,
+ old_profile, mode, new_profile ? new_profile : "?");
+ }
done:
- /* The profile string returned by aa_getcon must be free'd, while the
- * mode string must _not_ be free'd */
+ /*
+ * The profile string returned by aa_getcon must be free'd, while the
+ * mode string must _not_ be free'd.
+ */
if (old_profile != NULL)
free(old_profile);
diff --git a/src/conversation.c b/src/conversation.c
index 53943b14a..620bb5caf 100644
--- a/src/conversation.c
+++ b/src/conversation.c
@@ -91,11 +91,16 @@ sudo_conversation(int num_msgs, const struct sudo_conv_message msgs[],
const char *crnl = NULL;
bool written = false;
int ttyfd = -1;
+ bool raw_tty = false;
if (ISSET(msg->msg_type, SUDO_CONV_PREFER_TTY) &&
- !ISSET(tgetpass_flags, TGP_STDIN))
+ !ISSET(tgetpass_flags, TGP_STDIN)) {
ttyfd = open(_PATH_TTY, O_WRONLY);
- if (len != 0 && (ttyfd != -1 || isatty(fileno(fp)))) {
+ raw_tty = sudo_term_is_raw(ttyfd);
+ } else {
+ raw_tty = sudo_term_is_raw(fileno(fp));
+ }
+ if (len != 0 && raw_tty) {
/* Convert nl -> cr nl in case tty is in raw mode. */
if (msg->msg[len - 1] == '\n') {
if (len == 1 || msg->msg[len - 2] != '\r') {
@@ -177,12 +182,14 @@ sudo_conversation_printf(int msg_type, const char *fmt, ...)
case SUDO_CONV_INFO_MSG:
/* Convert nl -> cr nl in case tty is in raw mode. */
len = strlen(fmt);
- if (len < ssizeof(fmt2) && len > 0 && fmt[len - 1] == '\n') {
- if (len == 1 || fmt[len - 2] != '\r') {
- memcpy(fmt2, fmt, len - 1);
- fmt2[len - 1] = '\0';
- fmt = fmt2;
- crnl = "\r\n";
+ if (sudo_term_is_raw(fileno(ttyfp ? ttyfp : fp))) {
+ if (len < ssizeof(fmt2) && len > 0 && fmt[len - 1] == '\n') {
+ if (len == 1 || fmt[len - 2] != '\r') {
+ memcpy(fmt2, fmt, len - 1);
+ fmt2[len - 1] = '\0';
+ fmt = fmt2;
+ crnl = "\r\n";
+ }
}
}
va_start(ap, fmt);
diff --git a/src/copy_file.c b/src/copy_file.c
index e173c43cf..671333828 100644
--- a/src/copy_file.c
+++ b/src/copy_file.c
@@ -30,6 +30,7 @@
#include <errno.h>
#include "sudo.h"
+#include "sudo_edit.h"
/*
* Extend the given fd to the specified size in bytes.
diff --git a/src/edit_open.c b/src/edit_open.c
index cd0418406..091eed838 100644
--- a/src/edit_open.c
+++ b/src/edit_open.c
@@ -493,6 +493,7 @@ sudo_edit_parent_valid(char *path, int sflags, struct sudo_cred *user_cred,
struct stat sb;
bool ret = false;
char *slash;
+ char pathbuf[2];
int dfd;
debug_decl(sudo_edit_parent_valid, SUDO_DEBUG_EDIT);
@@ -500,9 +501,13 @@ sudo_edit_parent_valid(char *path, int sflags, struct sudo_cred *user_cred,
slash = strrchr(path, '/');
if (slash == NULL) {
/* cwd */
- path = ".";
+ pathbuf[0] = '.';
+ pathbuf[1] = '\0';
+ path = pathbuf;
} else if (slash == path) {
- path = "/";
+ pathbuf[0] = '/';
+ pathbuf[1] = '\0';
+ path = pathbuf;
slash = NULL;
} else {
*slash = '\0';
diff --git a/src/env_hooks.c b/src/env_hooks.c
index 5f9a61c75..eaacaa7d9 100644
--- a/src/env_hooks.c
+++ b/src/env_hooks.c
@@ -57,7 +57,9 @@ getenv_unhooked(const char *name)
return val;
}
-sudo_dso_public char *
+sudo_dso_public char *getenv(const char *name);
+
+char *
getenv(const char *name)
{
char *val = NULL;
@@ -76,11 +78,25 @@ static int
rpl_putenv(PUTENV_CONST char *string)
{
char **ep;
+ const char *equal;
size_t len;
bool found = false;
+ /* Some putenv(3) implementations check for NULL. */
+ if (string == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* The string must contain a '=' char but not start with one. */
+ equal = strchr(string, '=');
+ if (equal == NULL || equal == string) {
+ errno = EINVAL;
+ return -1;
+ }
+
/* Look for existing entry. */
- len = (strchr(string, '=') - string) + 1;
+ len = (equal - string) + 1;
for (ep = environ; *ep != NULL; ep++) {
if (strncmp(string, *ep, len) == 0) {
*ep = (char *)string;
@@ -129,7 +145,9 @@ putenv_unhooked(PUTENV_CONST char *string)
return rpl_putenv(string);
}
-sudo_dso_public int
+sudo_dso_public int putenv(PUTENV_CONST char *string);
+
+int
putenv(PUTENV_CONST char *string)
{
switch (process_hooks_putenv((char *)string)) {
@@ -201,7 +219,9 @@ setenv_unhooked(const char *var, const char *val, int overwrite)
return rpl_setenv(var, val, overwrite);
}
-sudo_dso_public int
+sudo_dso_public int setenv(const char *var, const char *val, int overwrite);
+
+int
setenv(const char *var, const char *val, int overwrite)
{
switch (process_hooks_setenv(var, val, overwrite)) {
@@ -266,10 +286,14 @@ unsetenv_unhooked(const char *var)
}
#ifdef UNSETENV_VOID
-sudo_dso_public void
+# define UNSETENV_RTYPE void
#else
-sudo_dso_public int
+# define UNSETENV_RTYPE int
#endif
+
+sudo_dso_public UNSETENV_RTYPE unsetenv(const char *var);
+
+UNSETENV_RTYPE
unsetenv(const char *var)
{
int ret;
diff --git a/src/exec.c b/src/exec.c
index d572b2a1b..f8856b426 100644
--- a/src/exec.c
+++ b/src/exec.c
@@ -229,13 +229,19 @@ exec_setup(struct command_details *details, int intercept_fd, int errfd)
if (details->cwd != NULL) {
if (details->chroot != NULL || 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) == -1) {
- sudo_warn(U_("unable to change directory to %s"), details->cwd);
- if (!details->cwd_optional)
- goto done;
- if (details->chroot != NULL)
- sudo_warnx(U_("starting from %s"), "/");
+ if (ISSET(details->flags, CD_RBAC_ENABLED)) {
+ /* For SELinux, chdir(2) in sesh after the context change. */
+ SET(details->flags, CD_RBAC_SET_CWD);
+ } else {
+ /* Note: cwd is relative to the new root, if any. */
+ if (chdir(details->cwd) == -1) {
+ sudo_warn(U_("unable to change directory to %s"),
+ details->cwd);
+ if (!ISSET(details->flags, CD_CWD_OPTIONAL))
+ goto done;
+ if (details->chroot != NULL)
+ sudo_warnx(U_("starting from %s"), "/");
+ }
}
}
}
@@ -288,7 +294,7 @@ exec_cmnd(struct command_details *details, sigset_t *mask,
#ifdef HAVE_SELINUX
if (ISSET(details->flags, CD_RBAC_ENABLED)) {
selinux_execve(details->execfd, details->command, details->argv,
- details->envp, details->flags);
+ details->envp, details->cwd, details->flags);
} else
#endif
{
@@ -354,9 +360,6 @@ sudo_terminated(struct command_status *cstat)
debug_return_bool(false);
}
-#if SUDO_API_VERSION != SUDO_API_MKVERSION(1, 19)
-# error "Update sudo_needs_pty() after changing the plugin API"
-#endif
static bool
sudo_needs_pty(struct command_details *details)
{
@@ -367,12 +370,7 @@ sudo_needs_pty(struct command_details *details)
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)
+ plugin->u.io->log_ttyout != NULL)
return true;
}
return false;
@@ -525,3 +523,34 @@ terminate_command(pid_t pid, bool use_pgrp)
debug_return;
}
+
+/*
+ * Free the dynamically-allocated contents of the exec closure.
+ */
+void
+free_exec_closure(struct exec_closure *ec)
+{
+ debug_decl(free_exec_closure, SUDO_DEBUG_EXEC);
+
+ /* Free any remaining intercept resources. */
+ intercept_cleanup();
+
+ 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->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);
+ sudo_ev_free(ec->sigwinch_event);
+
+ debug_return;
+}
diff --git a/src/exec_common.c b/src/exec_common.c
index c5fc8cb77..c5d704fe8 100644
--- a/src/exec_common.c
+++ b/src/exec_common.c
@@ -119,16 +119,16 @@ sudo_execve(int fd, const char *path, char *const argv[], char *envp[],
execve(path, argv, envp);
if (fd == -1 && errno == ENOEXEC) {
int argc;
- char **nargv;
+ const 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;
+ nargv[1] = path;
memcpy(nargv + 2, argv + 1, argc * sizeof(char *));
- execve(_PATH_SUDO_BSHELL, nargv, envp);
+ execve(_PATH_SUDO_BSHELL, (char **)nargv, envp);
free(nargv);
}
}
diff --git a/src/exec_intercept.c b/src/exec_intercept.c
index 6560d93cf..423dc0dfb 100644
--- a/src/exec_intercept.c
+++ b/src/exec_intercept.c
@@ -54,6 +54,44 @@ static void intercept_accept_cb(int fd, int what, void *v);
static void intercept_cb(int fd, int what, void *v);
/*
+ * Enable the closure->ev event with the specified events and callback,
+ * and set the connection state to new_state if it is valid.
+ * Returns true on success, else false.
+ */
+static bool
+intercept_enable_event(int fd, short events, enum intercept_state new_state,
+ sudo_ev_callback_t callback, struct intercept_closure *closure)
+{
+ int rc;
+ debug_decl(intercept_enable_event, SUDO_DEBUG_EXEC);
+
+ rc = sudo_ev_set(&closure->ev, fd, events, callback, closure);
+ if (rc == -1 || sudo_ev_add(NULL, &closure->ev, NULL, false) == -1) {
+ sudo_warn("%s", U_("unable to add event to queue"));
+ debug_return_bool(false);
+ }
+ if (new_state != INVALID_STATE)
+ closure->state = new_state;
+ debug_return_bool(true);
+}
+
+static bool
+enable_read_event(int fd, enum intercept_state new_state,
+ sudo_ev_callback_t callback, struct intercept_closure *closure)
+{
+ return intercept_enable_event(fd, SUDO_EV_READ|SUDO_EV_PERSIST,
+ new_state, callback, closure);
+}
+
+static bool
+enable_write_event(int fd, sudo_ev_callback_t callback,
+ struct intercept_closure *closure)
+{
+ return intercept_enable_event(fd, SUDO_EV_WRITE|SUDO_EV_PERSIST,
+ INVALID_STATE, callback, closure);
+}
+
+/*
* Create an intercept closure.
* Returns an opaque pointer to the closure, which is also
* passed to the event callback when not using ptrace(2).
@@ -63,7 +101,6 @@ intercept_setup(int fd, struct sudo_event_base *evbase,
struct command_details *details)
{
struct intercept_closure *closure;
- int rc;
debug_decl(intercept_setup, SUDO_DEBUG_EXEC);
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
@@ -76,6 +113,7 @@ intercept_setup(int fd, struct sudo_event_base *evbase,
}
closure->details = details;
closure->listen_sock = -1;
+ sudo_ev_set_base(&closure->ev, evbase);
if (ISSET(details->flags, CD_USE_PTRACE)) {
/*
@@ -92,15 +130,10 @@ intercept_setup(int fd, struct sudo_event_base *evbase,
* Not using ptrace(2), use LD_PRELOAD (or its equivalent). If
* we've already seen an InterceptHello, expect a policy check first.
*/
- closure->state = sudo_token_isset(intercept_token) ?
+ const int new_state = sudo_token_isset(intercept_token) ?
RECV_SECRET : RECV_HELLO_INITIAL;
-
- rc = sudo_ev_set(&closure->ev, fd, SUDO_EV_READ|SUDO_EV_PERSIST,
- intercept_cb, closure);
- if (rc == -1 || sudo_ev_add(evbase, &closure->ev, NULL, false) == -1) {
- sudo_warn("%s", U_("unable to add event to queue"));
+ if (!enable_read_event(fd, new_state, intercept_cb, closure))
goto bad;
- }
}
debug_return_ptr(closure);
@@ -185,8 +218,8 @@ intercept_cleanup(void)
static bool
prepare_listener(struct intercept_closure *closure)
{
- struct sockaddr_in sin;
- socklen_t sin_len = sizeof(sin);
+ struct sockaddr_in sin4;
+ socklen_t sin4_len = sizeof(sin4);
int sock;
debug_decl(prepare_listener, SUDO_DEBUG_EXEC);
@@ -201,15 +234,15 @@ prepare_listener(struct intercept_closure *closure)
sudo_warn("socket");
goto bad;
}
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- sin.sin_port = 0;
- if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
+ memset(&sin4, 0, sizeof(sin4));
+ sin4.sin_family = AF_INET;
+ sin4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ sin4.sin_port = 0;
+ if (bind(sock, (struct sockaddr *)&sin4, sizeof(sin4)) == -1) {
sudo_warn("bind");
goto bad;
}
- if (getsockname(sock, (struct sockaddr *)&sin, &sin_len) == -1) {
+ if (getsockname(sock, (struct sockaddr *)&sin4, &sin4_len) == -1) {
sudo_warn("getsockname");
goto bad;
}
@@ -219,7 +252,7 @@ prepare_listener(struct intercept_closure *closure)
}
closure->listen_sock = sock;
- intercept_listen_port = ntohs(sin.sin_port);
+ intercept_listen_port = ntohs(sin4.sin_port);
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
"%s: listening on port %hu", __func__, intercept_listen_port);
@@ -238,7 +271,7 @@ bad:
*/
static char **
update_command_info(char * const *old_command_info, const char *cmnd,
- const char *runcwd, char **cmnd_out)
+ const char *runcwd, char **cmnd_out, struct intercept_closure *closure)
{
char **command_info;
char * const *oci;
@@ -248,7 +281,7 @@ update_command_info(char * const *old_command_info, const char *cmnd,
/* Rebuild command_info[] with new command and add a runcwd. */
for (n = 0; old_command_info[n] != NULL; n++)
continue;
- command_info = reallocarray(NULL, n + 2, sizeof(char *));
+ command_info = reallocarray(NULL, n + 3, sizeof(char *));
if (command_info == NULL) {
goto bad;
}
@@ -257,19 +290,12 @@ update_command_info(char * const *old_command_info, const char *cmnd,
switch (*cp) {
case 'c':
if (strncmp(cp, "command=", sizeof("command=") - 1) == 0) {
- if (cmnd != NULL) {
- command_info[n] = sudo_new_key_val("command", cmnd);
- if (command_info[n] == NULL) {
- goto bad;
- }
- n++;
- continue;
- } else if (cmnd_out != NULL) {
- *cmnd_out = strdup(cp + sizeof("command=") - 1);
- if (*cmnd_out == NULL) {
- goto bad;
- }
+ if (cmnd == NULL) {
+ /* No new command specified, use old value. */
+ cmnd = cp + sizeof("command=") - 1;
}
+ /* Filled in at the end. */
+ continue;
}
break;
case 'r':
@@ -285,16 +311,38 @@ update_command_info(char * const *old_command_info, const char *cmnd,
}
n++;
}
+
+ /* Append new command. */
+ if (cmnd == NULL) {
+ closure->errstr = N_("command not set by the security policy");
+ goto bad;
+ }
+ command_info[n] = sudo_new_key_val("command", cmnd);
+ if (command_info[n] == NULL) {
+ goto oom;
+ }
+ n++;
+
/* Append actual runcwd. */
- command_info[n] = sudo_new_key_val("runcwd", runcwd);
+ command_info[n] = sudo_new_key_val("runcwd", runcwd ? runcwd : "unknown");
if (command_info[n] == NULL) {
- goto bad;
+ goto oom;
}
n++;
command_info[n] = NULL;
+ if (cmnd_out != NULL) {
+ *cmnd_out = strdup(cmnd);
+ if (*cmnd_out == NULL) {
+ goto oom;
+ }
+ }
debug_return_ptr(command_info);
+
+oom:
+ closure->errstr = N_("unable to allocate memory");
+
bad:
if (command_info != NULL) {
for (n = 0; command_info[n] != NULL; n++) {
@@ -308,7 +356,7 @@ bad:
/*
* Perform a policy check for the given command.
* While argv must be NULL-terminated, envp need not be.
- * The status of the policy check is stored in closure->state.
+ * Sets closure->state to the result of the policy check before returning.
* Return false on error, else true.
*/
bool
@@ -320,11 +368,36 @@ intercept_check_policy(const char *command, int argc, char **argv, int envc,
char **command_info_copy = NULL;
char **user_env_out = NULL;
char **run_argv = NULL;
- bool ret = false;
- int i, rc;
+ bool ret = true;
+ int i, rc, saved_dir = -1;
debug_decl(intercept_check_policy, SUDO_DEBUG_EXEC);
if (ISSET(closure->details->flags, CD_INTERCEPT)) {
+ /* Change to runcwd for the policy check if necessary. */
+ if (*command != '/') {
+ if (runcwd == NULL || (saved_dir = open(".", O_RDONLY)) == -1 ||
+ chdir(runcwd) == -1) {
+ if (runcwd == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "relative command path but no runcwd specified");
+ } else if (saved_dir == -1) {
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to open current directory for reading");
+ } else {
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to chdir for %s", runcwd);
+ }
+ if (closure->errstr == NULL)
+ closure->errstr = N_("command rejected by policy");
+ audit_reject(policy_plugin.name, SUDO_POLICY_PLUGIN,
+ closure->errstr, closure->details->info);
+ closure->state = POLICY_REJECT;
+ goto done;
+ }
+ }
+
/* We don't currently have a good way to validate the environment. */
sudo_debug_set_active_instance(policy_plugin.debug_instance);
rc = policy_plugin.u.policy->check_policy(argc, argv, NULL,
@@ -337,11 +410,9 @@ intercept_check_policy(const char *command, int argc, char **argv, int envc,
case 1:
/* Rebuild command_info[] with runcwd and extract command. */
command_info_copy = update_command_info(command_info, NULL,
- runcwd ? runcwd : "unknown", &closure->command);
- if (command_info_copy == NULL) {
- closure->errstr = N_("unable to allocate memory");
- goto done;
- }
+ runcwd, &closure->command, closure);
+ if (command_info_copy == NULL)
+ goto oom;
command_info = command_info_copy;
closure->state = POLICY_ACCEPT;
break;
@@ -351,28 +422,24 @@ intercept_check_policy(const char *command, int argc, char **argv, int envc,
audit_reject(policy_plugin.name, SUDO_POLICY_PLUGIN,
closure->errstr, command_info);
closure->state = POLICY_REJECT;
- ret = true;
goto done;
default:
- goto done;
+ /* Plugin error? */
+ goto bad;
}
} else {
/* No actual policy check, just logging child processes. */
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
"not checking policy, audit only");
closure->command = strdup(command);
- if (closure->command == NULL) {
- closure->errstr = N_("unable to allocate memory");
- goto done;
- }
+ if (closure->command == NULL)
+ goto oom;
/* Rebuild command_info[] with new command and runcwd. */
command_info = update_command_info(closure->details->info,
- command, runcwd ? runcwd : "unknown", NULL);
- if (command_info == NULL) {
- closure->errstr = N_("unable to allocate memory");
- goto done;
- }
+ command, runcwd, NULL, closure);
+ if (command_info == NULL)
+ goto oom;
closure->state = POLICY_ACCEPT;
run_argv = argv;
}
@@ -394,31 +461,23 @@ intercept_check_policy(const char *command, int argc, char **argv, int envc,
for (i = 0; run_argv[i] != NULL; i++)
continue;
closure->run_argv = reallocarray(NULL, i + 1, sizeof(char *));
- if (closure->run_argv == NULL) {
- closure->errstr = N_("unable to allocate memory");
- goto done;
- }
+ if (closure->run_argv == NULL)
+ goto oom;
for (i = 0; run_argv[i] != NULL; i++) {
closure->run_argv[i] = strdup(run_argv[i]);
- if (closure->run_argv[i] == NULL) {
- closure->errstr = N_("unable to allocate memory");
- goto done;
- }
+ if (closure->run_argv[i] == NULL)
+ goto oom;
}
closure->run_argv[i] = NULL;
/* Make a copy of envp, which may not be NULL-terminated. */
closure->run_envp = reallocarray(NULL, envc + 1, sizeof(char *));
- if (closure->run_envp == NULL) {
- closure->errstr = N_("unable to allocate memory");
- goto done;
- }
+ if (closure->run_envp == NULL)
+ goto oom;
for (i = 0; i < envc; i++) {
closure->run_envp[i] = strdup(envp[i]);
- if (closure->run_envp[i] == NULL) {
- closure->errstr = N_("unable to allocate memory");
- goto done;
- }
+ if (closure->run_envp[i] == NULL)
+ goto oom;
}
closure->run_envp[i] = NULL;
@@ -427,24 +486,40 @@ intercept_check_policy(const char *command, int argc, char **argv, int envc,
closure->run_argv, closure->run_envp);
/* Call approval plugins and audit the result. */
- if (!approval_check(command_info, closure->run_argv, closure->run_envp))
- debug_return_int(0);
+ if (!approval_check(command_info, closure->run_argv, closure->run_envp)) {
+ if (closure->errstr == NULL)
+ closure->errstr = N_("approval plugin error");
+ closure->state = POLICY_REJECT;
+ goto done;
+ }
}
/* Audit the event again for the sudo front-end. */
audit_accept("sudo", SUDO_FRONT_END, command_info, closure->run_argv,
closure->run_envp);
- ret = true;
+ goto done;
+
+oom:
+ closure->errstr = N_("unable to allocate memory");
+
+bad:
+ if (closure->errstr == NULL)
+ closure->errstr = N_("policy plugin error");
+ audit_error(policy_plugin.name, SUDO_POLICY_PLUGIN, closure->errstr,
+ command_info ? command_info : closure->details->info);
+ closure->state = POLICY_ERROR;
+ ret = false;
done:
- if (!ret) {
- if (closure->errstr == NULL)
- closure->errstr = N_("policy plugin error");
- audit_error(policy_plugin.name, SUDO_POLICY_PLUGIN, closure->errstr,
- command_info ? command_info : closure->details->info);
- closure->state = POLICY_ERROR;
+ if (saved_dir != -1) {
+ if (fchdir(saved_dir) == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to restore saved cwd", __func__);
+ }
+ close(saved_dir);
}
+
if (command_info_copy != NULL) {
for (i = 0; command_info_copy[i] != NULL; i++) {
free(command_info_copy[i]);
@@ -464,7 +539,7 @@ intercept_check_policy_req(PolicyCheckRequest *req,
size_t n;
debug_decl(intercept_check_policy_req, SUDO_DEBUG_EXEC);
- if (req->command == NULL || req->n_argv == 0 || req->n_envp == 0) {
+ if (req->command == NULL) {
closure->errstr = N_("invalid PolicyCheckRequest");
goto done;
}
@@ -478,7 +553,14 @@ intercept_check_policy_req(PolicyCheckRequest *req,
}
}
- /* Rebuild argv from PolicyCheckReq so it is NULL-terminated. */
+ /* If argv is empty, reserve an extra slot for the command. */
+ if (req->n_argv == 0)
+ req->n_argv = 1;
+
+ /*
+ * Rebuild argv from PolicyCheckReq so it is NULL-terminated.
+ * The plugin API requires us to pass the pathname to exec in argv[0].
+ */
argv = reallocarray(NULL, req->n_argv + 1, sizeof(char *));
if (argv == NULL) {
closure->errstr = N_("unable to allocate memory");
@@ -546,11 +628,9 @@ intercept_verify_token(int fd, struct intercept_closure *closure)
static bool
intercept_read(int fd, struct intercept_closure *closure)
{
- struct sudo_event_base *evbase = sudo_ev_get_base(&closure->ev);
InterceptRequest *req = NULL;
bool ret = false;
ssize_t nread;
- int rc;
debug_decl(intercept_read, SUDO_DEBUG_EXEC);
if (closure->state == RECV_SECRET) {
@@ -644,7 +724,7 @@ unpack:
sudo_debug_printf(SUDO_DEBUG_INFO,
"%s: finished receiving %u bytes from client", __func__, closure->len);
- sudo_ev_del(evbase, &closure->ev);
+ sudo_ev_del(NULL, &closure->ev);
free(closure->buf);
closure->buf = NULL;
closure->len = 0;
@@ -663,6 +743,11 @@ unpack:
ret = intercept_check_policy_req(req->u.policy_check_req, closure);
if (!ret)
goto done;
+ if (!ISSET(closure->details->flags, CD_INTERCEPT)) {
+ /* Just logging, re-use event to read next InterceptHello. */
+ ret = enable_read_event(fd, RECV_HELLO, intercept_cb, closure);
+ goto done;
+ }
break;
case INTERCEPT_REQUEST__TYPE_HELLO:
switch (closure->state) {
@@ -686,12 +771,8 @@ unpack:
}
/* Switch event to write mode for the reply. */
- rc = sudo_ev_set(&closure->ev, fd, SUDO_EV_WRITE|SUDO_EV_PERSIST,
- intercept_cb, closure);
- if (rc == -1 || sudo_ev_add(evbase, &closure->ev, NULL, false) == -1) {
- sudo_warn("%s", U_("unable to add event to queue"));
+ if (!enable_write_event(fd, intercept_cb, closure))
goto done;
- }
ret = true;
@@ -744,6 +825,7 @@ fmt_hello_response(struct intercept_closure *closure)
hello_resp.portno = intercept_listen_port;
hello_resp.token_lo = intercept_token.u64[0];
hello_resp.token_hi = intercept_token.u64[1];
+ hello_resp.log_only = !ISSET(closure->details->flags, CD_INTERCEPT);
resp.u.hello_resp = &hello_resp;
resp.type_case = INTERCEPT_RESPONSE__TYPE_HELLO_RESP;
@@ -811,10 +893,8 @@ fmt_error_message(struct intercept_closure *closure)
static bool
intercept_write(int fd, struct intercept_closure *closure)
{
- struct sudo_event_base *evbase = sudo_ev_get_base(&closure->ev);
bool ret = false;
ssize_t nwritten;
- int rc;
debug_decl(intercept_write, SUDO_DEBUG_EXEC);
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, "state %d",
@@ -864,46 +944,33 @@ intercept_write(int fd, struct intercept_closure *closure)
debug_return_bool(true);
}
- sudo_debug_printf(SUDO_DEBUG_INFO, "%s: sent %u bytes to client",
- __func__, closure->len);
- sudo_ev_del(evbase, &closure->ev);
+ sudo_debug_printf(SUDO_DEBUG_INFO,
+ "%s: sent %u bytes to client", __func__, closure->len);
+ sudo_ev_del(NULL, &closure->ev);
free(closure->buf);
closure->buf = NULL;
closure->len = 0;
closure->off = 0;
- if (ISSET(closure->details->flags, CD_USE_PTRACE)) {
- /* Ready for the next policy check from the tracer. */
- closure->state = RECV_POLICY_CHECK;
- } else {
- switch (closure->state) {
- case RECV_HELLO_INITIAL:
- /* Re-use event for the listener. */
- close(fd);
- rc = sudo_ev_set(&closure->ev, closure->listen_sock,
- SUDO_EV_READ|SUDO_EV_PERSIST, intercept_accept_cb, closure);
- if (rc == -1 || sudo_ev_add(evbase, &closure->ev, NULL, false) == -1) {
- sudo_warn("%s", U_("unable to add event to queue"));
- goto done;
- }
- closure->listen_sock = -1;
- closure->state = RECV_CONNECTION;
- accept_closure = closure;
- break;
- case POLICY_ACCEPT:
- /* Re-use event to read InterceptHello from sudo_intercept.so ctor. */
- rc = sudo_ev_set(&closure->ev, fd, SUDO_EV_READ|SUDO_EV_PERSIST,
- intercept_cb, closure);
- if (rc == -1 || sudo_ev_add(evbase, &closure->ev, NULL, false) == -1) {
- sudo_warn("%s", U_("unable to add event to queue"));
- goto done;
- }
- closure->state = RECV_HELLO;
- break;
- default:
- /* Done with this connection. */
- intercept_connection_close(closure);
- }
+ switch (closure->state) {
+ case RECV_HELLO_INITIAL:
+ /* Re-use the listener event. */
+ close(fd);
+ if (!enable_read_event(closure->listen_sock, RECV_CONNECTION,
+ intercept_accept_cb, closure))
+ goto done;
+ closure->listen_sock = -1;
+ closure->state = RECV_CONNECTION;
+ accept_closure = closure;
+ break;
+ case POLICY_ACCEPT:
+ /* Re-use event to read InterceptHello from sudo_intercept.so ctor. */
+ if (!enable_read_event(fd, RECV_HELLO, intercept_cb, closure))
+ goto done;
+ break;
+ default:
+ /* Done with this connection. */
+ intercept_connection_close(closure);
}
ret = true;
@@ -945,8 +1012,8 @@ intercept_accept_cb(int fd, int what, void *v)
{
struct intercept_closure *closure = v;
struct sudo_event_base *evbase = sudo_ev_get_base(&closure->ev);
- struct sockaddr_in sin;
- socklen_t sin_len = sizeof(sin);
+ struct sockaddr_in sin4;
+ socklen_t sin4_len = sizeof(sin4);
int client_sock, flags, on = 1;
debug_decl(intercept_accept_cb, SUDO_DEBUG_EXEC);
@@ -959,7 +1026,7 @@ intercept_accept_cb(int fd, int what, void *v)
debug_return;
}
- client_sock = accept(fd, (struct sockaddr *)&sin, &sin_len);
+ client_sock = accept(fd, (struct sockaddr *)&sin4, &sin4_len);
if (client_sock == -1) {
sudo_warn("accept");
goto bad;
diff --git a/src/exec_intercept.h b/src/exec_intercept.h
index e9d3a6ac3..baf429bb6 100644
--- a/src/exec_intercept.h
+++ b/src/exec_intercept.h
@@ -20,6 +20,7 @@
#define SUDO_EXEC_INTERCEPT_H
enum intercept_state {
+ INVALID_STATE,
RECV_HELLO_INITIAL,
RECV_HELLO,
RECV_SECRET,
diff --git a/src/exec_iolog.c b/src/exec_iolog.c
new file mode 100644
index 000000000..8575ee482
--- /dev/null
+++ b/src/exec_iolog.c
@@ -0,0 +1,613 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * 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 <config.h>
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include "sudo.h"
+#include "sudo_exec.h"
+#include "sudo_plugin.h"
+#include "sudo_plugin_int.h"
+
+sigset_t ttyblock;
+int ttymode = TERM_COOKED;
+
+struct io_buffer_list iobufs = SLIST_HEAD_INITIALIZER(&iobufs);
+
+int io_fds[6] = { -1, -1, -1, -1, -1, -1 };
+
+/*
+ * Remove and free any events associated with the specified
+ * file descriptor present in the I/O buffers list.
+ */
+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).
+ */
+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));
+}
+
+/*
+ * Allocate a new I/O buffer and associated read/write events.
+ */
+void
+io_buf_new(int rfd, int wfd,
+ bool (*action)(const char *, unsigned int, struct io_buffer *),
+ void (*read_cb)(int fd, int what, void *v),
+ void (*write_cb)(int fd, int what, void *v),
+ struct exec_closure *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|SUDO_EV_PERSIST,
+ read_cb, iob);
+ iob->wevent = sudo_ev_alloc(wfd, SUDO_EV_WRITE|SUDO_EV_PERSIST,
+ write_cb, 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;
+}
+
+/*
+ * Schedule I/O events before starting the main event loop or
+ * resuming from suspend.
+ */
+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("%s", 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("%s", 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.
+ */
+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("%s", 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("%s", 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("%s", 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;
+}
+
+/*
+ * Free the contents of the I/O buffers queue.
+ */
+void
+free_io_bufs(void)
+{
+ struct io_buffer *iob;
+ debug_decl(free_io_bufs, SUDO_DEBUG_EXEC);
+
+ 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);
+ }
+
+ debug_return;
+}
+
+/* Call I/O plugin tty input log method. */
+bool
+log_ttyin(const char *buf, unsigned int n, struct io_buffer *iob)
+{
+ struct plugin_container *plugin;
+ const char *errstr = NULL;
+ 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, &errstr);
+ if (rc <= 0) {
+ if (rc < 0) {
+ /* Error: disable plugin's I/O function. */
+ plugin->u.io->log_ttyin = NULL;
+ audit_error(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("I/O plugin error"),
+ iob->ec->details->info);
+ } else {
+ audit_reject(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("command rejected by I/O plugin"),
+ iob->ec->details->info);
+ }
+ 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. */
+bool
+log_stdin(const char *buf, unsigned int n, struct io_buffer *iob)
+{
+ struct plugin_container *plugin;
+ const char *errstr = NULL;
+ 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, &errstr);
+ if (rc <= 0) {
+ if (rc < 0) {
+ /* Error: disable plugin's I/O function. */
+ plugin->u.io->log_stdin = NULL;
+ audit_error(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("I/O plugin error"),
+ iob->ec->details->info);
+ } else {
+ audit_reject(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("command rejected by I/O plugin"),
+ iob->ec->details->info);
+ }
+ 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. */
+bool
+log_ttyout(const char *buf, unsigned int n, struct io_buffer *iob)
+{
+ struct plugin_container *plugin;
+ const char *errstr = NULL;
+ 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, &errstr);
+ if (rc <= 0) {
+ if (rc < 0) {
+ /* Error: disable plugin's I/O function. */
+ plugin->u.io->log_ttyout = NULL;
+ audit_error(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("I/O plugin error"),
+ iob->ec->details->info);
+ } else {
+ audit_reject(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("command rejected by I/O plugin"),
+ iob->ec->details->info);
+ }
+ 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. */
+bool
+log_stdout(const char *buf, unsigned int n, struct io_buffer *iob)
+{
+ struct plugin_container *plugin;
+ const char *errstr = NULL;
+ 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, &errstr);
+ if (rc <= 0) {
+ if (rc < 0) {
+ /* Error: disable plugin's I/O function. */
+ plugin->u.io->log_stdout = NULL;
+ audit_error(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("I/O plugin error"),
+ iob->ec->details->info);
+ } else {
+ audit_reject(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("command rejected by I/O plugin"),
+ iob->ec->details->info);
+ }
+ 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. */
+bool
+log_stderr(const char *buf, unsigned int n, struct io_buffer *iob)
+{
+ struct plugin_container *plugin;
+ const char *errstr = NULL;
+ 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, &errstr);
+ if (rc <= 0) {
+ if (rc < 0) {
+ /* Error: disable plugin's I/O function. */
+ plugin->u.io->log_stderr = NULL;
+ audit_error(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("I/O plugin error"),
+ iob->ec->details->info);
+ } else {
+ audit_reject(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("command rejected by I/O plugin"),
+ iob->ec->details->info);
+ }
+ 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. */
+void
+log_suspend(struct exec_closure *ec, int signo)
+{
+ struct plugin_container *plugin;
+ const char *errstr = NULL;
+ 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, &errstr);
+ if (rc <= 0) {
+ /* Error: disable plugin's I/O function. */
+ plugin->u.io->log_suspend = NULL;
+ audit_error(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("error logging suspend"),
+ ec->details->info);
+ break;
+ }
+ }
+ }
+ sudo_debug_set_active_instance(sudo_debug_instance);
+ sigprocmask(SIG_SETMASK, &omask, NULL);
+
+ debug_return;
+}
+
+/* Call I/O plugin window change log method. */
+void
+log_winchange(struct exec_closure *ec, unsigned int rows,
+ unsigned int cols)
+{
+ struct plugin_container *plugin;
+ const char *errstr = NULL;
+ 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, &errstr);
+ if (rc <= 0) {
+ /* Error: disable plugin's I/O function. */
+ plugin->u.io->change_winsize = NULL;
+ audit_error(plugin->name, SUDO_IO_PLUGIN,
+ errstr ? errstr : _("error changing window size"),
+ ec->details->info);
+ break;
+ }
+ }
+ }
+ sudo_debug_set_active_instance(sudo_debug_instance);
+ sigprocmask(SIG_SETMASK, &omask, NULL);
+
+ debug_return;
+}
+
+void
+init_ttyblock(void)
+{
+ /* So we can block tty-generated signals */
+ sigemptyset(&ttyblock);
+ sigaddset(&ttyblock, SIGINT);
+ sigaddset(&ttyblock, SIGQUIT);
+ sigaddset(&ttyblock, SIGTSTP);
+ sigaddset(&ttyblock, SIGTTIN);
+ sigaddset(&ttyblock, SIGTTOU);
+}
diff --git a/src/exec_nopty.c b/src/exec_nopty.c
index 95e1a3f7d..bd91e3ae6 100644
--- a/src/exec_nopty.c
+++ b/src/exec_nopty.c
@@ -23,8 +23,10 @@
#include <config.h>
-#include <sys/wait.h>
+#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
#if defined(HAVE_STDINT_H)
# include <stdint.h>
@@ -38,45 +40,41 @@
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
+#include <termios.h> /* for struct winsize on HP-UX */
#include "sudo.h"
#include "sudo_exec.h"
#include "sudo_plugin.h"
#include "sudo_plugin_int.h"
-#ifndef __WALL
-# define __WALL 0
-#endif
+static void handle_sigchld_nopty(struct exec_closure *ec);
-struct exec_closure_nopty {
- 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;
- struct command_status *cstat;
- void *intercept;
- pid_t cmnd_pid;
- pid_t ppgrp;
-};
-
-static void handle_sigchld_nopty(struct exec_closure_nopty *ec);
+/*
+ * Handle window size change events.
+ */
+static void
+handle_sigwinch(struct exec_closure *ec, int fd)
+{
+ struct winsize wsize;
+ debug_decl(handle_sigwinch, SUDO_DEBUG_EXEC);
+
+ if (fd != -1 && ioctl(fd, TIOCGWINSZ, &wsize) == 0) {
+ if (wsize.ws_row != ec->rows || wsize.ws_col != ec->cols) {
+ /* Log window change event. */
+ log_winchange(ec, wsize.ws_row, wsize.ws_col);
+
+ /* Update rows/cols. */
+ ec->rows = wsize.ws_row;
+ ec->cols = wsize.ws_col;
+ }
+ }
+}
/* 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;
+ struct exec_closure *ec = v;
ssize_t nread;
int errval;
debug_decl(errpipe_cb, SUDO_DEBUG_EXEC);
@@ -110,7 +108,7 @@ errpipe_cb(int fd, int what, void *v)
ec->cstat->type = CMD_ERRNO;
ec->cstat->val = errval;
}
- sudo_ev_del(ec->evbase, ec->errpipe_event);
+ sudo_ev_del(ec->evbase, ec->backchannel_event);
close(fd);
break;
}
@@ -122,7 +120,7 @@ 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;
+ struct exec_closure *ec = sc->closure;
char signame[SIG2STR_MAX];
debug_decl(signal_cb_nopty, SUDO_DEBUG_EXEC);
@@ -143,6 +141,9 @@ signal_cb_nopty(int signo, int what, void *v)
sudo_ev_loopexit(ec->evbase);
}
debug_return;
+ case SIGWINCH:
+ handle_sigwinch(ec, io_fds[SFD_USERTTY]);
+ FALLTHROUGH;
#ifdef SIGINFO
case SIGINFO:
#endif
@@ -203,26 +204,28 @@ signal_cb_nopty(int signo, int what, void *v)
* Allocates events for the signal pipe and error pipe.
*/
static void
-fill_exec_closure_nopty(struct exec_closure_nopty *ec,
+fill_exec_closure(struct exec_closure *ec,
struct command_status *cstat, struct command_details *details, int errfd)
{
- debug_decl(fill_exec_closure_nopty, SUDO_DEBUG_EXEC);
+ debug_decl(fill_exec_closure, SUDO_DEBUG_EXEC);
/* Fill in the non-event part of the closure. */
ec->ppgrp = getpgrp();
ec->cstat = cstat;
ec->details = details;
+ ec->rows = user_details.ts_rows;
+ ec->cols = user_details.ts_cols;
/* Setup event base and events. */
ec->evbase = details->evbase;
details->evbase = NULL;
/* Event for command status via errfd. */
- ec->errpipe_event = sudo_ev_alloc(errfd,
+ ec->backchannel_event = sudo_ev_alloc(errfd,
SUDO_EV_READ|SUDO_EV_PERSIST, errpipe_cb, ec);
- if (ec->errpipe_event == NULL)
+ if (ec->backchannel_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)
+ if (sudo_ev_add(ec->evbase, ec->backchannel_event, NULL, false) == -1)
sudo_fatal("%s", U_("unable to add event to queue"));
sudo_debug_printf(SUDO_DEBUG_INFO, "error pipe fd %d\n", errfd);
@@ -313,6 +316,13 @@ fill_exec_closure_nopty(struct exec_closure_nopty *ec,
sudo_fatal("%s", U_("unable to add event to queue"));
#endif
+ ec->sigwinch_event = sudo_ev_alloc(SIGWINCH,
+ SUDO_EV_SIGINFO, signal_cb_nopty, 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("%s", U_("unable to add event to queue"));
+
/* Set the default event base. */
sudo_ev_base_setdef(ec->evbase);
@@ -320,44 +330,208 @@ fill_exec_closure_nopty(struct exec_closure_nopty *ec,
}
/*
- * Free the dynamically-allocated contents of the exec closure.
+ * 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);
+ ssize_t n;
+ debug_decl(read_callback, SUDO_DEBUG_EXEC);
+
+ n = read(fd, iob->buf + iob->len, sizeof(iob->buf) - iob->len);
+ switch (n) {
+ case -1:
+ if (errno == EAGAIN || errno == EINTR) {
+ /* Not an error, retry later. */
+ 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 */
+ 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;
+ /* Disable reader if buffer is full. */
+ if (iob->len == sizeof(iob->buf))
+ sudo_ev_del(evbase, iob->revent);
+ /* Enable writer now that there is new data in the buffer. */
+ if (iob->wevent != NULL) {
+ if (sudo_ev_add(evbase, iob->wevent, NULL, false) == -1)
+ sudo_fatal("%s", U_("unable to add event to queue"));
+ }
+ break;
+ }
+
+ debug_return;
+}
+
+/*
+ * Write an iobuf that is ready.
*/
static void
-free_exec_closure_nopty(struct exec_closure_nopty *ec)
+write_callback(int fd, int what, void *v)
{
- debug_decl(free_exec_closure_nopty, SUDO_DEBUG_EXEC);
-
- /* Free any remaining intercept resources. */
- intercept_cleanup();
-
- 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);
+ struct io_buffer *iob = v;
+ struct sudo_event_base *evbase = sudo_ev_get_base(iob->wevent);
+ ssize_t n;
+ debug_decl(write_callback, SUDO_DEBUG_EXEC);
+
+ n = write(fd, iob->buf + iob->off, iob->len - iob->off);
+ if (n == -1) {
+ switch (errno) {
+ case EPIPE:
+ case EBADF:
+ /* other end of pipe closed */
+ 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:
+ case EAGAIN:
+ /* Not an error, retry later. */
+ 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;
+ /* Disable writer and reset the buffer if fully consumed. */
+ if (iob->off == iob->len) {
+ iob->off = iob->len = 0;
+ sudo_ev_del(evbase, iob->wevent);
+ /* Forward the EOF from reader to writer. */
+ if (iob->revent == NULL) {
+ safe_close(fd);
+ ev_free_by_fd(evbase, fd);
+ }
+ }
+ /* Enable reader if buffer is not full. */
+ if (iob->revent != NULL && iob->len != sizeof(iob->buf)) {
+ if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1)
+ sudo_fatal("%s", U_("unable to add event to queue"));
+ }
+ }
debug_return;
}
/*
+ * If std{in,out,err} are not connected to a terminal, interpose
+ * ourselves using a pipe. Fills in io_pipe[][].
+ */
+static void
+interpose_pipes(struct exec_closure *ec, int io_pipe[3][2])
+{
+ bool interpose[3] = { false, false, false };
+ struct plugin_container *plugin;
+ bool want_winch = false;
+ debug_decl(interpose_pipes, SUDO_DEBUG_EXEC);
+
+ /*
+ * Determine whether any of std{in,out,err} or window size changes
+ * 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;
+ if (plugin->u.io->version >= SUDO_API_MKVERSION(1, 12)) {
+ if (plugin->u.io->change_winsize)
+ want_winch = true;
+ }
+ }
+
+ /*
+ * If stdin, stdout or stderr is not a tty and logging is enabled,
+ * use a pipe to interpose ourselves.
+ */
+ if (interpose[STDIN_FILENO]) {
+ if (!isatty(STDIN_FILENO)) {
+ sudo_debug_printf(SUDO_DEBUG_INFO,
+ "stdin not a tty, creating a pipe");
+ if (pipe2(io_pipe[STDIN_FILENO], O_CLOEXEC) != 0)
+ sudo_fatal("%s", U_("unable to create pipe"));
+ io_buf_new(STDIN_FILENO, io_pipe[STDIN_FILENO][1],
+ log_stdin, read_callback, write_callback, ec, &iobufs);
+ }
+ }
+ if (interpose[STDOUT_FILENO]) {
+ if (!isatty(STDOUT_FILENO)) {
+ sudo_debug_printf(SUDO_DEBUG_INFO,
+ "stdout not a tty, creating a pipe");
+ if (pipe2(io_pipe[STDOUT_FILENO], O_CLOEXEC) != 0)
+ sudo_fatal("%s", U_("unable to create pipe"));
+ io_buf_new(io_pipe[STDOUT_FILENO][0], STDOUT_FILENO,
+ log_stdout, read_callback, write_callback, ec, &iobufs);
+ }
+ }
+ if (interpose[STDERR_FILENO]) {
+ if (!isatty(STDERR_FILENO)) {
+ sudo_debug_printf(SUDO_DEBUG_INFO,
+ "stderr not a tty, creating a pipe");
+ if (pipe2(io_pipe[STDERR_FILENO], O_CLOEXEC) != 0)
+ sudo_fatal("%s", U_("unable to create pipe"));
+ io_buf_new(io_pipe[STDERR_FILENO][0], STDERR_FILENO,
+ log_stderr, read_callback, write_callback, ec, &iobufs);
+ }
+ }
+ if (want_winch) {
+ /* Need /dev/tty for SIGWINCH handling. */
+ io_fds[SFD_USERTTY] = open(_PATH_TTY, O_RDWR);
+ }
+}
+
+/*
* 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 };
- int intercept_sv[2] = { -1, -1 };
+ int io_pipe[3][2] = { { -1, -1 }, { -1, -1 }, { -1, -1 } };
+ int errpipe[2], intercept_sv[2] = { -1, -1 };
+ struct exec_closure ec = { 0 };
sigset_t set, oset;
- int errpipe[2];
debug_decl(exec_nopty, SUDO_DEBUG_EXEC);
/*
@@ -384,6 +558,9 @@ exec_nopty(struct command_details *details, struct command_status *cstat)
}
}
+ /* Interpose std{in,out,err} with pipes if logging I/O. */
+ interpose_pipes(&ec, io_pipe);
+
/*
* Block signals until we have our handlers setup in the parent so
* we don't miss SIGCHLD if the command exits immediately.
@@ -418,6 +595,25 @@ exec_nopty(struct command_details *details, struct command_status *cstat)
close(errpipe[0]);
if (intercept_sv[0] != -1)
close(intercept_sv[0]);
+ /* Replace stdin/stdout/stderr with pipes as needed and exec. */
+ if (io_pipe[STDIN_FILENO][0] != -1) {
+ if (dup3(io_pipe[STDIN_FILENO][0], STDIN_FILENO, 0) == -1)
+ sudo_fatal("dup3");
+ close(io_pipe[STDIN_FILENO][0]);
+ close(io_pipe[STDIN_FILENO][1]);
+ }
+ if (io_pipe[STDOUT_FILENO][0] != -1) {
+ if (dup3(io_pipe[STDOUT_FILENO][1], STDOUT_FILENO, 0) == -1)
+ sudo_fatal("dup3");
+ close(io_pipe[STDOUT_FILENO][0]);
+ close(io_pipe[STDOUT_FILENO][1]);
+ }
+ if (io_pipe[STDERR_FILENO][0] != -1) {
+ if (dup3(io_pipe[STDERR_FILENO][1], STDERR_FILENO, 0) == -1)
+ sudo_fatal("dup3");
+ close(io_pipe[STDERR_FILENO][0]);
+ close(io_pipe[STDERR_FILENO][1]);
+ }
exec_cmnd(details, &oset, intercept_sv[1], errpipe[1]);
while (write(errpipe[1], &errno, sizeof(int)) == -1) {
if (errno != EINTR)
@@ -428,6 +624,13 @@ exec_nopty(struct command_details *details, struct command_status *cstat)
}
sudo_debug_printf(SUDO_DEBUG_INFO, "executed %s, pid %d", details->command,
(int)ec.cmnd_pid);
+ /* Close the other end of the pipes and socketpairs. */
+ 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(errpipe[1]);
if (intercept_sv[1] != -1)
close(intercept_sv[1]);
@@ -446,7 +649,7 @@ exec_nopty(struct command_details *details, struct command_status *cstat)
* Fill in exec closure, allocate event base, signal events and
* the error pipe event.
*/
- fill_exec_closure_nopty(&ec, cstat, details, errpipe[0]);
+ fill_exec_closure(&ec, cstat, details, errpipe[0]);
if (ISSET(details->flags, CD_INTERCEPT|CD_LOG_SUBCMDS)) {
int rc = 1;
@@ -467,6 +670,9 @@ exec_nopty(struct command_details *details, struct command_status *cstat)
terminate_command(ec.cmnd_pid, true);
}
+ /* Enable any I/O log events. */
+ add_io_events(ec.evbase);
+
/* Restore signal mask now that signal handlers are setup. */
sigprocmask(SIG_SETMASK, &oset, NULL);
@@ -491,8 +697,13 @@ exec_nopty(struct command_details *details, struct command_status *cstat)
}
#endif
+ /* Flush any remaining output. */
+ del_io_events(true);
+
/* Free things up. */
- free_exec_closure_nopty(&ec);
+ free_io_bufs();
+ free_exec_closure(&ec);
+
debug_return;
}
@@ -503,7 +714,7 @@ exec_nopty(struct command_details *details, struct command_status *cstat)
* the tty pgrp when sudo resumes.
*/
static void
-handle_sigchld_nopty(struct exec_closure_nopty *ec)
+handle_sigchld_nopty(struct exec_closure *ec)
{
pid_t pid;
int status;
@@ -543,7 +754,7 @@ handle_sigchld_nopty(struct exec_closure_nopty *ec)
/* If the main command is suspended, suspend sudo too. */
if (pid == ec->cmnd_pid)
- suspend_sudo_nopty(signo, ec->ppgrp, ec->cmnd_pid);
+ suspend_sudo_nopty(ec, signo, ec->ppgrp, ec->cmnd_pid);
} else {
if (WIFSIGNALED(status)) {
if (sig2str(WTERMSIG(status), signame) == -1) {
diff --git a/src/exec_preload.c b/src/exec_preload.c
index 3bc7a15d3..d90fc6322 100644
--- a/src/exec_preload.c
+++ b/src/exec_preload.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -24,6 +24,7 @@
#include <config.h>
#include <fcntl.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -31,19 +32,153 @@
#include "sudo.h"
#include "sudo_exec.h"
+#include "sudo_util.h"
#ifdef RTLD_PRELOAD_VAR
+typedef void * (*sudo_alloc_fn_t)(size_t, size_t);
+typedef void (*sudo_free_fn_t)(void *);
+
+static void *
+sudo_allocarray(size_t nmemb, size_t size)
+{
+ return reallocarray(NULL, nmemb, size);
+}
+
+/*
+ * Allocate space for the string described by fmt and return it,
+ * or NULL on error.
+ * Currently only supports %%, %c, %d, and %s escapes.
+ */
+static char *
+fmtstr(sudo_alloc_fn_t alloc_fn, sudo_free_fn_t free_fn, const char *ofmt, ...)
+{
+ char *cp, *cur, *newstr = NULL;
+ size_t len, size = 1;
+ const char *fmt;
+ va_list ap;
+ debug_decl(fmtstr, SUDO_DEBUG_UTIL);
+
+ /* Determine size. */
+ va_start(ap, ofmt);
+ for (fmt = ofmt; *fmt != '\0'; ) {
+ if (fmt[0] == '%') {
+ switch (fmt[1]) {
+ case '%':
+ case 'c':
+ size++;
+ fmt += 2;
+ continue;
+ case 's':
+ cp = va_arg(ap, char *);
+ size += strlen(cp ? cp : "(NULL)");
+ fmt += 2;
+ continue;
+ case 'd': {
+ char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2];
+ len = snprintf(numbuf, sizeof(numbuf), "%d", va_arg(ap, int));
+ if (len >= sizeof(numbuf)) {
+ goto oflow;
+ }
+ size += len;
+ fmt += 2;
+ continue;
+ }
+ default:
+ /* Treat as literal. */
+ break;
+ }
+ }
+ size++;
+ fmt++;
+ }
+ va_end(ap);
+
+ newstr = alloc_fn(1, size);
+ if (newstr == NULL)
+ debug_return_str(NULL);
+
+ /* Format/copy data. */
+ cur = newstr;
+ va_start(ap, ofmt);
+ for (fmt = ofmt; *fmt != '\0'; ) {
+ if (fmt[0] == '%') {
+ switch (fmt[1]) {
+ case '%':
+ if (size < 2) {
+ goto oflow;
+ }
+ *cur++ = '%';
+ size--;
+ fmt += 2;
+ continue;
+ case 'c':
+ if (size < 2) {
+ goto oflow;
+ }
+ *cur++ = va_arg(ap, int);
+ size--;
+ fmt += 2;
+ continue;
+ case 's':
+ cp = va_arg(ap, char *);
+ len = strlcpy(cur, cp ? cp : "(NULL)", size);
+ if (len >= size) {
+ goto oflow;
+ }
+ cur += len;
+ size -= len;
+ fmt += 2;
+ continue;
+ case 'd':
+ len = snprintf(cur, size, "%d", va_arg(ap, int));
+ if (len >= size) {
+ goto oflow;
+ }
+ cur += len;
+ size -= len;
+ fmt += 2;
+ continue;
+ default:
+ /* Treat as literal. */
+ break;
+ }
+ }
+ if (size < 2) {
+ goto oflow;
+ }
+ *cur++ = *fmt++;
+ size++;
+ }
+
+ if (size < 1) {
+ goto oflow;
+ }
+ *cur = '\0';
+ va_end(ap);
+
+ debug_return_str(newstr);
+
+oflow:
+ /* We pre-allocate enough space, so this should never happen. */
+ va_end(ap);
+ free_fn(newstr);
+ sudo_warnx(U_("internal error, %s overflow"), __func__);
+ debug_return_str(NULL);
+}
+
/*
* Add a DSO file to LD_PRELOAD or the system equivalent.
*/
-char **
-sudo_preload_dso(char *envp[], const char *dso_file, int intercept_fd)
+static char **
+sudo_preload_dso_alloc(char *const envp[], const char *dso_file,
+ int intercept_fd, sudo_alloc_fn_t alloc_fn, sudo_free_fn_t free_fn)
{
char *preload = NULL;
- char **nenvp = NULL;
- int env_len, len;
- int preload_idx = -1;
- int intercept_idx = -1;
+ char **nep, **nenvp = NULL;
+ char *const *ep;
+ char **preload_ptr = NULL;
+ char **intercept_ptr = NULL;
+ char *const empty[1] = { NULL };
bool fd_present = false;
bool dso_present = false;
# ifdef RTLD_PRELOAD_ENABLE_VAR
@@ -54,16 +189,18 @@ sudo_preload_dso(char *envp[], const char *dso_file, int intercept_fd)
# ifdef _PATH_ASAN_LIB
char *dso_buf = NULL;
# endif
- debug_decl(sudo_preload_dso, SUDO_DEBUG_UTIL);
+ size_t env_size;
+ debug_decl(sudo_preload_dso_alloc, SUDO_DEBUG_UTIL);
# ifdef _PATH_ASAN_LIB
/*
* The address sanitizer DSO needs to be first in the list.
*/
- len = asprintf(&dso_buf, "%s%c%s", _PATH_ASAN_LIB, RTLD_PRELOAD_DELIM,
- dso_file);
- if (len == -1)
- goto oom;
+ dso_buf = fmtstr(alloc_fn, free_fn, "%s%c%s", _PATH_ASAN_LIB,
+ RTLD_PRELOAD_DELIM, dso_file);
+ if (dso_buf == NULL) {
+ goto oom;
+ }
dso_file = dso_buf;
# endif
@@ -73,140 +210,156 @@ sudo_preload_dso(char *envp[], const char *dso_file, int intercept_fd)
* 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 (strncmp(envp[env_len], RTLD_PRELOAD_VAR "=", sizeof(RTLD_PRELOAD_VAR)) == 0) {
- if (preload_idx == -1) {
- const char *cp = envp[env_len] + sizeof(RTLD_PRELOAD_VAR);
- const size_t dso_len = strlen(dso_file);
-
- /*
- * Check to see if dso_file is already first in the list.
- * We don't bother checking for it later in the list.
- */
- if (strncmp(cp, dso_file, dso_len) == 0) {
- if (cp[dso_len] == '\0' || cp[dso_len] == RTLD_PRELOAD_DELIM)
- dso_present = true;
- }
+ /* Treat a NULL envp as empty, thanks Linux. */
+ if (envp == NULL)
+ envp = empty;
- /* Save index of existing LD_PRELOAD variable. */
- preload_idx = env_len;
- } else {
- /* Remove duplicate LD_PRELOAD. */
- int i;
- for (i = env_len; envp[i] != NULL; i++) {
- envp[i] = envp[i + 1];
- }
+ /* Determine max size for new envp. */
+ for (env_size = 0; envp[env_size] != NULL; env_size++)
+ continue;
+ if (!dso_enabled)
+ env_size++;
+ if (intercept_fd != -1)
+ env_size++;
+ env_size += 2; /* dso_file + terminating NULL */
+
+ /* Allocate new envp. */
+ nenvp = alloc_fn(env_size, sizeof(*nenvp));
+ if (nenvp == NULL)
+ goto oom;
+
+ /*
+ * Shallow copy envp, with special handling for RTLD_PRELOAD_VAR,
+ * RTLD_PRELOAD_ENABLE_VAR and SUDO_INTERCEPT_FD.
+ */
+ for (ep = envp, nep = nenvp; *ep != NULL; ep++) {
+ if (strncmp(*ep, RTLD_PRELOAD_VAR "=", sizeof(RTLD_PRELOAD_VAR)) == 0) {
+ const char *cp = *ep + sizeof(RTLD_PRELOAD_VAR);
+ const size_t dso_len = strlen(dso_file);
+
+ /* Skip duplicates. */
+ if (preload_ptr != NULL)
+ continue;
+
+ /*
+ * Check to see if dso_file is already first in the list.
+ * We don't bother checking for it later in the list.
+ */
+ if (strncmp(cp, dso_file, dso_len) == 0) {
+ if (cp[dso_len] == '\0' || cp[dso_len] == RTLD_PRELOAD_DELIM)
+ dso_present = true;
}
- continue;
+
+ /* Save pointer to LD_PRELOAD variable. */
+ preload_ptr = nep;
+
+ goto copy;
}
- if (intercept_fd != -1 && strncmp(envp[env_len], "SUDO_INTERCEPT_FD=",
+ if (intercept_fd != -1 && strncmp(*ep, "SUDO_INTERCEPT_FD=",
sizeof("SUDO_INTERCEPT_FD=") - 1) == 0) {
- if (intercept_idx == -1) {
- const char *cp = envp[env_len] + sizeof("SUDO_INTERCEPT_FD=") - 1;
- const char *errstr;
- int fd;
-
- fd = sudo_strtonum(cp, 0, INT_MAX, &errstr);
- if (fd == intercept_fd && errstr == NULL)
- fd_present = true;
-
- /* Save index of existing SUDO_INTERCEPT_FD variable. */
- intercept_idx = env_len;
- } else {
- /* Remove duplicate SUDO_INTERCEPT_FD. */
- int i;
- for (i = env_len; envp[i] != NULL; i++) {
- envp[i] = envp[i + 1];
- }
- }
- continue;
+ const char *cp = *ep + sizeof("SUDO_INTERCEPT_FD=") - 1;
+ const char *errstr;
+ int fd;
+
+ /* Skip duplicates. */
+ if (intercept_ptr != NULL)
+ continue;
+
+ fd = sudo_strtonum(cp, 0, INT_MAX, &errstr);
+ if (fd == intercept_fd && errstr == NULL)
+ fd_present = true;
+
+ /* Save pointer to SUDO_INTERCEPT_FD variable. */
+ intercept_ptr = nep;
+
+ goto copy;
}
# ifdef RTLD_PRELOAD_ENABLE_VAR
- if (strncmp(envp[env_len], RTLD_PRELOAD_ENABLE_VAR "=", sizeof(RTLD_PRELOAD_ENABLE_VAR)) == 0) {
+ if (strncmp(*ep, RTLD_PRELOAD_ENABLE_VAR "=",
+ sizeof(RTLD_PRELOAD_ENABLE_VAR)) == 0) {
dso_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 || !dso_enabled || intercept_idx == -1) {
- const int env_size = env_len + 1 + (preload_idx == -1) + dso_enabled + (intercept_idx == -1); // -V547
-
- nenvp = reallocarray(NULL, env_size, sizeof(*nenvp));
- if (nenvp == NULL) {
- sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
- debug_return_ptr(NULL);
- }
- memcpy(nenvp, envp, env_len * sizeof(*envp));
- nenvp[env_len] = NULL;
- envp = nenvp;
+copy:
+ *nep++ = *ep; /* shallow copy */
}
/* Prepend our LD_PRELOAD to existing value or add new entry at the end. */
if (!dso_present) {
- if (preload_idx == -1) {
+ if (preload_ptr == NULL) {
# ifdef RTLD_PRELOAD_DEFAULT
- len = asprintf(&preload, "%s=%s%c%s", RTLD_PRELOAD_VAR, dso_file,
- RTLD_PRELOAD_DELIM, RTLD_PRELOAD_DEFAULT);
- if (len == -1) {
+ preload = fmtstr(alloc_fn, free_fn, "%s=%s%c%s", RTLD_PRELOAD_VAR,
+ dso_file, RTLD_PRELOAD_DELIM, RTLD_PRELOAD_DEFAULT);
+ if (preload == NULL) {
goto oom;
}
# else
- preload = sudo_new_key_val(RTLD_PRELOAD_VAR, dso_file);
+ preload = fmtstr(alloc_fn, free_fn, "%s=%s", RTLD_PRELOAD_VAR,
+ dso_file);
if (preload == NULL) {
goto oom;
}
# endif
- envp[env_len++] = preload;
- envp[env_len] = NULL;
+ *nep++ = preload;
} else {
- const char *old_val = envp[preload_idx] + sizeof(RTLD_PRELOAD_VAR);
- len = asprintf(&preload, "%s=%s%c%s", RTLD_PRELOAD_VAR,
+ const char *old_val = *preload_ptr + sizeof(RTLD_PRELOAD_VAR);
+ preload = fmtstr(alloc_fn, free_fn, "%s=%s%c%s", RTLD_PRELOAD_VAR,
dso_file, RTLD_PRELOAD_DELIM, old_val);
- if (len == -1) {
+ if (preload == NULL) {
goto oom;
}
- envp[preload_idx] = preload;
+ *preload_ptr = preload;
}
}
# ifdef RTLD_PRELOAD_ENABLE_VAR
if (!dso_enabled) {
- envp[env_len++] = RTLD_PRELOAD_ENABLE_VAR "=";
- envp[env_len] = NULL;
+ *nenvp++ = RTLD_PRELOAD_ENABLE_VAR "=";
}
# endif
if (!fd_present && intercept_fd != -1) {
- char *fdstr;
-
- len = asprintf(&fdstr, "SUDO_INTERCEPT_FD=%d", intercept_fd);
- if (len == -1) {
+ char *fdstr = fmtstr(alloc_fn, free_fn, "SUDO_INTERCEPT_FD=%d",
+ intercept_fd);
+ if (fdstr == NULL) {
goto oom;
}
- if (intercept_idx != -1) {
- envp[intercept_idx] = fdstr;
+ if (intercept_ptr != NULL) {
+ *intercept_ptr = fdstr;
} else {
- envp[env_len++] = fdstr;
- envp[env_len] = NULL;
+ *nep++ = fdstr;
}
}
+
+ /* NULL terminate nenvp at last. */
+ *nep = NULL;
+
# ifdef _PATH_ASAN_LIB
- free(dso_buf);
+ free_fn(dso_buf);
# endif
- debug_return_ptr(envp);
+ debug_return_ptr(nenvp);
oom:
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
# ifdef _PATH_ASAN_LIB
- free(dso_buf);
+ free_fn(dso_buf);
# endif
- free(preload);
- free(nenvp);
+ free_fn(preload);
+ free_fn(nenvp);
debug_return_ptr(NULL);
}
+
+char **
+sudo_preload_dso_mmap(char *const envp[], const char *dso_file,
+ int intercept_fd)
+{
+ return sudo_preload_dso_alloc(envp, dso_file, intercept_fd,
+ sudo_mmap_allocarray_v1, sudo_mmap_free_v1);
+}
+
+char **
+sudo_preload_dso(char *const envp[], const char *dso_file,
+ int intercept_fd)
+{
+ return sudo_preload_dso_alloc(envp, dso_file, intercept_fd,
+ sudo_allocarray, free);
+}
#endif /* RTLD_PRELOAD_VAR */
diff --git a/src/exec_ptrace.c b/src/exec_ptrace.c
index dc00dd8af..81cd10bc2 100644
--- a/src/exec_ptrace.c
+++ b/src/exec_ptrace.c
@@ -26,14 +26,21 @@
#include <sys/uio.h>
#include <sys/wait.h>
+#include <ctype.h>
#include <errno.h>
+#include <fcntl.h>
#include <limits.h>
#include <signal.h>
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
#include <stddef.h>
-#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#if defined(HAVE_ENDIAN_H)
# include <endian.h>
#elif defined(HAVE_SYS_ENDIAN_H)
@@ -59,6 +66,10 @@
# endif
static int seccomp_trap_supported = -1;
+#ifdef HAVE_PROCESS_VM_READV
+static size_t page_size;
+#endif
+static size_t arg_max;
/* Register getters and setters. */
# ifdef SECCOMP_AUDIT_ARCH_COMPAT
@@ -269,7 +280,7 @@ set_sc_arg4(struct sudo_ptrace_regs *regs, unsigned long addr)
* Returns true on success, else false.
*/
static bool
-ptrace_getregs(int pid, struct sudo_ptrace_regs *regs, bool compat)
+ptrace_getregs(int pid, struct sudo_ptrace_regs *regs, int compat)
{
debug_decl(ptrace_getregs, SUDO_DEBUG_EXEC);
@@ -284,6 +295,19 @@ ptrace_getregs(int pid, struct sudo_ptrace_regs *regs, bool compat)
if (ptrace(PTRACE_GETREGSET, pid, (void *)NT_PRSTATUS, &iov) == -1)
debug_return_bool(false);
# endif /* __mips__ */
+ if (compat == -1) {
+# ifdef SECCOMP_AUDIT_ARCH_COMPAT
+ if (sizeof(regs->u.native) != sizeof(regs->u.compat)) {
+ /* Guess compat based on size of register struct returned. */
+ compat = iov.iov_len != sizeof(regs->u.native);
+ } else {
+ /* Assume a 64-bit executable will have a 64-bit stack pointer. */
+ compat = reg_sp(regs->u.native) < 0xffffffff;
+ }
+# else
+ compat = false;
+# endif /* SECCOMP_AUDIT_ARCH_COMPAT */
+ }
/* Machine-dependent parameters to support compat binaries. */
if (compat) {
@@ -291,7 +315,7 @@ ptrace_getregs(int pid, struct sudo_ptrace_regs *regs, bool compat)
regs->wordsize = sizeof(int);
} else {
regs->compat = false;
- regs->wordsize = sizeof(unsigned long);
+ regs->wordsize = sizeof(long);
}
debug_return_bool(true);
@@ -321,19 +345,86 @@ ptrace_setregs(int pid, struct sudo_ptrace_regs *regs)
debug_return_bool(true);
}
+#ifdef HAVE_PROCESS_VM_READV
+/*
+ * Read the string at addr and store in buf using process_vm_readv(2).
+ * Returns the number of bytes stored, including the NUL.
+ */
+static size_t
+ptrace_readv_string(pid_t pid, unsigned long addr, char *buf, size_t bufsize)
+{
+ const char *cp, *buf0 = buf;
+ struct iovec local, remote;
+ ssize_t nread;
+ debug_decl(ptrace_read_string, SUDO_DEBUG_EXEC);
+
+ /*
+ * Read the string via process_vm_readv(2) one page at a time.
+ * We could do larger reads but since we don't know the length
+ * of the string, going one page at a time is simplest.
+ */
+ for (;;) {
+ if (bufsize == 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR,
+ "%s: %d: out of space reading string", __func__, (int)pid);
+ errno = ENOSPC;
+ debug_return_ssize_t(-1);
+ }
+
+ local.iov_base = buf;
+ local.iov_len = bufsize;
+ remote.iov_base = (void *)addr;
+ remote.iov_len = MIN(bufsize, page_size);
+
+ nread = process_vm_readv(pid, &local, 1, &remote, 1, 0);
+ switch (nread) {
+ case -1:
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "process_vm_readv(%d, [0x%lx, %zu], 1, [0x%lx, %zu], 1, 0)",
+ (int)pid, (unsigned long)local.iov_base, local.iov_len,
+ (unsigned long)remote.iov_base, remote.iov_len);
+ debug_return_ssize_t(-1);
+ case 0:
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "process_vm_readv(%d, [0x%lx, %zu], 1, [0x%lx, %zu], 1, 0): %s",
+ (int)pid, (unsigned long)local.iov_base, local.iov_len,
+ (unsigned long)remote.iov_base, remote.iov_len, "premature EOF");
+ debug_return_ssize_t(-1);
+ default:
+ /* Check for NUL terminator in page. */
+ cp = memchr(buf, '\0', nread);
+ if (cp != NULL)
+ debug_return_size_t((cp - buf0) + 1); /* includes NUL */
+ buf += nread;
+ bufsize -= nread;
+ addr += sizeof(unsigned long);
+ break;
+ }
+ }
+ debug_return_ssize_t(-1);
+}
+#endif /* HAVE_PROCESS_VM_READV */
+
/*
- * Read the string at addr and store in buf.
+ * Read the string at addr and store in buf using ptrace(2).
* Returns the number of bytes stored, including the NUL.
*/
static size_t
ptrace_read_string(pid_t pid, unsigned long addr, char *buf, size_t bufsize)
{
- const char *buf0 = buf;
- const char *cp;
+ const char *cp, *buf0 = buf;
unsigned long word;
- unsigned int i;
+ size_t i;
debug_decl(ptrace_read_string, SUDO_DEBUG_EXEC);
+#ifdef HAVE_PROCESS_VM_READV
+ i = ptrace_readv_string(pid, addr, buf, bufsize);
+ if (i != (size_t)-1 || errno != ENOSYS)
+ debug_return_size_t(i);
+#endif /* HAVE_PROCESS_VM_READV */
+
/*
* Read the string via ptrace(2) one (native) word at a time.
* We use the native word size even in compat mode because that
@@ -342,8 +433,9 @@ ptrace_read_string(pid_t pid, unsigned long addr, char *buf, size_t bufsize)
for (;;) {
word = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
if (word == (unsigned long)-1) {
- sudo_warn("%s: ptrace(PTRACE_PEEKDATA, %d, 0x%lx, NULL)",
- __func__, (int)pid, addr);
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "ptrace(PTRACE_PEEKDATA, %d, 0x%lx, NULL)", (int)pid, addr);
debug_return_ssize_t(-1);
}
@@ -352,7 +444,8 @@ ptrace_read_string(pid_t pid, unsigned long addr, char *buf, size_t bufsize)
if (bufsize == 0) {
sudo_debug_printf(SUDO_DEBUG_ERROR,
"%s: %d: out of space reading string", __func__, (int)pid);
- debug_return_size_t(-1);
+ errno = ENOSPC;
+ debug_return_ssize_t(-1);
}
*buf = cp[i];
if (*buf++ == '\0')
@@ -364,25 +457,124 @@ ptrace_read_string(pid_t pid, unsigned long addr, char *buf, size_t bufsize)
}
/*
- * Read the string vector at addr and store in vec, which must have
- * sufficient space. Strings are stored in buf.
+ * Expand buf by doubling its size.
+ * Updates bufp and bufsizep and recalculates curp and remp if non-NULL.
+ * Returns true on success, else false.
+ */
+static bool
+growbuf(char **bufp, size_t *bufsizep, char **curp, size_t *remp)
+{
+ const size_t oldsize = *bufsizep;
+ char *newbuf;
+ debug_decl(growbuf, SUDO_DEBUG_EXEC);
+
+ /* Double the size of the buffer. */
+ newbuf = reallocarray(*bufp, 2, oldsize);
+ if (newbuf == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ debug_return_bool(false);
+ }
+ if (curp != NULL)
+ *curp = newbuf + (*curp - *bufp);
+ if (remp != NULL)
+ *remp += oldsize;
+ *bufp = newbuf;
+ *bufsizep = 2 * oldsize;
+ debug_return_bool(true);
+}
+
+/*
+ * Build a NULL-terminated string vector from a string table.
+ * On success, returns number of bytes used for the vector and sets
+ * vecp to the start of the vector and countp to the number of elements
+ * (not including the NULL). The buffer is resized as needed.
+ * Both vecp and its elements are stored as offsets into buf, not pointers.
+ * However, NULL is still stored as NULL.
+ * Returns (size_t)-1 on failure.
+ */
+static size_t
+strtab_to_vec(char *strtab, size_t strtab_len, int *countp, char ***vecp,
+ char **bufp, size_t *bufsizep, size_t remainder)
+{
+ char *strend = strtab + strtab_len;
+ char **vec, **vp;
+ int count = 0;
+ debug_decl(strtab_to_vec, SUDO_DEBUG_EXEC);
+
+ /* Store vector in buf after string table and make it aligned. */
+ while (remainder < 2 * sizeof(char *)) {
+ if (!growbuf(bufp, bufsizep, &strtab, &remainder))
+ debug_return_ssize_t(-1);
+ strend = strtab + strtab_len;
+ }
+ vec = (char **)LONGALIGN(strend);
+ remainder -= (char *)vec - strend;
+
+ /* Fill in vector with the strings we read. */
+ for (vp = vec; strtab < strend; ) {
+ while (remainder < 2 * sizeof(char *)) {
+ if (!growbuf(bufp, bufsizep, &strtab, &remainder))
+ debug_return_ssize_t(-1);
+ strend = strtab + strtab_len;
+ vec = (char **)LONGALIGN(strend);
+ vp = vec + count;
+ }
+ /* Store offset into buf (not a pointer) in case of realloc(). */
+ *vp++ = (char *)(strtab - *bufp);
+ remainder -= sizeof(char *);
+ strtab = memchr(strtab, '\0', strend - strtab);
+ if (strtab == NULL)
+ break;
+ strtab++;
+ count++;
+ }
+ *vp++ = NULL; /* we always leave room for NULL */
+
+ *countp = count;
+ *vecp = (char **)((char *)vec - *bufp);
+
+ debug_return_size_t((char *)vp - strend);
+}
+
+/*
+ * Read the string vector at addr and store it in bufp, which
+ * is reallocated as needed. The actual vector is returned in vecp.
+ * The count stored in countp does not include the terminating NULL pointer.
+ * The vecp and its contents are _offsets_, not pointers, in case the buffer
+ * gets reallocated later. The caller is responsible for converting the
+ * offsets into pointers based on the buffer before using.
* Returns the number of bytes in buf consumed (including NULs).
*/
static size_t
ptrace_read_vec(pid_t pid, struct sudo_ptrace_regs *regs, unsigned long addr,
- char **vec, char *buf, size_t bufsize)
+ int *countp, char ***vecp, char **bufp, size_t *bufsizep, size_t off)
{
# ifdef SECCOMP_AUDIT_ARCH_COMPAT
unsigned long next_word = -1;
# endif
+ size_t remainder = *bufsizep - off;
+ char *strtab = *bufp + off;
unsigned long word;
- char *buf0 = buf;
- int len = 0;
- size_t slen;
+ size_t len, strtab_len;
debug_decl(ptrace_read_vec, SUDO_DEBUG_EXEC);
- /* Fill in vector. */
- for (;;) {
+ /* Treat a NULL vector as empty, thanks Linux. */
+ if (addr == 0) {
+ char **vp;
+
+ while (remainder < 2 * sizeof(char *)) {
+ if (!growbuf(bufp, bufsizep, &strtab, &remainder))
+ debug_return_ssize_t(-1);
+ }
+ vp = (char **)LONGALIGN(strtab);
+ *vecp = (char **)((char *)vp - *bufp);
+ *countp = 0;
+ *vp++ = NULL;
+ debug_return_size_t((char *)vp - strtab);
+ }
+
+ /* Fill in string table. */
+ do {
# ifdef SECCOMP_AUDIT_ARCH_COMPAT
if (next_word == (unsigned long)-1) {
word = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
@@ -408,88 +600,115 @@ ptrace_read_vec(pid_t pid, struct sudo_ptrace_regs *regs, unsigned long addr,
case -1:
sudo_warn("%s: ptrace(PTRACE_PEEKDATA, %d, 0x%lx, NULL)",
__func__, (int)pid, addr);
- debug_return_size_t(-1);
+ debug_return_ssize_t(-1);
case 0:
- vec[len] = NULL;
- debug_return_size_t(buf - buf0);
+ /* NULL terminator */
+ break;
default:
- slen = ptrace_read_string(pid, word, buf, bufsize);
- if (slen == (size_t)-1)
- debug_return_size_t(-1);
- vec[len++] = buf;
- buf += slen + 1;
- bufsize -= slen + 1;
+ for (;;) {
+ len = ptrace_read_string(pid, word, strtab, remainder);
+ if (len != (size_t)-1)
+ break;
+ if (errno != ENOSPC)
+ debug_return_ssize_t(-1);
+ if (!growbuf(bufp, bufsizep, &strtab, &remainder))
+ debug_return_ssize_t(-1);
+ }
+ strtab += len;
+ remainder -= len;
addr += regs->wordsize;
continue;
}
- }
+ } while (word != 0);
+
+ /* Store strings in a vector after the string table. */
+ strtab_len = strtab - (*bufp + off);
+ strtab = *bufp + off;
+ len = strtab_to_vec(strtab, strtab_len, countp, vecp, bufp, bufsizep,
+ remainder);
+ if (len == (size_t)-1)
+ debug_return_ssize_t(-1);
+
+ debug_return_size_t(strtab_len + len);
}
+#ifdef HAVE_PROCESS_VM_READV
/*
- * Return the length of the string vector at addr or -1 on error.
+ * Write the NUL-terminated string str to addr in the tracee using
+ * process_vm_writev(2).
+ * Returns the number of bytes written, including trailing NUL.
*/
-static int
-ptrace_get_vec_len(pid_t pid, struct sudo_ptrace_regs *regs, unsigned long addr)
+static size_t
+ptrace_writev_string(pid_t pid, unsigned long addr, const char *str0)
{
-# ifdef SECCOMP_AUDIT_ARCH_COMPAT
- unsigned long next_word = -1;
-# endif
- unsigned long word;
- int len = 0;
- debug_decl(ptrace_get_vec_len, SUDO_DEBUG_EXEC);
+ const char *str = str0;
+ size_t len = strlen(str) + 1;
+ debug_decl(ptrace_writev_string, SUDO_DEBUG_EXEC);
+ /*
+ * Write the string via process_vm_writev(2), handling partial writes.
+ */
for (;;) {
-# ifdef SECCOMP_AUDIT_ARCH_COMPAT
- if (next_word == (unsigned long)-1) {
- word = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
- if (regs->compat) {
- /* Stash the next compat word in next_word. */
-# if BYTE_ORDER == BIG_ENDIAN
- next_word = word & 0xffffffffU;
- word >>= 32;
-# else
- next_word = word >> 32;
- word &= 0xffffffffU;
-# endif
- }
- } else {
- /* Use the stashed value of the next word. */
- word = next_word;
- next_word = (unsigned long)-1;
- }
-# else /* SECCOMP_AUDIT_ARCH_COMPAT */
- word = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
-# endif /* SECCOMP_AUDIT_ARCH_COMPAT */
- switch (word) {
+ struct iovec local, remote;
+ ssize_t nwritten;
+
+ local.iov_base = (void *)str;
+ local.iov_len = len;
+ remote.iov_base = (void *)addr;
+ remote.iov_len = len;
+
+ nwritten = process_vm_writev(pid, &local, 1, &remote, 1, 0);
+ switch (nwritten) {
case -1:
- sudo_warn("%s: ptrace(PTRACE_PEEKDATA, %d, 0x%lx, NULL)",
- __func__, (int)pid, addr);
- debug_return_int(-1);
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "process_vm_writev(%d, [0x%lx, %zu], 1, [0x%lx, %zu], 1, 0)",
+ (int)pid, (unsigned long)local.iov_base, local.iov_len,
+ (unsigned long)remote.iov_base, remote.iov_len);
+ debug_return_ssize_t(-1);
case 0:
- debug_return_int(len);
+ /* Should not be possible. */
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "process_vm_writev(%d, [0x%lx, %zu], 1, [0x%lx, %zu], 1, 0): %s",
+ (int)pid, (unsigned long)local.iov_base, local.iov_len,
+ (unsigned long)remote.iov_base, remote.iov_len,
+ "zero bytes written");
+ debug_return_ssize_t(-1);
default:
- len++;
- addr += regs->wordsize;
- continue;
+ str += nwritten;
+ len -= nwritten;
+ addr += nwritten;
+ if (len == 0)
+ debug_return_size_t(str - str0); /* includes NUL */
+ break;
}
}
+ debug_return_ssize_t(-1);
}
+#endif /* HAVE_PROCESS_VM_READV */
/*
- * Write the NUL-terminated string str to addr in the tracee.
+ * Write the NUL-terminated string str to addr in the tracee using ptrace(2).
* Returns the number of bytes written, including trailing NUL.
*/
static size_t
ptrace_write_string(pid_t pid, unsigned long addr, const char *str)
{
const char *str0 = str;
- unsigned int i;
+ size_t i;
union {
unsigned long word;
char buf[sizeof(unsigned long)];
} u;
debug_decl(ptrace_write_string, SUDO_DEBUG_EXEC);
+#ifdef HAVE_PROCESS_VM_READV
+ i = ptrace_writev_string(pid, addr, str);
+ if (i != (size_t)-1 || errno != ENOSYS)
+ debug_return_size_t(i);
+#endif /* HAVE_PROCESS_VM_READV */
+
/*
* Write the string via ptrace(2) one (native) word at a time.
* We use the native word size even in compat mode because that
@@ -507,7 +726,7 @@ ptrace_write_string(pid_t pid, unsigned long addr, const char *str)
if (ptrace(PTRACE_POKEDATA, pid, addr, u.word) == -1) {
sudo_warn("%s: ptrace(PTRACE_POKEDATA, %d, 0x%lx, %.*s)",
__func__, (int)pid, addr, (int)sizeof(u.buf), u.buf);
- debug_return_size_t(-1);
+ debug_return_ssize_t(-1);
}
if ((u.word & 0xff) == 0) {
/* If the last byte we wrote is a NUL we are done. */
@@ -517,6 +736,137 @@ ptrace_write_string(pid_t pid, unsigned long addr, const char *str)
}
}
+#ifdef HAVE_PROCESS_VM_READV
+/*
+ * Write the string vector vec to addr in the tracee which must have
+ * sufficient space. Strings are written to strtab.
+ * Returns the number of bytes used in strtab (including NULs).
+ * process_vm_writev() version.
+ */
+static size_t
+ptrace_writev_vec(pid_t pid, struct sudo_ptrace_regs *regs, char **vec,
+ unsigned long addr, unsigned long strtab)
+{
+ const unsigned long addr0 = addr;
+ const unsigned long strtab0 = strtab;
+ unsigned long *addrbuf = NULL;
+ struct iovec *local, *remote;
+ struct iovec local_addrs, remote_addrs;
+ size_t i, j, len, off = 0;
+ ssize_t expected = -1, nwritten, total_written = 0;
+ debug_decl(ptrace_writev_vec, SUDO_DEBUG_EXEC);
+
+ /* Build up local and remote iovecs for process_vm_writev(2). */
+ for (len = 0; vec[len] != NULL; len++)
+ continue;
+ local = reallocarray(NULL, len, sizeof(struct iovec));
+ remote = reallocarray(NULL, len, sizeof(struct iovec));
+ j = regs->compat && (len & 1) != 0; /* pad for final NULL in compat */
+ addrbuf = reallocarray(NULL, len + 1 + j, regs->wordsize);
+ if (local == NULL || remote == NULL || addrbuf == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+ for (i = 0, j = 0; i < len; i++) {
+ unsigned long word = strtab;
+
+ /* Store remote string. */
+ const size_t size = strlen(vec[i]) + 1;
+ local[i].iov_base = vec[i];
+ local[i].iov_len = size;
+ remote[i].iov_base = (void *)strtab;
+ remote[i].iov_len = size;
+ strtab += size;
+
+ /* Store address of remote string. */
+# ifdef SECCOMP_AUDIT_ARCH_COMPAT
+ if (regs->compat) {
+ /*
+ * For compat binaries we need to pack two 32-bit string addresses
+ * into a single 64-bit word. If this is the last string, NULL
+ * will be written as the second 32-bit address.
+ */
+ if ((i & 1) == 1) {
+ /* Wrote this string address last iteration. */
+ continue;
+ }
+# if BYTE_ORDER == BIG_ENDIAN
+ word <<= 32;
+ if (vec[i + 1] != NULL)
+ word |= strtab;
+# else
+ if (vec[i + 1] != NULL)
+ word |= strtab << 32;
+# endif
+ }
+# endif
+ addrbuf[j++] = word;
+ addr += sizeof(unsigned long);
+ }
+ if (!regs->compat || (len & 1) == 0) {
+ addrbuf[j] = 0;
+ }
+
+ /* Write strings addresses to addr0 on remote. */
+ local_addrs.iov_base = addrbuf;
+ local_addrs.iov_len = (len + 1) * regs->wordsize;
+ remote_addrs.iov_base = (void *)addr0;
+ remote_addrs.iov_len = local_addrs.iov_len;
+ if (process_vm_writev(pid, &local_addrs, 1, &remote_addrs, 1, 0) == -1)
+ goto done;
+
+ /* Copy the strings to the (remote) string table. */
+ expected = strtab - strtab0;
+ for (;;) {
+ nwritten = process_vm_writev(pid, local + off, len - off,
+ remote + off, len - off, 0);
+ switch (nwritten) {
+ case -1:
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "process_vm_writev(%d, 0x%lx, %zu, 0x%lx, %zu, 0)",
+ (int)pid, (unsigned long)local + off, len - off,
+ (unsigned long)remote + off, len - off);
+ goto done;
+ case 0:
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "process_vm_writev(%d, 0x%lx, %zu, 0x%lx, %zu, 0): %s",
+ (int)pid, (unsigned long)local + off, len - off,
+ (unsigned long)remote + off, len - off,
+ "zero bytes written");
+ goto done;
+ default:
+ total_written += nwritten;
+ if (total_written >= expected)
+ goto done;
+
+ /* Adjust offset for partial write (doesn't cross iov boundary). */
+ while (off < len) {
+ nwritten -= local[off].iov_len;
+ off++;
+ if (nwritten <= 0)
+ break;
+ }
+ if (off == len) {
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "overflow while resuming process_vm_writev()");
+ goto done;
+ }
+ break;
+ }
+ }
+done:
+ free(local);
+ free(remote);
+ free(addrbuf);
+ if (total_written == expected)
+ debug_return_size_t(total_written);
+ debug_return_ssize_t(-1);
+}
+#endif /* HAVE_PROCESS_VM_READV */
+
/*
* Write the string vector vec to addr in the tracee which must have
* sufficient space. Strings are written to strtab.
@@ -530,6 +880,12 @@ ptrace_write_vec(pid_t pid, struct sudo_ptrace_regs *regs, char **vec,
size_t i, len;
debug_decl(ptrace_write_vec, SUDO_DEBUG_EXEC);
+#ifdef HAVE_PROCESS_VM_READV
+ i = ptrace_writev_vec(pid, regs, vec, addr, strtab);
+ if (i != (size_t)-1 || errno != ENOSYS)
+ debug_return_size_t(i);
+#endif /* HAVE_PROCESS_VM_READV */
+
/* Copy string vector into tracee one word at a time. */
for (i = 0; vec[i] != NULL; i++) {
unsigned long word = strtab;
@@ -583,23 +939,23 @@ ptrace_write_vec(pid_t pid, struct sudo_ptrace_regs *regs, char **vec,
}
/*
- * Use /proc/PID/cwd to determine the current working directory.
+ * Read a link from /proc/PID and store the result in buf.
+ * Used to read the cwd and exe links in /proc/PID.
* Returns true on success, else false.
*/
static bool
-getcwd_by_pid(pid_t pid, char *buf, size_t bufsize)
+proc_read_link(pid_t pid, const char *name, char *buf, size_t bufsize)
{
size_t len;
char path[PATH_MAX];
- debug_decl(getcwd_by_pid, SUDO_DEBUG_EXEC);
+ debug_decl(proc_read_link, SUDO_DEBUG_EXEC);
- len = snprintf(path, sizeof(path), "/proc/%d/cwd", (int)pid);
+ len = snprintf(path, sizeof(path), "/proc/%d/%s", (int)pid, name);
if (len < sizeof(path)) {
- len = readlink(path, buf, bufsize);
+ len = readlink(path, buf, bufsize - 1);
if (len != (size_t)-1) {
- /* Check for truncation. */
- if (len >= bufsize)
- buf[bufsize - 1] = '\0';
+ /* readlink(2) does not add the NUL for us. */
+ buf[len] = '\0';
debug_return_bool(true);
}
}
@@ -614,66 +970,82 @@ static char *
get_execve_info(pid_t pid, struct sudo_ptrace_regs *regs, char **pathname_out,
int *argc_out, char ***argv_out, int *envc_out, char ***envp_out)
{
- char *argbuf, *strtab, *pathname, **argv, **envp;
+ char *pathname, **argv, **envp, *argbuf = NULL;
unsigned long path_addr, argv_addr, envp_addr;
- int argc, envc;
- size_t bufsize, len;
+ size_t bufsize, len, off = 0;
+ int i, argc, envc = 0;
debug_decl(get_execve_info, SUDO_DEBUG_EXEC);
- bufsize = sysconf(_SC_ARG_MAX) + PATH_MAX;
+ bufsize = PATH_MAX + arg_max;
argbuf = malloc(bufsize);
- if (argbuf == NULL)
- sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ if (argbuf == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto bad;
+ }
/* execve(2) takes three arguments: pathname, argv, envp. */
path_addr = get_sc_arg1(regs);
argv_addr = get_sc_arg2(regs);
envp_addr = get_sc_arg3(regs);
+ sudo_debug_printf(SUDO_DEBUG_INFO,
+ "%s: %d: path 0x%lx, argv 0x%lx, envp 0x%lx", __func__,
+ (int)pid, path_addr, argv_addr, envp_addr);
- /* Count argv and envp */
- argc = ptrace_get_vec_len(pid, regs, argv_addr);
- envc = ptrace_get_vec_len(pid, regs, envp_addr);
- if (argc == -1 || envc == -1)
- goto bad;
-
- /* Reserve argv and envp at the start of argbuf so they are aligned. */
- if ((argc + 1 + envc + 1) * sizeof(unsigned long) >= bufsize) {
- sudo_warnx("%s", U_("insufficient space for execve arguments"));
- goto bad;
+ /* Read the pathname. */
+ if (path_addr == 0) {
+ /* execve(2) will fail with EINVAL */
+ pathname = NULL;
+ } else {
+ len = ptrace_read_string(pid, path_addr, argbuf, bufsize);
+ if (len == (size_t)-1) {
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to read execve pathname for process %d", (int)pid);
+ goto bad;
+ }
+ pathname = argbuf;
+ off = len;
}
- argv = (char **)argbuf;
- envp = argv + argc + 1;
- strtab = (char *)(envp + envc + 1);
- bufsize -= strtab - argbuf;
/* Read argv */
- len = ptrace_read_vec(pid, regs, argv_addr, argv, strtab, bufsize);
+ len = ptrace_read_vec(pid, regs, argv_addr, &argc, &argv, &argbuf,
+ &bufsize, off);
if (len == (size_t)-1) {
- sudo_warn(U_("unable to read execve %s for process %d"),
- "argv", (int)pid);
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to read execve argv for process %d", (int)pid);
goto bad;
}
- strtab += len;
- bufsize -= len;
+ off += len;
+
+ if (argc == 0) {
+ /* Reserve an extra slot so we can store argv[0]. */
+ while (bufsize - off < sizeof(char *)) {
+ if (!growbuf(&argbuf, &bufsize, NULL, NULL))
+ goto bad;
+ }
+ off += sizeof(char *);
+ }
/* Read envp */
- len = ptrace_read_vec(pid, regs, envp_addr, envp, strtab, bufsize);
+ len = ptrace_read_vec(pid, regs, envp_addr, &envc, &envp, &argbuf,
+ &bufsize, off);
if (len == (size_t)-1) {
- sudo_warn(U_("unable to read execve %s for process %d"),
- "envp", (int)pid);
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to read execve envp for process %d", (int)pid);
goto bad;
}
- strtab += len;
- bufsize -= len;
- /* Read the pathname. */
- len = ptrace_read_string(pid, path_addr, strtab, bufsize);
- if (len == (size_t)-1) {
- sudo_warn(U_("unable to read execve %s for process %d"),
- "pathname", (int)pid);
- goto bad;
+ /* Convert offsets in argv and envp to pointers. */
+ argv = (char **)(argbuf + (unsigned long)argv);
+ for (i = 0; i < argc; i++) {
+ argv[i] = argbuf + (unsigned long)argv[i];
+ }
+ envp = (char **)(argbuf + (unsigned long)envp);
+ for (i = 0; i < envc; i++) {
+ envp[i] = argbuf + (unsigned long)envp[i];
}
- pathname = strtab;
sudo_debug_execve(SUDO_DEBUG_DIAG, pathname, argv, envp);
@@ -847,11 +1219,21 @@ int
exec_ptrace_seize(pid_t child)
{
const long ptrace_opts = PTRACE_O_TRACESECCOMP|PTRACE_O_TRACECLONE|
- PTRACE_O_TRACEFORK|PTRACE_O_TRACEVFORK;
+ PTRACE_O_TRACEFORK|PTRACE_O_TRACEVFORK|
+ PTRACE_O_TRACEEXEC;
int ret = -1;
int status;
debug_decl(exec_ptrace_seize, SUDO_DEBUG_EXEC);
+#ifdef HAVE_PROCESS_VM_READV
+ page_size = sysconf(_SC_PAGESIZE);
+ if (page_size == (size_t)-1)
+ page_size = 4096;
+#endif
+ arg_max = sysconf(_SC_ARG_MAX);
+ if (arg_max == (size_t)-1)
+ arg_max = 128 * 1024;
+
/* Seize control of the child process. */
if (ptrace(PTRACE_SEIZE, child, NULL, ptrace_opts) == -1) {
/*
@@ -904,45 +1286,249 @@ done:
}
/*
- * Verify that the execve(2) argument we wrote match the contents of closure.
- * Returns true if they match, else false.
+ * Compare two pathnames. If do_stat is true, fall back to stat(2)ing
+ * the paths for a dev/inode match if the strings don't match.
+ * Returns true on match, else false.
*/
static bool
-verify_execve_info(pid_t pid, struct sudo_ptrace_regs *regs,
- struct intercept_closure *closure)
+pathname_matches(const char *path1, const char *path2, bool do_stat)
{
- char *pathname, **argv, **envp, *buf;
- int argc, envc, i;
- bool ret = true;
- debug_decl(verify_execve_info, SUDO_DEBUG_EXEC);
+ struct stat sb1, sb2;
+ debug_decl(pathname_matches, SUDO_DEBUG_EXEC);
- buf = get_execve_info(pid, regs, &pathname, &argc, &argv,
- &envc, &envp);
- if (buf == NULL)
+ sudo_debug_printf(SUDO_DEBUG_INFO, "%s: compare %s to %s", __func__,
+ path1 ? path1 : "(NULL)", path2 ? path2 : "(NULL)");
+
+ if (path1 == NULL || path2 == NULL)
debug_return_bool(false);
- if (pathname == NULL || strcmp(pathname, closure->command) != 0) {
- sudo_warn(
+ if (strcmp(path1, path2) == 0)
+ debug_return_bool(true);
+
+ if (do_stat && stat(path1, &sb1) == 0 && stat(path2, &sb2) == 0) {
+ if (sb1.st_dev == sb2.st_dev && sb1.st_ino == sb2.st_ino)
+ debug_return_bool(true);
+ }
+
+ debug_return_bool(false);
+}
+
+/*
+ * Open script and check for '#!' magic number followed by an interpreter.
+ * If present, check the interpreter against execpath, and argument string
+ * (if any) against argv[1].
+ * Returns number of argv entries to skip on success, else 0.
+ */
+static int
+script_matches(const char *script, const char *execpath, int argc,
+ char * const *argv)
+{
+ char * const *orig_argv = argv;
+ size_t linesize = 0;
+ char *interp, *interp_args, *line = NULL;
+ char magic[2];
+ int count;
+ FILE *fp = NULL;
+ ssize_t len;
+ debug_decl(get_interpreter, SUDO_DEBUG_EXEC);
+
+ /* Linux allows up to 4 nested interpreters. */
+ for (count = 0; count < 4; count++) {
+ if (fp != NULL)
+ fclose(fp);
+ fp = fopen(script, "r");
+ if (fp == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_ERRNO,
+ "%s: unable to open %s for reading", __func__, script);
+ goto done;
+ }
+
+ if (fread(magic, 1, 2, fp) != 2 || memcmp(magic, "#!", 2) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: %s: not a script",
+ __func__, script);
+ goto done;
+ }
+
+ /* Check interpreter, skipping the shebang and trim trailing space. */
+ len = getdelim(&line, &linesize, '\n', fp);
+ if (len == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR, "%s: %s: can't get interpreter",
+ __func__, script);
+ goto done;
+ }
+ while (len > 0 && isspace((unsigned char)line[len - 1])) {
+ len--;
+ line[len] = '\0';
+ }
+ sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: %s: shebang line \"%s\"",
+ __func__, script, line);
+
+ /*
+ * Split line into interpreter and args.
+ * Whitespace is not supported in the interpreter path.
+ */
+ for (interp = line; isspace((unsigned char)*interp); interp++)
+ continue;
+ interp_args = strpbrk(interp, " \t");
+ if (interp_args != NULL) {
+ *interp_args++ = '\0';
+ while (isspace((unsigned char)*interp_args))
+ interp_args++;
+ }
+
+ sudo_debug_printf(SUDO_DEBUG_INFO, "%s: interpreter %s, args \"%s\"",
+ __func__, interp, interp_args ? interp_args : "");
+
+ /* Match interpreter. */
+ if (!pathname_matches(execpath, interp, true)) {
+ /* It is possible for the interpreter to be a script too. */
+ if (argv > 0 && strcmp(interp, argv[1]) == 0) {
+ /* Interpreter args must match for *this* interpreter. */
+ if (interp_args == NULL ||
+ (argc > 1 && strcmp(interp_args, argv[2]) == 0)) {
+ script = interp;
+ argv++;
+ argc--;
+ if (interp_args != NULL) {
+ argv++;
+ argc--;
+ }
+ /* Check whether interp is itself a script. */
+ continue;
+ }
+ }
+ }
+ if (argc > 0 && interp_args != NULL) {
+ if (strcmp(interp_args, argv[1]) != 0) {
+ sudo_warnx(
+ U_("interpreter argument , expected \"%s\", got \"%s\""),
+ interp_args, argc > 1 ? argv[1] : "(NULL)");
+ goto done;
+ }
+ argv++;
+ }
+ argv++;
+ break;
+ }
+
+done:
+ free(line);
+ if (fp != NULL)
+ fclose(fp);
+ debug_return_int((int)(argv - orig_argv));
+}
+
+static size_t
+proc_read_vec(pid_t pid, const char *name, int *countp, char ***vecp,
+ char **bufp, size_t *bufsizep, size_t off)
+{
+ size_t remainder = *bufsizep - off;
+ size_t len, strtab_len;
+ char path[PATH_MAX], *strtab = *bufp + off;
+ int fd;
+ ssize_t nread;
+ debug_decl(proc_read_vec, SUDO_DEBUG_EXEC);
+
+ len = snprintf(path, sizeof(path), "/proc/%d/%s", (int)pid, name);
+ if (len >= sizeof(path))
+ debug_return_ssize_t(-1);
+
+ fd = open(path, O_RDONLY);
+ if (fd == -1)
+ debug_return_ssize_t(-1);
+
+ /* Read in strings until EOF. */
+ do {
+ nread = read(fd, strtab, remainder);
+ if (nread == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to read %s", __func__, path);
+ close(fd);
+ debug_return_ssize_t(-1);
+ }
+ strtab += nread;
+ remainder -= nread;
+ if (remainder < sizeof(char *)) {
+ while (!growbuf(bufp, bufsizep, &strtab, &remainder)) {
+ close(fd);
+ debug_return_ssize_t(-1);
+ }
+ }
+ } while (nread != 0);
+ close(fd);
+
+ /* Trim off the extra NUL byte at the end of the string table. */
+ if (strtab - *bufp >= 2 && strtab[-1] == '\0' && strtab[-2] == '\0') {
+ strtab--;
+ remainder++;
+ }
+
+ /* Store strings in a vector after the string table. */
+ strtab_len = strtab - (*bufp + off);
+ strtab = *bufp + off;
+ len = strtab_to_vec(strtab, strtab_len, countp, vecp, bufp, bufsizep,
+ remainder);
+ if (len == (size_t)-1)
+ debug_return_ssize_t(-1);
+
+ debug_return_size_t(strtab_len + len);
+}
+
+/*
+ * Check if the execve(2) arguments match the contents of closure.
+ * Returns true if they match, else false.
+ */
+static bool
+execve_args_match(const char *pathname, int argc, char * const *argv,
+ int envc, char * const *envp, bool do_stat,
+ struct intercept_closure *closure)
+{
+ bool ret = true;
+ int i;
+ debug_decl(execve_args_match, SUDO_DEBUG_EXEC);
+
+ if (!pathname_matches(pathname, closure->command, do_stat)) {
+ /* For scripts, pathname will refer to the interpreter instead. */
+ if (do_stat) {
+ int skip = script_matches(closure->command, pathname,
+ argc, argv);
+ if (skip != 0) {
+ /* Skip interpreter (and args) in argv. */
+ argv += skip;
+ argc -= skip;
+ goto check_argv;
+ }
+ }
+ sudo_warnx(
U_("pathname mismatch, expected \"%s\", got \"%s\""),
closure->command, pathname ? pathname : "(NULL)");
ret = false;
}
+check_argv:
for (i = 0; i < argc; i++) {
if (closure->run_argv[i] == NULL) {
ret = false;
- sudo_warn(
+ sudo_warnx(
U_("%s[%d] mismatch, expected \"%s\", got \"%s\""),
"argv", i, "(NULL)", argv[i] ? argv[i] : "(NULL)");
break;
- } else if (argv[i] == NULL) {
+ }
+ if (argv[i] == NULL) {
ret = false;
- sudo_warn(
+ sudo_warnx(
U_("%s[%d] mismatch, expected \"%s\", got \"%s\""),
"argv", i, closure->run_argv[i], "(NULL)");
break;
- } else if (strcmp(argv[i], closure->run_argv[i]) != 0) {
+ }
+ if (strcmp(argv[i], closure->run_argv[i]) != 0) {
+ if (i == 0) {
+ /* Special case for argv[0] which may contain the basename. */
+ const char *base = sudo_basename(closure->run_argv[0]);
+ if (strcmp(argv[i], base) == 0)
+ continue;
+ }
ret = false;
- sudo_warn(
+ sudo_warnx(
U_("%s[%d] mismatch, expected \"%s\", got \"%s\""),
"argv", i, closure->run_argv[i], argv[i]);
}
@@ -950,24 +1536,144 @@ verify_execve_info(pid_t pid, struct sudo_ptrace_regs *regs,
for (i = 0; i < envc; i++) {
if (closure->run_envp[i] == NULL) {
ret = false;
- sudo_warn(
+ sudo_warnx(
U_("%s[%d] mismatch, expected \"%s\", got \"%s\""),
"envp", i, "(NULL)", envp[i] ? envp[i] : "(NULL)");
break;
} else if (envp[i] == NULL) {
ret = false;
- sudo_warn(
+ sudo_warnx(
U_("%s[%d] mismatch, expected \"%s\", got \"%s\""),
"envp", i, closure->run_envp[i], "(NULL)");
break;
} else if (strcmp(envp[i], closure->run_envp[i]) != 0) {
ret = false;
- sudo_warn(
+ sudo_warnx(
U_("%s[%d] mismatch, expected \"%s\", got \"%s\""),
"envp", i, closure->run_envp[i], envp[i]);
}
}
- free(buf);
+
+ debug_return_bool(ret);
+}
+
+/*
+ * Verify that the execve(2) argument we wrote match the contents of closure.
+ * Returns true if they match, else false.
+ */
+static bool
+verify_execve_args(pid_t pid, struct sudo_ptrace_regs *regs,
+ struct intercept_closure *closure)
+{
+ char *pathname, **argv, **envp, *buf;
+ int argc, envc;
+ bool ret = false;
+ debug_decl(verify_execve_args, SUDO_DEBUG_EXEC);
+
+ buf = get_execve_info(pid, regs, &pathname, &argc, &argv,
+ &envc, &envp);
+ if (buf != NULL) {
+ ret = execve_args_match(pathname, argc, argv, envc, envp, false, closure);
+ free(buf);
+ }
+
+ debug_return_bool(ret);
+}
+
+/*
+ * Verify that the command executed matches the arguments we checked.
+ * Returns true on success and false on error.
+ */
+static bool
+ptrace_verify_post_exec(pid_t pid, struct sudo_ptrace_regs *regs,
+ struct intercept_closure *closure)
+{
+ char **argv, **envp, *argbuf = NULL;
+ char pathname[PATH_MAX];
+ sigset_t chldmask;
+ bool ret = false;
+ int argc, envc, i, status;
+ size_t bufsize, len;
+ debug_decl(ptrace_verify_post_exec, SUDO_DEBUG_EXEC);
+
+ /* Block SIGCHLD for the critical section (waitpid). */
+ sigemptyset(&chldmask);
+ sigaddset(&chldmask, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &chldmask, NULL);
+
+ /* Allow execve(2) to continue and wait for PTRACE_EVENT_EXEC. */
+ ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
+ for (;;) {
+ if (waitpid(pid, &status, __WALL) != -1)
+ break;
+ if (errno == EINTR)
+ continue;
+ sudo_warn(U_("%s: %s"), __func__, "waitpid");
+ goto done;
+ }
+ if (!WIFSTOPPED(status)) {
+ sudo_warnx(U_("process %d exited unexpectedly"), (int)pid);
+ goto done;
+ }
+ if (status >> 8 != (SIGTRAP | (PTRACE_EVENT_EXEC << 8))) {
+ sudo_warnx(U_("process %d unexpected status 0x%x"), (int)pid, status);
+ goto done;
+ }
+
+ /* Get the executable path. */
+ if (!proc_read_link(pid, "exe", pathname, sizeof(pathname))) {
+ /* Missing /proc file system is not a fatal error. */
+ sudo_debug_printf(SUDO_DEBUG_ERROR, "%s: unable to read /proc/%d/exe",
+ __func__, (int)pid);
+ ret = true;
+ goto done;
+ }
+ sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %d: verify %s", __func__,
+ (int)pid, pathname);
+
+ /* Allocate a single buffer for argv, envp and their strings. */
+ bufsize = arg_max;
+ argbuf = malloc(bufsize);
+ if (argbuf == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+
+ len = proc_read_vec(pid, "cmdline", &argc, &argv, &argbuf, &bufsize, 0);
+ if (len == (size_t)-1) {
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to read execve argv for process %d", (int)pid);
+ goto done;
+ }
+
+ len = proc_read_vec(pid, "environ", &envc, &envp, &argbuf, &bufsize, len);
+ if (len == (size_t)-1) {
+ sudo_debug_printf(
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to read execve envp for process %d", (int)pid);
+ goto done;
+ }
+
+ /* Convert offsets in argv and envp to pointers. */
+ argv = (char **)(argbuf + (unsigned long)argv);
+ for (i = 0; i < argc; i++) {
+ argv[i] = argbuf + (unsigned long)argv[i];
+ }
+ envp = (char **)(argbuf + (unsigned long)envp);
+ for (i = 0; i < envc; i++) {
+ envp[i] = argbuf + (unsigned long)envp[i];
+ }
+
+ ret = execve_args_match(pathname, argc, argv, envc, envp, true, closure);
+ if (!ret) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR,
+ "%s: %d new execve args don't match closure", __func__, (int)pid);
+ }
+
+done:
+ free(argbuf);
+ sigprocmask(SIG_UNBLOCK, &chldmask, NULL);
debug_return_bool(ret);
}
@@ -1007,10 +1713,13 @@ ptrace_intercept_execve(pid_t pid, struct intercept_closure *closure)
}
/* Get the registers. */
+ memset(&regs, 0, sizeof(regs));
if (!ptrace_getregs(pid, &regs, msg)) {
sudo_warn(U_("unable to get registers for process %d"), (int)pid);
debug_return_bool(false);
}
+ sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %d: compat: %s, wordsize: %u",
+ __func__, (int)pid, regs.compat ? "true" : "false", regs.wordsize);
# ifdef SECCOMP_AUDIT_ARCH_COMPAT
if (regs.compat) {
@@ -1053,18 +1762,24 @@ ptrace_intercept_execve(pid_t pid, struct intercept_closure *closure)
}
/* Get the current working directory and execve info. */
- if (!getcwd_by_pid(pid, cwd, sizeof(cwd)))
+ if (!proc_read_link(pid, "cwd", cwd, sizeof(cwd)))
(void)strlcpy(cwd, "unknown", sizeof(cwd));
buf = get_execve_info(pid, &regs, &pathname, &argc, &argv,
&envc, &envp);
if (buf == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
"%s: %d: unable to get execve info", __func__, (int)pid);
+ /* EIO from ptrace is like EFAULT from the kernel. */
+ if (errno == EIO)
+ errno = EFAULT;
+ ptrace_fail_syscall(pid, &regs, errno);
+ goto done;
+ }
- /* Unrecoverable error, kill the process if it still exists. */
- if (errno != ESRCH)
- kill(pid, SIGKILL);
- debug_return_bool(false);
+ /* Must have a pathname. */
+ if (pathname == NULL) {
+ ptrace_fail_syscall(pid, &regs, EINVAL);
+ goto done;
}
/*
@@ -1077,10 +1792,18 @@ ptrace_intercept_execve(pid_t pid, struct intercept_closure *closure)
goto done;
}
+ /* We can only pass the pathname to exececute via argv[0] (plugin API). */
+ argv[0] = pathname;
+ if (argc == 0) {
+ /* Rewrite an empty argv[] with the path to execute. */
+ argv[1] = NULL;
+ argc = 1;
+ argv_mismatch = true;
+ }
+
/* Perform a policy check. */
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %d: checking policy for %s",
__func__, (int)pid, pathname);
- argv[0] = pathname;
if (!intercept_check_policy(pathname, argc, argv, envc, envp, cwd,
closure)) {
sudo_warnx("%s", U_(closure->errstr));
@@ -1110,6 +1833,8 @@ ptrace_intercept_execve(pid_t pid, struct intercept_closure *closure)
break;
}
}
+ if (closure->run_argv[i] != NULL || argv[i] != NULL)
+ argv_mismatch = true;
if (path_mismatch || argv_mismatch) {
/*
@@ -1188,12 +1913,21 @@ ptrace_intercept_execve(pid_t pid, struct intercept_closure *closure)
if (closure->state == POLICY_TEST) {
/* Verify the contents of what we just wrote. */
- if (!verify_execve_info(pid, &regs, closure)) {
+ if (!verify_execve_args(pid, &regs, closure)) {
sudo_debug_printf(SUDO_DEBUG_ERROR,
"%s: new execve args don't match closure", __func__);
}
}
}
+ if (closure->state == POLICY_ACCEPT) {
+ if (ISSET(closure->details->flags, CD_INTERCEPT_VERIFY)) {
+ /* Verify execve(2) args post-exec. */
+ if (!ptrace_verify_post_exec(pid, &regs, closure)) {
+ if (errno != ESRCH)
+ kill(pid, SIGKILL);
+ }
+ }
+ }
break;
default:
/* If rejected, fake the syscall and set return to EACCES */
@@ -1231,6 +1965,9 @@ exec_ptrace_stopped(pid_t pid, int status, void *intercept)
sudo_debug_printf(SUDO_DEBUG_ERROR,
"%s: %d failed to intercept execve", __func__, (int)pid);
}
+ } else if (sigtrap == (SIGTRAP | (PTRACE_EVENT_EXEC << 8))) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR,
+ "%s: %d PTRACE_EVENT_EXEC", __func__, (int)pid);
} else if (sigtrap == (SIGTRAP | (PTRACE_EVENT_CLONE << 8)) ||
sigtrap == (SIGTRAP | (PTRACE_EVENT_VFORK << 8)) ||
sigtrap == (SIGTRAP | (PTRACE_EVENT_FORK << 8))) {
@@ -1317,13 +2054,6 @@ exec_ptrace_subcmds_supported(void)
#else
/* STUB */
bool
-have_seccomp_action(const char *action)
-{
- return false;
-}
-
-/* STUB */
-bool
exec_ptrace_stopped(pid_t pid, int status, void *intercept)
{
return true;
diff --git a/src/exec_ptrace.h b/src/exec_ptrace.h
index 4340a48ea..680194db3 100644
--- a/src/exec_ptrace.h
+++ b/src/exec_ptrace.h
@@ -50,6 +50,10 @@
#define WORDALIGN(_a, _r) \
(((_a) + ((long)(_r).wordsize - 1L)) & ~((long)(_r).wordsize - 1L))
+/* Align pointer to a native word boundary. */
+#define LONGALIGN(_p) \
+ (((unsigned long)(_p) + (sizeof(long) - 1)) & ~(sizeof(long) - 1))
+
/*
* See syscall(2) for a list of registers used in system calls.
* For example code, see tools/testing/selftests/seccomp/seccomp_bpf.c
@@ -88,9 +92,9 @@
# define reg_arg4(x) (x).regs[3] /* x3 */
# define reg_set_syscall(_r, _nr) do { \
struct iovec _iov; \
- long syscallno = (_nr); \
- _iov.iov_base = &syscallno; \
- _iov.iov_len = sizeof(syscallno); \
+ long _syscallno = (_nr); \
+ _iov.iov_base = &_syscallno; \
+ _iov.iov_len = sizeof(_syscallno); \
ptrace(PTRACE_SETREGSET, pid, NT_ARM_SYSTEM_CALL, &_iov); \
} while (0)
#elif defined(__arm__)
diff --git a/src/exec_pty.c b/src/exec_pty.c
index e2fd9c60e..d8235fd85 100644
--- a/src/exec_pty.c
+++ b/src/exec_pty.c
@@ -48,82 +48,22 @@
#include "sudo_plugin.h"
#include "sudo_plugin_int.h"
-#ifndef __WALL
-# define __WALL 0
-#endif
-
-/* 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 {
- 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 command_status *cstat;
- void *intercept;
- struct monitor_message_list monitor_messages;
- pid_t monitor_pid;
- pid_t cmnd_pid;
- pid_t ppgrp;
- short rows;
- short cols;
-};
-
-/*
- * 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 struct monitor_message_list monitor_messages =
+ TAILQ_HEAD_INITIALIZER(monitor_messages);
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 pid_t 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);
+static void sync_ttysize(struct exec_closure *ec);
+static pid_t check_foreground(struct exec_closure *ec);
+static void schedule_signal(struct exec_closure *ec, int signo);
/*
* Cleanup hook for sudo_fatal()/sudo_fatalx()
@@ -202,307 +142,6 @@ pty_make_controlling(void)
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;
- const char *errstr = NULL;
- 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, &errstr);
- if (rc <= 0) {
- if (rc < 0) {
- /* Error: disable plugin's I/O function. */
- plugin->u.io->log_ttyin = NULL;
- audit_error(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("I/O plugin error"),
- iob->ec->details->info);
- } else {
- audit_reject(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("command rejected by I/O plugin"),
- iob->ec->details->info);
- }
- 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;
- const char *errstr = NULL;
- 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, &errstr);
- if (rc <= 0) {
- if (rc < 0) {
- /* Error: disable plugin's I/O function. */
- plugin->u.io->log_stdin = NULL;
- audit_error(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("I/O plugin error"),
- iob->ec->details->info);
- } else {
- audit_reject(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("command rejected by I/O plugin"),
- iob->ec->details->info);
- }
- 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;
- const char *errstr = NULL;
- 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, &errstr);
- if (rc <= 0) {
- if (rc < 0) {
- /* Error: disable plugin's I/O function. */
- plugin->u.io->log_ttyout = NULL;
- audit_error(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("I/O plugin error"),
- iob->ec->details->info);
- } else {
- audit_reject(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("command rejected by I/O plugin"),
- iob->ec->details->info);
- }
- 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;
- const char *errstr = NULL;
- 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, &errstr);
- if (rc <= 0) {
- if (rc < 0) {
- /* Error: disable plugin's I/O function. */
- plugin->u.io->log_stdout = NULL;
- audit_error(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("I/O plugin error"),
- iob->ec->details->info);
- } else {
- audit_reject(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("command rejected by I/O plugin"),
- iob->ec->details->info);
- }
- 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;
- const char *errstr = NULL;
- 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, &errstr);
- if (rc <= 0) {
- if (rc < 0) {
- /* Error: disable plugin's I/O function. */
- plugin->u.io->log_stderr = NULL;
- audit_error(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("I/O plugin error"),
- iob->ec->details->info);
- } else {
- audit_reject(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("command rejected by I/O plugin"),
- iob->ec->details->info);
- }
- 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(struct exec_closure_pty *ec, int signo)
-{
- struct plugin_container *plugin;
- const char *errstr = NULL;
- 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, &errstr);
- if (rc <= 0) {
- /* Error: disable plugin's I/O function. */
- plugin->u.io->log_suspend = NULL;
- audit_error(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("error logging suspend"),
- ec->details->info);
- 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(struct exec_closure_pty *ec, unsigned int rows, unsigned int cols)
-{
- struct plugin_container *plugin;
- const char *errstr = NULL;
- 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, &errstr);
- if (rc <= 0) {
- /* Error: disable plugin's I/O function. */
- plugin->u.io->change_winsize = NULL;
- audit_error(plugin->name, SUDO_IO_PLUGIN,
- errstr ? errstr : _("error changing window size"),
- ec->details->info);
- 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 updates the window size.
@@ -510,7 +149,7 @@ log_winchange(struct exec_closure_pty *ec, unsigned int rows, unsigned int cols)
* on success, or -1 on failure (tty revoked).
*/
static pid_t
-check_foreground(struct exec_closure_pty *ec)
+check_foreground(struct exec_closure *ec)
{
int ret = 0;
debug_decl(check_foreground, SUDO_DEBUG_EXEC);
@@ -532,7 +171,7 @@ check_foreground(struct exec_closure_pty *ec)
* foreground or SIGCONT_BG if it is a background process.
*/
static int
-suspend_sudo_pty(struct exec_closure_pty *ec, int signo)
+suspend_sudo_pty(struct exec_closure *ec, int signo)
{
char signame[SIG2STR_MAX];
struct sigaction sa, osa;
@@ -823,71 +462,25 @@ write_callback(int fd, int what, void *v)
debug_return;
}
-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|SUDO_EV_PERSIST,
- read_callback, iob);
- iob->wevent = sudo_ev_alloc(wfd, SUDO_EV_WRITE|SUDO_EV_PERSIST,
- 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 follower so reads from the leader will not block.
*/
static void
pty_finish(struct command_status *cstat)
{
- struct io_buffer *iob;
- int n;
+ int flags;
debug_decl(pty_finish, SUDO_DEBUG_EXEC);
- /* Flush any remaining output (the plugin already got it). */
+ /* Flush any remaining output (the plugin already got it) and free bufs. */
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);
+ flags = fcntl(io_fds[SFD_USERTTY], F_GETFL, 0);
+ if (flags != -1 && ISSET(flags, O_NONBLOCK)) {
+ CLR(flags, O_NONBLOCK);
+ (void) fcntl(io_fds[SFD_USERTTY], F_SETFL, flags);
}
}
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);
- }
+ free_io_bufs();
/* Restore terminal settings. */
if (io_fds[SFD_USERTTY] != -1)
@@ -904,7 +497,7 @@ pty_finish(struct command_status *cstat)
* 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)
+send_command_status(struct exec_closure *ec, int type, int val)
{
struct monitor_message *msg;
debug_decl(send_command, SUDO_DEBUG_EXEC);
@@ -913,7 +506,7 @@ send_command_status(struct exec_closure_pty *ec, int type, int val)
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);
+ TAILQ_INSERT_TAIL(&monitor_messages, msg, entries);
if (sudo_ev_add(ec->evbase, ec->fwdchannel_event, NULL, true) == -1)
sudo_fatal("%s", U_("unable to add event to queue"));
@@ -928,7 +521,7 @@ send_command_status(struct exec_closure_pty *ec, int type, int val)
* Schedule a signal to be forwarded.
*/
static void
-schedule_signal(struct exec_closure_pty *ec, int signo)
+schedule_signal(struct exec_closure *ec, int signo)
{
char signame[SIG2STR_MAX];
debug_decl(schedule_signal, SUDO_DEBUG_EXEC);
@@ -949,10 +542,27 @@ schedule_signal(struct exec_closure_pty *ec, int signo)
debug_return;
}
+/*
+ * Free any remaining monitor messages in the queue.
+ */
+static void
+flush_monitor_messages(void)
+{
+ struct monitor_message *msg;
+ debug_decl(flush_monitor_messages, SUDO_DEBUG_EXEC);
+
+ while ((msg = TAILQ_FIRST(&monitor_messages)) != NULL) {
+ TAILQ_REMOVE(&monitor_messages, msg, entries);
+ free(msg);
+ }
+
+ debug_return;
+}
+
static void
backchannel_cb(int fd, int what, void *v)
{
- struct exec_closure_pty *ec = v;
+ struct exec_closure *ec = v;
struct command_status cstat;
ssize_t nread;
debug_decl(backchannel_cb, SUDO_DEBUG_EXEC);
@@ -1060,7 +670,7 @@ backchannel_cb(int fd, int what, void *v)
* Handle changes to the monitors's status (SIGCHLD).
*/
static void
-handle_sigchld_pty(struct exec_closure_pty *ec)
+handle_sigchld_pty(struct exec_closure *ec)
{
int n, status;
pid_t pid;
@@ -1129,7 +739,7 @@ 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;
+ struct exec_closure *ec = sc->closure;
char signame[SIG2STR_MAX];
debug_decl(signal_cb_pty, SUDO_DEBUG_EXEC);
@@ -1180,13 +790,13 @@ signal_cb_pty(int signo, int what, void *v)
static void
fwdchannel_cb(int sock, int what, void *v)
{
- struct exec_closure_pty *ec = v;
+ struct exec_closure *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) {
+ while ((msg = TAILQ_FIRST(&monitor_messages)) != NULL) {
switch (msg->cstat.type) {
case CMD_SIGNO:
if (msg->cstat.val == SIGCONT_FG)
@@ -1209,7 +819,7 @@ fwdchannel_cb(int sock, int what, void *v)
msg->cstat.type, msg->cstat.val);
break;
}
- TAILQ_REMOVE(&ec->monitor_messages, msg, entries);
+ TAILQ_REMOVE(&monitor_messages, msg, entries);
nsent = send(sock, &msg->cstat, sizeof(msg->cstat), 0);
if (nsent != sizeof(msg->cstat)) {
if (errno == EPIPE) {
@@ -1217,10 +827,7 @@ fwdchannel_cb(int sock, int what, void *v)
"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);
- }
+ flush_monitor_messages();
/* XXX - need new CMD_ type for monitor errors. */
ec->cstat->type = CMD_ERRNO;
ec->cstat->val = errno;
@@ -1238,10 +845,10 @@ fwdchannel_cb(int sock, int what, void *v)
* Forwarded signals on the backchannel are enabled on demand.
*/
static void
-fill_exec_closure_pty(struct exec_closure_pty *ec, struct command_status *cstat,
+fill_exec_closure(struct exec_closure *ec, struct command_status *cstat,
struct command_details *details, pid_t ppgrp, int backchannel)
{
- debug_decl(fill_exec_closure_pty, SUDO_DEBUG_EXEC);
+ debug_decl(fill_exec_closure, SUDO_DEBUG_EXEC);
/* Fill in the non-event part of the closure. */
ec->cmnd_pid = -1;
@@ -1250,7 +857,6 @@ fill_exec_closure_pty(struct exec_closure_pty *ec, struct command_status *cstat,
ec->details = details;
ec->rows = user_details.ts_rows;
ec->cols = user_details.ts_cols;
- TAILQ_INIT(&ec->monitor_messages);
/* Reset cstat for running the command. */
cstat->type = CMD_INVALID;
@@ -1353,40 +959,6 @@ fill_exec_closure_pty(struct exec_closure_pty *ec, struct command_status *cstat,
}
/*
- * 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);
-
- /* Free any remaining intercept resources. */
- intercept_cleanup();
-
- 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 logging, and
* wait for it to finish.
* This is a little bit tricky due to how POSIX job control works and
@@ -1398,7 +970,7 @@ 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 };
int sv[2], intercept_sv[2] = { -1, -1 };
- struct exec_closure_pty ec = { 0 };
+ struct exec_closure ec = { 0 };
struct plugin_container *plugin;
int evloop_retries = -1;
sigset_t set, oset;
@@ -1408,14 +980,10 @@ exec_pty(struct command_details *details, struct command_status *cstat)
debug_decl(exec_pty, SUDO_DEBUG_EXEC);
/*
- * Allocate a pty.
+ * Allocate a pty if sudo is running in a terminal.
*/
- 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);
- }
- }
+ if (!pty_setup(details, user_details.tty))
+ debug_return_bool(false);
/*
* We communicate with the monitor over a bi-directional pair of sockets.
@@ -1461,15 +1029,7 @@ exec_pty(struct command_details *details, struct command_status *cstat)
* 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);
-
+ init_ttyblock();
ppgrp = getpgrp(); /* parent's pgrp, so child can signal us */
/* Determine whether any of std{in,out,err} should be logged. */
@@ -1495,12 +1055,12 @@ exec_pty(struct command_details *details, struct command_status *cstat)
/* Read from /dev/tty, write to pty leader */
if (!ISSET(details->flags, CD_BACKGROUND)) {
io_buf_new(io_fds[SFD_USERTTY], io_fds[SFD_LEADER],
- log_ttyin, &ec, &iobufs);
+ log_ttyin, read_callback, write_callback, &ec, &iobufs);
}
/* Read from pty leader, write to /dev/tty */
io_buf_new(io_fds[SFD_LEADER], io_fds[SFD_USERTTY],
- log_ttyout, &ec, &iobufs);
+ log_ttyout, read_callback, write_callback, &ec, &iobufs);
/* Are we the foreground process? */
foreground = tcgetpgrp(io_fds[SFD_USERTTY]) == ppgrp;
@@ -1527,7 +1087,7 @@ exec_pty(struct command_details *details, struct command_status *cstat)
if (pipe2(io_pipe[STDIN_FILENO], O_CLOEXEC) != 0)
sudo_fatal("%s", U_("unable to create pipe"));
io_buf_new(STDIN_FILENO, io_pipe[STDIN_FILENO][1],
- log_stdin, &ec, &iobufs);
+ log_stdin, read_callback, write_callback, &ec, &iobufs);
io_fds[SFD_STDIN] = io_pipe[STDIN_FILENO][0];
}
}
@@ -1548,7 +1108,7 @@ exec_pty(struct command_details *details, struct command_status *cstat)
if (pipe2(io_pipe[STDOUT_FILENO], O_CLOEXEC) != 0)
sudo_fatal("%s", U_("unable to create pipe"));
io_buf_new(io_pipe[STDOUT_FILENO][0], STDOUT_FILENO,
- log_stdout, &ec, &iobufs);
+ log_stdout, read_callback, write_callback, &ec, &iobufs);
io_fds[SFD_STDOUT] = io_pipe[STDOUT_FILENO][1];
}
}
@@ -1568,7 +1128,7 @@ exec_pty(struct command_details *details, struct command_status *cstat)
if (pipe2(io_pipe[STDERR_FILENO], O_CLOEXEC) != 0)
sudo_fatal("%s", U_("unable to create pipe"));
io_buf_new(io_pipe[STDERR_FILENO][0], STDERR_FILENO,
- log_stderr, &ec, &iobufs);
+ log_stderr, read_callback, write_callback, &ec, &iobufs);
io_fds[SFD_STDERR] = io_pipe[STDERR_FILENO][1];
}
}
@@ -1676,7 +1236,7 @@ exec_pty(struct command_details *details, struct command_status *cstat)
* Fill in exec closure, allocate event base, signal events and
* the backchannel event.
*/
- fill_exec_closure_pty(&ec, cstat, details, ppgrp, sv[0]);
+ fill_exec_closure(&ec, cstat, details, ppgrp, sv[0]);
/* Create event and closure for intercept mode. */
if (ISSET(details->flags, CD_INTERCEPT|CD_LOG_SUBCMDS)) {
@@ -1734,156 +1294,17 @@ exec_pty(struct command_details *details, struct command_status *cstat)
pty_finish(cstat);
/* Free things up. */
- free_exec_closure_pty(&ec);
+ free_exec_closure(&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("%s", 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("%s", 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("%s", 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("%s", 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("%s", 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)
+sync_ttysize(struct exec_closure *ec)
{
struct winsize wsize;
debug_decl(sync_ttysize, SUDO_DEBUG_EXEC);
@@ -1907,57 +1328,3 @@ sync_ttysize(struct exec_closure_pty *ec)
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/src/intercept.pb-c.c b/src/intercept.pb-c.c
index e4e44c9b6..36d11eeb8 100644
--- a/src/intercept.pb-c.c
+++ b/src/intercept.pb-c.c
@@ -456,7 +456,7 @@ const ProtobufCMessageDescriptor intercept_hello__descriptor =
(ProtobufCMessageInit) intercept_hello__init,
NULL,NULL,NULL /* reserved[123] */
};
-static const ProtobufCFieldDescriptor hello_response__field_descriptors[3] =
+static const ProtobufCFieldDescriptor hello_response__field_descriptors[4] =
{
{
"token_lo",
@@ -494,8 +494,21 @@ static const ProtobufCFieldDescriptor hello_response__field_descriptors[3] =
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
+ {
+ "log_only",
+ 4,
+ PROTOBUF_C_LABEL_NONE,
+ PROTOBUF_C_TYPE_BOOL,
+ 0, /* quantifier_offset */
+ offsetof(HelloResponse, log_only),
+ NULL,
+ NULL,
+ 0, /* flags */
+ 0,NULL,NULL /* reserved1,reserved2, etc */
+ },
};
static const unsigned hello_response__field_indices_by_name[] = {
+ 3, /* field[3] = log_only */
2, /* field[2] = portno */
1, /* field[1] = token_hi */
0, /* field[0] = token_lo */
@@ -503,7 +516,7 @@ static const unsigned hello_response__field_indices_by_name[] = {
static const ProtobufCIntRange hello_response__number_ranges[1 + 1] =
{
{ 1, 0 },
- { 0, 3 }
+ { 0, 4 }
};
const ProtobufCMessageDescriptor hello_response__descriptor =
{
@@ -513,7 +526,7 @@ const ProtobufCMessageDescriptor hello_response__descriptor =
"HelloResponse",
"",
sizeof(HelloResponse),
- 3,
+ 4,
hello_response__field_descriptors,
hello_response__field_indices_by_name,
1, hello_response__number_ranges,
diff --git a/src/intercept.proto b/src/intercept.proto
index 786ae7bba..53a068a19 100644
--- a/src/intercept.proto
+++ b/src/intercept.proto
@@ -22,11 +22,13 @@ message InterceptHello {
/*
* Sudo response to an InterceptHello from sudo_intercept.so.
* The client uses the port number and token to connect back to sudo.
+ * If log_only is set there is no InterceptResponse to a PolicyCheckRequest.
*/
message HelloResponse {
fixed64 token_lo = 1;
fixed64 token_hi = 2;
int32 portno = 3;
+ bool log_only = 4;
}
/*
diff --git a/src/load_plugins.c b/src/load_plugins.c
index dd0ad3ef5..573460299 100644
--- a/src/load_plugins.c
+++ b/src/load_plugins.c
@@ -43,6 +43,7 @@ sudo_stat_plugin(struct plugin_info *info, char *fullpath,
size_t pathsize, struct stat *sb)
{
int status = -1;
+ size_t len;
debug_decl(sudo_stat_plugin, SUDO_DEBUG_PLUGIN);
if (info->path[0] == '/') {
@@ -52,8 +53,6 @@ sudo_stat_plugin(struct plugin_info *info, char *fullpath,
}
status = stat(fullpath, sb);
} else {
- int len;
-
#ifdef STATIC_SUDOERS_PLUGIN
/* Check static symbols. */
if (strcmp(info->path, SUDOERS_PLUGIN) == 0) {
@@ -77,20 +76,22 @@ sudo_stat_plugin(struct plugin_info *info, char *fullpath,
len = snprintf(fullpath, pathsize, "%s%s", sudo_conf_plugin_dir_path(),
info->path);
- if (len < 0 || (size_t)len >= pathsize) {
+ if (len >= pathsize) {
errno = 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;
+ status = stat(fullpath, sb);
+ }
+ if (status == -1) {
+ char *newpath = sudo_stat_multiarch(fullpath, sb);
+ if (newpath != NULL) {
+ len = strlcpy(fullpath, newpath, pathsize);
+ free(newpath);
+ if (len >= pathsize) {
+ errno = ENAMETOOLONG;
+ goto done;
}
+ status = 0;
}
}
done:
@@ -174,7 +175,7 @@ static struct plugin_container *
new_container(void *handle, const char *path, struct generic_plugin *plugin,
struct plugin_info *info)
{
- struct plugin_container *container = NULL;
+ struct plugin_container *container;
debug_decl(new_container, SUDO_DEBUG_PLUGIN);
if ((container = calloc(1, sizeof(*container))) == NULL) {
@@ -205,11 +206,11 @@ plugin_exists(struct plugin_container_list *plugins, const char *symbol_name)
typedef struct generic_plugin * (plugin_clone_func)(void);
-struct generic_plugin *
+static struct generic_plugin *
sudo_plugin_try_to_clone(void *so_handle, const char *symbol_name)
{
debug_decl(sudo_plugin_try_to_clone, SUDO_DEBUG_PLUGIN);
- struct generic_plugin * plugin = NULL;
+ struct generic_plugin *plugin = NULL;
plugin_clone_func *clone_func;
char *clone_func_name = NULL;
@@ -218,7 +219,8 @@ sudo_plugin_try_to_clone(void *so_handle, const char *symbol_name)
goto cleanup;
}
- clone_func = sudo_dso_findsym(so_handle, clone_func_name);
+ clone_func = (plugin_clone_func *)sudo_dso_findsym(so_handle,
+ clone_func_name);
if (clone_func) {
plugin = (*clone_func)();
}
@@ -436,7 +438,7 @@ sudo_init_event_alloc(void)
* Load the specified symbol from the sudoers plugin.
* Used to provide a default plugin when none are specified in sudo.conf.
*/
-bool
+static bool
sudo_load_sudoers_plugin(const char *symbol_name, bool optional)
{
struct plugin_info *info;
diff --git a/src/net_ifs.c b/src/net_ifs.c
index 76c272b40..eff6c8e89 100644
--- a/src/net_ifs.c
+++ b/src/net_ifs.c
@@ -67,11 +67,7 @@ struct rtentry;
#define DEFAULT_TEXT_DOMAIN "sudo"
-#include "sudo_compat.h"
-#include "sudo_conf.h"
-#include "sudo_debug.h"
-#include "sudo_fatal.h"
-#include "sudo_gettext.h"
+#include "sudo.h"
/* Minix apparently lacks IFF_LOOPBACK */
#ifndef IFF_LOOPBACK
@@ -109,7 +105,7 @@ int
get_net_ifs(char **addrinfo_out)
{
struct ifaddrs *ifa, *ifaddrs;
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin4;
# ifdef HAVE_STRUCT_IN6_ADDR
struct sockaddr_in6 *sin6;
# endif
@@ -160,19 +156,19 @@ get_net_ifs(char **addrinfo_out)
switch (ifa->ifa_addr->sa_family) {
case AF_INET:
- sin = (struct sockaddr_in *)ifa->ifa_addr;
- if (sin->sin_addr.s_addr == INADDR_ANY || sin->sin_addr.s_addr == INADDR_NONE) {
+ sin4 = (struct sockaddr_in *)ifa->ifa_addr;
+ if (sin4->sin_addr.s_addr == INADDR_ANY || sin4->sin_addr.s_addr == INADDR_NONE) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring unspecified AF_INET addr for %s", ifa->ifa_name);
continue;
}
- if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
+ if (inet_ntop(AF_INET, &sin4->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET addr for %s", ifa->ifa_name);
continue;
}
- sin = (struct sockaddr_in *)ifa->ifa_netmask;
- if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
+ sin4 = (struct sockaddr_in *)ifa->ifa_netmask;
+ if (inet_ntop(AF_INET, &sin4->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET mask for %s", ifa->ifa_name);
continue;
@@ -319,7 +315,7 @@ get_net_ifs(char **addrinfo_out)
*/
for (i = 0; i < ifconf.ifc_len; ) {
struct ifreq *ifr = (struct ifreq *)&ifconf.ifc_buf[i];
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin4;
/* Set i to the subscript of the next interface (no sa_len). */
i += sizeof(struct ifreq);
@@ -333,13 +329,13 @@ get_net_ifs(char **addrinfo_out)
}
/* Store the address. */
- sin = (struct sockaddr_in *)&ifr->ifr_addr;
- if (sin->sin_addr.s_addr == INADDR_ANY || sin->sin_addr.s_addr == INADDR_NONE) {
+ sin4 = (struct sockaddr_in *)&ifr->ifr_addr;
+ if (sin4->sin_addr.s_addr == INADDR_ANY || sin4->sin_addr.s_addr == INADDR_NONE) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring unspecified AF_INET addr for %s", ifr->ifr_name);
continue;
}
- if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
+ if (inet_ntop(AF_INET, &sin4->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET addr for %s", ifr->ifr_name);
continue;
@@ -363,8 +359,8 @@ get_net_ifs(char **addrinfo_out)
}
/* Convert the mask to string form. */
- sin = (struct sockaddr_in *)&ifr->ifr_addr;
- if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
+ sin4 = (struct sockaddr_in *)&ifr->ifr_addr;
+ if (inet_ntop(AF_INET, &sin4->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET mask for %s", ifr->ifr_name);
continue;
@@ -471,7 +467,7 @@ get_net_ifs(char **addrinfo_out)
{
struct lifconf lifconf;
struct lifnum lifn;
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin4;
struct sockaddr_in6 *sin6;
char addrstr[INET6_ADDRSTRLEN], maskstr[INET6_ADDRSTRLEN];
char *addrinfo = NULL;
@@ -544,13 +540,13 @@ get_net_ifs(char **addrinfo_out)
/* Store the address. */
switch (family) {
case AF_INET:
- sin = (struct sockaddr_in *)&lifr->lifr_addr;
- if (sin->sin_addr.s_addr == INADDR_ANY || sin->sin_addr.s_addr == INADDR_NONE) {
+ sin4 = (struct sockaddr_in *)&lifr->lifr_addr;
+ if (sin4->sin_addr.s_addr == INADDR_ANY || sin4->sin_addr.s_addr == INADDR_NONE) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring unspecified AF_INET addr for %s", lifr->lifr_name);
continue;
}
- if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
+ if (inet_ntop(AF_INET, &sin4->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET addr for %s", lifr->lifr_name);
continue;
@@ -596,8 +592,8 @@ get_net_ifs(char **addrinfo_out)
}
switch (family) {
case AF_INET:
- sin = (struct sockaddr_in *)&lifr->lifr_addr;
- if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
+ sin4 = (struct sockaddr_in *)&lifr->lifr_addr;
+ if (inet_ntop(AF_INET, &sin4->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET mask for %s", lifr->lifr_name);
continue;
@@ -658,7 +654,7 @@ get_net_ifs(char **addrinfo_out)
{
struct ifconf ifconf;
struct ifreq *ifr;
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin4;
# ifdef HAVE_STRUCT_IN6_ADDR
struct sockaddr_in6 *sin6;
# endif
@@ -772,13 +768,13 @@ get_net_ifs(char **addrinfo_out)
/* Store the address. */
switch (family) {
case AF_INET:
- sin = (struct sockaddr_in *)&ifr->ifr_addr;
- if (sin->sin_addr.s_addr == INADDR_ANY || sin->sin_addr.s_addr == INADDR_NONE) {
+ sin4 = (struct sockaddr_in *)&ifr->ifr_addr;
+ if (sin4->sin_addr.s_addr == INADDR_ANY || sin4->sin_addr.s_addr == INADDR_NONE) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring unspecified AF_INET addr for %s", ifr->ifr_name);
continue;
}
- if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
+ if (inet_ntop(AF_INET, &sin4->sin_addr, addrstr, sizeof(addrstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET addr for %s", ifr->ifr_name);
continue;
@@ -828,8 +824,8 @@ get_net_ifs(char **addrinfo_out)
/* Convert the mask to string form. */
switch (family) {
case AF_INET:
- sin = (struct sockaddr_in *)&ifr->ifr_addr;
- if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
+ sin4 = (struct sockaddr_in *)&ifr->ifr_addr;
+ if (inet_ntop(AF_INET, &sin4->sin_addr, maskstr, sizeof(maskstr)) == NULL) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"ignoring bad AF_INET mask for %s", ifr->ifr_name);
continue;
diff --git a/src/parse_args.c b/src/parse_args.c
index 7a8da9209..56f207e8f 100644
--- a/src/parse_args.c
+++ b/src/parse_args.c
@@ -47,8 +47,9 @@ int tgetpass_flags;
/*
* Local functions.
*/
-static void help(void) __attribute__((__noreturn__));
-static void usage_excl(void) __attribute__((__noreturn__));
+static sudo_noreturn void help(void);
+static sudo_noreturn void usage_excl(void);
+static sudo_noreturn void usage_excl_ticket(void);
/*
* Mapping of command line flags to name/value settings.
@@ -63,6 +64,7 @@ static struct sudo_settings sudo_settings[] = {
{ "run_shell" },
{ "login_shell" },
{ "ignore_ticket" },
+ { "update_ticket" },
{ "prompt" },
{ "selinux_role" },
{ "selinux_type" },
@@ -111,8 +113,8 @@ struct environment {
* There is a more limited set of options for sudoedit (the sudo-specific
* long options are listed first).
*/
-static const char sudo_short_opts[] = "+Aa:BbC:c:D:Eeg:Hh::iKklnPp:R:r:SsT:t:U:u:Vv";
-static const char edit_short_opts[] = "+Aa:BC:c:D:g:h::knp:R:r:ST:t:u:V";
+static const char sudo_short_opts[] = "+Aa:BbC:c:D:Eeg:Hh::iKklNnPp:R:r:SsT:t:U:u:Vv";
+static const char edit_short_opts[] = "+Aa:BC:c:D:g:h::KkNnp:R:r:ST:t:u:V";
static struct option sudo_long_opts[] = {
/* sudo-specific long options */
{ "background", no_argument, NULL, 'b' },
@@ -137,6 +139,7 @@ static struct option sudo_long_opts[] = {
{ "help", no_argument, NULL, 'h' },
{ "host", required_argument, NULL, OPT_HOSTNAME },
{ "reset-timestamp", no_argument, NULL, 'k' },
+ { "no-update", no_argument, NULL, 'N' },
{ "non-interactive", no_argument, NULL, 'n' },
{ "prompt", required_argument, NULL, 'p' },
{ "chroot", required_argument, NULL, 'R' },
@@ -403,15 +406,16 @@ parse_args(int argc, char **argv, int *old_optind, int *nargc, char ***nargv,
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();
mode = MODE_KILL;
valid_flags = 0;
+ FALLTHROUGH;
+ case 'k':
+ if (sudo_settings[ARG_UPDATE_TICKET].value != NULL)
+ usage_excl_ticket();
+ sudo_settings[ARG_IGNORE_TICKET].value = "true";
break;
case 'l':
if (mode) {
@@ -423,6 +427,11 @@ parse_args(int argc, char **argv, int *old_optind, int *nargc, char ***nargv,
mode = MODE_LIST;
valid_flags = LIST_VALID_FLAGS;
break;
+ case 'N':
+ if (sudo_settings[ARG_IGNORE_TICKET].value != NULL)
+ usage_excl_ticket();
+ sudo_settings[ARG_UPDATE_TICKET].value = "false";
+ break;
case 'n':
SET(flags, MODE_NONINTERACTIVE);
sudo_settings[ARG_NONINTERACTIVE].value = "true";
@@ -597,6 +606,7 @@ parse_args(int argc, char **argv, int *old_optind, int *nargc, char ***nargv,
/*
* For shell mode we need to rewrite argv
+ * TODO: move this to the policy plugin and make escaping configurable
*/
if (ISSET(flags, MODE_SHELL|MODE_LOGIN_SHELL) && ISSET(mode, MODE_RUN)) {
char **av, *cmnd = NULL;
@@ -638,7 +648,7 @@ parse_args(int argc, char **argv, int *old_optind, int *nargc, char ***nargv,
av[0] = (char *)user_details.shell; /* plugin may override shell */
if (cmnd != NULL) {
- av[1] = "-c";
+ av[1] = (char *)"-c";
av[2] = cmnd;
}
av[ac] = NULL;
@@ -662,7 +672,7 @@ parse_args(int argc, char **argv, int *old_optind, int *nargc, char ***nargv,
exit(EXIT_FAILURE);
/* Must have the command in argv[0]. */
- av[0] = "sudoedit";
+ av[0] = (char *)"sudoedit";
for (ac = 0; argv[ac] != NULL; ac++) {
av[ac + 1] = argv[ac];
}
@@ -702,7 +712,7 @@ static void
display_usage(int (*output)(const char *))
{
struct sudo_lbuf lbuf;
- char *uvec[6];
+ const char *uvec[6];
int i, ulen;
/*
@@ -758,6 +768,19 @@ usage_excl(void)
usage();
}
+/*
+ * Tell which options are mutually exclusive and exit.
+ */
+static void
+usage_excl_ticket(void)
+{
+ debug_decl(usage_excl_ticket, SUDO_DEBUG_ARGS);
+
+ sudo_warnx("%s",
+ U_("Only one of the -K, -k or -N options may be specified"));
+ usage();
+}
+
static void
help(void)
{
diff --git a/src/preload.c b/src/preload.c
index 250ee7efb..5bfd9fd87 100644
--- a/src/preload.c
+++ b/src/preload.c
@@ -34,15 +34,15 @@
# endif
#endif
-#include "sudo_plugin.h"
-#include "sudo_compat.h"
+#include "sudo.h"
#include "sudo_dso.h"
+#include "sudo_plugin.h"
#ifdef STATIC_SUDOERS_PLUGIN
extern struct policy_plugin sudoers_policy;
extern struct io_plugin sudoers_io;
-extern struct io_plugin sudoers_audit;
+extern struct audit_plugin sudoers_audit;
static struct sudo_preload_symbol sudo_rtld_default_symbols[] = {
# ifdef HAVE_GSS_KRB5_CCACHE_NAME
diff --git a/src/regress/intercept/test_ptrace.c b/src/regress/intercept/test_ptrace.c
index 36b52eef4..e31e3c047 100644
--- a/src/regress/intercept/test_ptrace.c
+++ b/src/regress/intercept/test_ptrace.c
@@ -82,16 +82,16 @@ init_debug_files(struct sudo_conf_debug_file_list *file_list,
case 0:
debug_return;
case 1:
- file->debug_flags = "exec@diag";
+ file->debug_flags = (char *)"exec@diag";
break;
case 2:
- file->debug_flags = "exec@info";
+ file->debug_flags = (char *)"exec@info";
break;
default:
- file->debug_flags = "exec@debug";
+ file->debug_flags = (char *)"exec@debug";
break;
}
- file->debug_file = "/dev/stderr";
+ file->debug_file = (char *)"/dev/stderr";
TAILQ_INSERT_HEAD(file_list, file, entries);
debug_return;
@@ -219,7 +219,7 @@ main(int argc, char *argv[])
} else if (WIFSTOPPED(status)) {
if (exec_ptrace_stopped(pid, status, &closure)) {
if (pid == child) {
- suspend_sudo_nopty(WSTOPSIG(status), ppgrp, child);
+ suspend_sudo_nopty(NULL, WSTOPSIG(status), ppgrp, child);
if (kill(child, SIGCONT) != 0)
sudo_warn("kill(%d, SIGCONT)", (int)child);
}
diff --git a/src/regress/noexec/check_noexec.c b/src/regress/noexec/check_noexec.c
index 9e24bc0ec..4e0a402e8 100644
--- a/src/regress/noexec/check_noexec.c
+++ b/src/regress/noexec/check_noexec.c
@@ -39,12 +39,12 @@
#include "sudo_compat.h"
#include "sudo_fatal.h"
#include "sudo_util.h"
+#include "sudo_queue.h"
#include "sudo_exec.h"
static bool verbose;
sudo_dso_public int main(int argc, char *argv[], char *envp[]);
-static void usage(void) __attribute__((__noreturn__));
static bool
report_status(int status, const char *what)
@@ -179,7 +179,7 @@ try_wordexp(void)
}
#endif
-static void
+static sudo_noreturn void
usage(void)
{
fprintf(stderr, "usage: %s [-v] rexec | /path/to/sudo_noexec.so\n",
@@ -210,7 +210,7 @@ main(int argc, char *argv[], char *envp[])
/* Disable execution for post-exec and re-exec ourself. */
if (strcmp(argv[optind], "rexec") != 0) {
const char *noexec = argv[optind];
- argv[optind] = "rexec";
+ argv[optind] = (char *)"rexec";
execve(argv[0], argv, disable_execute(envp, noexec));
sudo_fatalx_nodebug("execve");
}
diff --git a/src/selinux.c b/src/selinux.c
index 2326326ef..50455f4d0 100644
--- a/src/selinux.c
+++ b/src/selinux.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2009-2016 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws>
* Copyright (c) 2008 Dan Walsh <dwalsh@redhat.com>
*
* Borrowed heavily from newrole source code
@@ -440,11 +440,11 @@ selinux_setexeccon(void)
void
selinux_execve(int fd, const char *path, char *const argv[], char *envp[],
- int flags)
+ const char *rundir, int flags)
{
char **nargv;
const char *sesh;
- int argc, nargc, serrno;
+ int argc, len, nargc, serrno;
debug_decl(selinux_execve, SUDO_DEBUG_SELINUX);
sesh = sudo_conf_sesh_path();
@@ -460,8 +460,6 @@ selinux_execve(int fd, const char *path, char *const argv[], char *envp[],
/*
* 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;
@@ -469,26 +467,44 @@ selinux_execve(int fd, const char *path, char *const argv[], char *envp[],
errno = EINVAL;
debug_return;
}
- nargv = reallocarray(NULL, argc + 3, sizeof(char *));
+ nargv = reallocarray(NULL, 5 + argc + 1, sizeof(char *));
if (nargv == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
debug_return;
}
+ if (*argv[0] == '-')
+ nargv[0] = (char *)"-sesh";
+ else
+ nargv[0] = (char *)"sesh";
+ nargc = 1;
+ if (ISSET(flags, CD_RBAC_SET_CWD)) {
+ const char *prefix = ISSET(flags, CD_CWD_OPTIONAL) ? "+" : "";
+ if (rundir == NULL) {
+ sudo_warnx("internal error: sesh rundir not set");
+ errno = EINVAL;
+ debug_return;
+ }
+ len = asprintf(&nargv[nargc++], "--directory=%s%s", prefix, rundir);
+ if (len == -1) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ debug_return;
+ }
+ }
+ if (fd != -1) {
+ len = asprintf(&nargv[nargc++], "--execfd=%d", fd);
+ if (len == -1) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ debug_return;
+ }
+ }
if (ISSET(flags, CD_NOEXEC)) {
- nargv[0] = *argv[0] == '-' ? "-sesh-noexec" : "sesh-noexec";
CLR(flags, CD_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 *)"--noexec";
}
+ nargv[nargc++] = (char *)"--";
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, -1, flags);
serrno = errno;
free(nargv);
diff --git a/src/sesh.c b/src/sesh.c
index f05762ffb..314ceb98f 100644
--- a/src/sesh.c
+++ b/src/sesh.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2008, 2010-2018, 2020-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2008, 2010-2018, 2020-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -38,14 +38,48 @@
#else
# include "compat/stdbool.h"
#endif /* HAVE_STDBOOL_H */
+#ifdef HAVE_GETOPT_LONG
+# include <getopt.h>
+# else
+# include "compat/getopt.h"
+#endif /* HAVE_GETOPT_LONG */
#include "sudo.h"
#include "sudo_exec.h"
#include "sudo_edit.h"
+enum sesh_mode {
+ SESH_RUN_COMMAND,
+ SESH_EDIT_CREATE,
+ SESH_EDIT_INSTALL
+};
+
+static const char short_opts[] = "+cd:e:ihnw:";
+static struct option long_opts[] = {
+ { "edit-create", no_argument, NULL, 'c' },
+ { "directory", required_argument, NULL, 'd' },
+ { "execfd", required_argument, NULL, 'e' },
+ { "edit-install", no_argument, NULL, 'i' },
+ { "no-dereference", no_argument, NULL, 'h' },
+ { "noexec", no_argument, NULL, 'n' },
+ { "edit-checkdir", required_argument, NULL, 'w' },
+ { NULL, no_argument, NULL, '\0' },
+};
+
sudo_dso_public int main(int argc, char *argv[], char *envp[]);
-static int sesh_sudoedit(int argc, char *argv[]);
+static int sesh_sudoedit(enum sesh_mode mode, int flags, char *user, int argc,
+ char *argv[]);
+
+sudo_noreturn void
+usage(void)
+{
+ (void)fprintf(stderr,
+ "usage: %s [-n] [-d directory] [-e fd] command [...]\n"
+ " %s [-cih] [-w uid:gids] file [...]\n",
+ getprogname(), getprogname());
+ exit(EXIT_FAILURE);
+}
/*
* Exit codes defined in sudo_exec.h:
@@ -59,7 +93,11 @@ static int sesh_sudoedit(int argc, char *argv[]);
int
main(int argc, char *argv[], char *envp[])
{
- int ret;
+ enum sesh_mode mode = SESH_RUN_COMMAND;
+ const char *errstr, *rundir = NULL;
+ int flags = CD_SUDOEDIT_FOLLOW;
+ char *edit_user = NULL;
+ int ch, ret, fd = -1;
debug_decl(main, SUDO_DEBUG_MAIN);
initprogname(argc > 0 ? argv[0] : "sesh");
@@ -68,8 +106,55 @@ main(int argc, char *argv[], char *envp[])
bindtextdomain(PACKAGE_NAME, LOCALEDIR);
textdomain(PACKAGE_NAME);
- if (argc < 2)
- sudo_fatalx("%s", U_("requires at least one argument"));
+ while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) {
+ switch (ch) {
+ case 'c':
+ if (mode != SESH_RUN_COMMAND) {
+ sudo_warnx("%s",
+ U_("Only one of the -c or -i options may be specified"));
+ usage();
+ }
+ mode = SESH_EDIT_CREATE;
+ break;
+ case 'd':
+ rundir = optarg;
+ if (*rundir == '+') {
+ SET(flags, CD_CWD_OPTIONAL);
+ rundir++;
+ }
+ break;
+ case 'e':
+ fd = sudo_strtonum(optarg, 0, INT_MAX, &errstr);
+ if (errstr != NULL)
+ sudo_fatalx(U_("invalid file descriptor number: %s"), optarg);
+ break;
+ case 'i':
+ if (mode != SESH_RUN_COMMAND) {
+ sudo_warnx("%s",
+ U_("Only one of the -c or -i options may be specified"));
+ usage();
+ }
+ mode = SESH_EDIT_INSTALL;
+ break;
+ case 'h':
+ CLR(flags, CD_SUDOEDIT_FOLLOW);
+ break;
+ case 'n':
+ SET(flags, CD_NOEXEC);
+ break;
+ case 'w':
+ SET(flags, CD_SUDOEDIT_CHECKDIR);
+ edit_user = optarg;
+ break;
+ default:
+ usage();
+ break;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ if (argc == 0)
+ usage();
/* Read sudo.conf and initialize the debug subsystem. */
if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1)
@@ -77,47 +162,56 @@ main(int argc, char *argv[], char *envp[])
sudo_debug_register(getprogname(), NULL, NULL,
sudo_conf_debug_files(getprogname()), -1);
- if (strcmp(argv[1], "-e") == 0) {
- ret = sesh_sudoedit(argc, argv);
+ if (mode != SESH_RUN_COMMAND) {
+ if (rundir != NULL) {
+ sudo_warnx(U_("The -%c option may not be used in edit mode."), 'd');
+ usage();
+ }
+ if (fd != -1) {
+ sudo_warnx(U_("The -%c option may not be used in edit mode."), 'e');
+ usage();
+ }
+ if (ISSET(flags, CD_NOEXEC)) {
+ sudo_warnx(U_("The -%c option may not be used in edit mode."), 'n');
+ usage();
+ }
+ ret = sesh_sudoedit(mode, flags, edit_user, argc, argv);
} else {
bool login_shell;
- char *cp, *cmnd;
- int flags = 0;
- int fd = -1;
+ char *cmnd;
- /* 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]) {
- if (strcmp(cp, "-noexec") == 0)
- SET(flags, CD_NOEXEC);
+ if (!ISSET(flags, CD_SUDOEDIT_FOLLOW)) {
+ sudo_warnx(U_("The -%c option may only be used in edit mode."),
+ 'h');
+ usage();
+ }
+ if (edit_user != NULL) {
+ sudo_warnx(U_("The -%c option may only be used in edit mode."),
+ 'w');
+ usage();
}
- /* If argv[1] is --execfd=%d, extract the fd to exec with. */
- if (strncmp(argv[1], "--execfd=", 9) == 0) {
- const char *errstr;
+ /* If the first char of argv[0] is '-', we are running a login shell. */
+ login_shell = argv[0][0] == '-';
- 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--;
+ /* We must change the directory in sesh after the context changes. */
+ if (rundir != NULL && chdir(rundir) == -1) {
+ sudo_warnx(U_("unable to change directory to %s"), rundir);
+ if (!ISSET(flags, CD_CWD_OPTIONAL))
+ exit(EXIT_FAILURE);
}
- /* Shift argv and make a copy of the command to execute. */
- argv++;
- argc--;
+ /* Make a copy of the command to execute. */
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;
+ char *cp = strrchr(argv[0], '/');
+ if (cp != NULL) {
+ *cp = '-';
+ argv[0] = cp;
+ }
}
sudo_execve(fd, cmnd, argv, envp, -1, flags);
sudo_warn(U_("unable to execute %s"), cmnd);
@@ -337,59 +431,25 @@ sesh_edit_copy_tfiles(int edit_flags, struct sudo_cred *user_cred,
}
static int
-sesh_sudoedit(int argc, char *argv[])
+sesh_sudoedit(enum sesh_mode mode, int flags, char *user,
+ int argc, char *argv[])
{
- int edit_flags, post, ret;
struct sudo_cred user_cred, run_cred;
+ int ret;
debug_decl(sesh_sudoedit, SUDO_DEBUG_EDIT);
memset(&user_cred, 0, sizeof(user_cred));
memset(&run_cred, 0, sizeof(run_cred));
- edit_flags = CD_SUDOEDIT_FOLLOW;
-
- /* Check for -h flag (don't follow links). */
- if (argc > 2 && strcmp(argv[2], "-h") == 0) {
- argv++;
- argc--;
- CLR(edit_flags, CD_SUDOEDIT_FOLLOW); // -V753
- }
-
- /* Check for -w flag (disallow directories writable by the user). */
- if (argc > 2 && strcmp(argv[2], "-w") == 0) {
- SET(edit_flags, CD_SUDOEDIT_CHECKDIR);
-
- /* Parse uid:gid:gid1,gid2,... */
- if (argv[3] == NULL || !parse_user(argv[3], &user_cred))
- debug_return_int(SESH_ERR_FAILURE);
- argv += 2;
- argc -= 2;
- }
- if (argc < 3)
+ /* Parse user for -w option, "uid:gid:gid1,gid2,..." */
+ if (user != NULL && !parse_user(user, &user_cred))
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 beginning of the file list. */
- argv += 3;
- argc -= 3;
-
- /* no files specified, nothing to do */
+ /* No files specified, nothing to do. */
if (argc == 0)
debug_return_int(SESH_SUCCESS);
- /* odd number of paths specified */
+
+ /* Odd number of paths specified. */
if (argc & 1)
debug_return_int(SESH_ERR_BAD_PATHS);
@@ -422,8 +482,8 @@ sesh_sudoedit(int argc, char *argv[])
run_cred.groups = NULL;
}
- ret = post ?
- sesh_edit_copy_tfiles(edit_flags, &user_cred, &run_cred, argc, argv) :
- sesh_edit_create_tfiles(edit_flags, &user_cred, &run_cred, argc, argv);
+ ret = mode == SESH_EDIT_CREATE ?
+ sesh_edit_create_tfiles(flags, &user_cred, &run_cred, argc, argv) :
+ sesh_edit_copy_tfiles(flags, &user_cred, &run_cred, argc, argv);
debug_return_int(ret);
}
diff --git a/src/sudo.c b/src/sudo.c
index 4f0f8fa35..18beb1bd8 100644
--- a/src/sudo.c
+++ b/src/sudo.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -696,15 +696,7 @@ command_info_to_details(char * const info[], struct command_details *details)
SET_STRING("chroot=", chroot)
SET_STRING("command=", command)
SET_STRING("cwd=", cwd)
- if (strncmp("cwd_optional=", info[i], sizeof("cwd_optional=") - 1) == 0) {
- cp = info[i] + sizeof("cwd_optional=") - 1;
- details->cwd_optional = sudo_strtobool(cp);
- if (details->cwd_optional == -1) {
- errno = EINVAL;
- sudo_fatal("%s", info[i]);
- }
- break;
- }
+ SET_FLAG("cwd_optional=", CD_CWD_OPTIONAL)
if (strncmp("closefrom=", info[i], sizeof("closefrom=") - 1) == 0) {
cp = info[i] + sizeof("closefrom=") - 1;
details->closefrom = sudo_strtonum(cp, 0, INT_MAX, &errstr);
@@ -734,6 +726,7 @@ command_info_to_details(char * const info[], struct command_details *details)
break;
case 'i':
SET_FLAG("intercept=", CD_INTERCEPT)
+ SET_FLAG("intercept_verify=", CD_INTERCEPT_VERIFY)
break;
case 'l':
SET_STRING("login_class=", login_class)
@@ -1021,6 +1014,19 @@ run_command(struct command_details *details)
cstat.type = CMD_INVALID;
cstat.val = 0;
+ if (details->command == NULL) {
+ sudo_warnx("%s", U_("command not set by the security policy"));
+ debug_return_int(status);
+ }
+ if (details->argv == NULL) {
+ sudo_warnx("%s", U_("argv not set by the security policy"));
+ debug_return_int(status);
+ }
+ if (details->envp == NULL) {
+ sudo_warnx("%s", U_("envp not set by the security policy"));
+ debug_return_int(status);
+ }
+
sudo_execute(details, &cstat);
switch (cstat.type) {
@@ -1059,6 +1065,12 @@ format_plugin_settings(struct plugin_container *plugin)
unsigned int i = 0;
debug_decl(format_plugin_settings, SUDO_DEBUG_PCOMM);
+ /* We update the ticket entry by default. */
+ if (sudo_settings[ARG_IGNORE_TICKET].value == NULL &&
+ sudo_settings[ARG_UPDATE_TICKET].value == NULL) {
+ sudo_settings[ARG_UPDATE_TICKET].value = "true";
+ }
+
/* Determine sudo_settings array size (including plugin_path and NULL) */
plugin_settings_size = 2;
for (setting = sudo_settings; setting->name != NULL; setting++)
@@ -1246,7 +1258,7 @@ policy_list(int argc, char * const argv[], int verbose, const char *user)
{
const char *errstr = NULL;
/* TODO: add list_user */
- char * const command_info[] = {
+ const char * const command_info[] = {
"command=list",
NULL
};
@@ -1264,17 +1276,17 @@ policy_list(int argc, char * const argv[], int verbose, const char *user)
switch (ok) {
case 1:
audit_accept(policy_plugin.name, SUDO_POLICY_PLUGIN,
- command_info, argv, submit_envp);
+ (char **)command_info, argv, submit_envp);
break;
case 0:
audit_reject(policy_plugin.name, SUDO_POLICY_PLUGIN,
errstr ? errstr : _("command rejected by policy"),
- command_info);
+ (char **)command_info);
break;
default:
audit_error(policy_plugin.name, SUDO_POLICY_PLUGIN,
errstr ? errstr : _("policy plugin error"),
- command_info);
+ (char **)command_info);
break;
}
@@ -1290,7 +1302,7 @@ static void
policy_validate(char * const argv[])
{
const char *errstr = NULL;
- char * const command_info[] = {
+ const char * const command_info[] = {
"command=validate",
NULL
};
@@ -1307,18 +1319,18 @@ policy_validate(char * const argv[])
switch (ok) {
case 1:
- audit_accept(policy_plugin.name, SUDO_POLICY_PLUGIN, command_info,
- argv, submit_envp);
+ audit_accept(policy_plugin.name, SUDO_POLICY_PLUGIN,
+ (char **)command_info, argv, submit_envp);
break;
case 0:
audit_reject(policy_plugin.name, SUDO_POLICY_PLUGIN,
errstr ? errstr : _("command rejected by policy"),
- command_info);
+ (char **)command_info);
break;
default:
audit_error(policy_plugin.name, SUDO_POLICY_PLUGIN,
errstr ? errstr : _("policy plugin error"),
- command_info);
+ (char **)command_info);
break;
}
diff --git a/src/sudo.h b/src/sudo.h
index aa018ccd6..bbf874fc8 100644
--- a/src/sudo.h
+++ b/src/sudo.h
@@ -84,27 +84,28 @@
#define ARG_USER_SHELL 5
#define ARG_LOGIN_SHELL 6
#define ARG_IGNORE_TICKET 7
-#define ARG_PROMPT 8
-#define ARG_SELINUX_ROLE 9
-#define ARG_SELINUX_TYPE 10
-#define ARG_RUNAS_USER 11
-#define ARG_PROGNAME 12
-#define ARG_IMPLIED_SHELL 13
-#define ARG_PRESERVE_GROUPS 14
-#define ARG_NONINTERACTIVE 15
-#define ARG_SUDOEDIT 16
-#define ARG_CLOSEFROM 17
-#define ARG_NET_ADDRS 18
-#define ARG_MAX_GROUPS 19
-#define ARG_PLUGIN_DIR 20
-#define ARG_REMOTE_HOST 21
-#define ARG_TIMEOUT 22
-#define ARG_CHROOT 23
-#define ARG_CWD 24
-#define ARG_ASKPASS 25
-#define ARG_INTERCEPT_SETID 26
-#define ARG_INTERCEPT_PTRACE 27
-#define ARG_APPARMOR_PROFILE 28
+#define ARG_UPDATE_TICKET 8
+#define ARG_PROMPT 9
+#define ARG_SELINUX_ROLE 10
+#define ARG_SELINUX_TYPE 11
+#define ARG_RUNAS_USER 12
+#define ARG_PROGNAME 13
+#define ARG_IMPLIED_SHELL 14
+#define ARG_PRESERVE_GROUPS 15
+#define ARG_NONINTERACTIVE 16
+#define ARG_SUDOEDIT 17
+#define ARG_CLOSEFROM 18
+#define ARG_NET_ADDRS 19
+#define ARG_MAX_GROUPS 20
+#define ARG_PLUGIN_DIR 21
+#define ARG_REMOTE_HOST 22
+#define ARG_TIMEOUT 23
+#define ARG_CHROOT 24
+#define ARG_CWD 25
+#define ARG_ASKPASS 26
+#define ARG_INTERCEPT_SETID 27
+#define ARG_INTERCEPT_PTRACE 28
+#define ARG_APPARMOR_PROFILE 29
/*
* Flags for tgetpass()
@@ -149,30 +150,33 @@ struct user_details {
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_INTERCEPT 0x000020
-#define CD_NOEXEC 0x000040
-#define CD_SET_PRIORITY 0x000080
-#define CD_SET_UMASK 0x000100
-#define CD_SET_TIMEOUT 0x000200
-#define CD_SUDOEDIT 0x000400
-#define CD_BACKGROUND 0x000800
-#define CD_RBAC_ENABLED 0x001000
-#define CD_USE_PTY 0x002000
-#define CD_SET_UTMP 0x004000
-#define CD_EXEC_BG 0x008000
-#define CD_SUDOEDIT_FOLLOW 0x010000
-#define CD_SUDOEDIT_CHECKDIR 0x020000
-#define CD_SET_GROUPS 0x040000
-#define CD_LOGIN_SHELL 0x080000
-#define CD_OVERRIDE_UMASK 0x100000
-#define CD_LOG_SUBCMDS 0x200000
-#define CD_USE_PTRACE 0x400000
-#define CD_FEXECVE 0x800000
+#define CD_SET_UID 0x00000001
+#define CD_SET_EUID 0x00000002
+#define CD_SET_GID 0x00000004
+#define CD_SET_EGID 0x00000008
+#define CD_PRESERVE_GROUPS 0x00000010
+#define CD_INTERCEPT 0x00000020
+#define CD_NOEXEC 0x00000040
+#define CD_SET_PRIORITY 0x00000080
+#define CD_SET_UMASK 0x00000100
+#define CD_SET_TIMEOUT 0x00000200
+#define CD_SUDOEDIT 0x00000400
+#define CD_BACKGROUND 0x00000800
+#define CD_RBAC_ENABLED 0x00001000
+#define CD_USE_PTY 0x00002000
+#define CD_SET_UTMP 0x00004000
+#define CD_EXEC_BG 0x00008000
+#define CD_SUDOEDIT_FOLLOW 0x00010000
+#define CD_SUDOEDIT_CHECKDIR 0x00020000
+#define CD_SET_GROUPS 0x00040000
+#define CD_LOGIN_SHELL 0x00080000
+#define CD_OVERRIDE_UMASK 0x00100000
+#define CD_LOG_SUBCMDS 0x00200000
+#define CD_USE_PTRACE 0x00400000
+#define CD_FEXECVE 0x00800000
+#define CD_INTERCEPT_VERIFY 0x01000000
+#define CD_RBAC_SET_CWD 0x02000000
+#define CD_CWD_OPTIONAL 0x04000000
struct preserved_fd {
TAILQ_ENTRY(preserved_fd) entries;
@@ -190,7 +194,6 @@ struct command_details {
int closefrom;
int flags;
int execfd;
- int cwd_optional;
struct preserved_fd_list preserved_fds;
struct passwd *pw;
const char *command;
@@ -274,7 +277,7 @@ extern int sudo_debug_instance;
int sudo_edit(struct command_details *details);
/* parse_args.c */
-void usage(void) __attribute__((__noreturn__));
+sudo_noreturn void usage(void);
/* openbsd.c */
int os_init_openbsd(int argc, char *argv[], char *envp[]);
@@ -286,7 +289,7 @@ int selinux_relabel_tty(const char *ttyn, int ttyfd);
int selinux_restore_tty(void);
int selinux_setexeccon(void);
void selinux_execve(int fd, const char *path, char *const argv[],
- char *envp[], int flags);
+ char *envp[], const char *rundir, int flags);
/* apparmor.c */
int apparmor_is_enabled(void);
@@ -335,7 +338,7 @@ void parse_preserved_fds(struct preserved_fd_list *pfds, const char *fdstr);
int tcsetpgrp_nobg(int fd, pid_t pgrp_id);
/* limits.c */
-void disable_coredump();
+void disable_coredump(void);
void restore_limits(void);
void restore_nproc(void);
void set_policy_rlimits(void);
diff --git a/src/sudo_edit.c b/src/sudo_edit.c
index 2720ae7f2..c62644e07 100644
--- a/src/sudo_edit.c
+++ b/src/sudo_edit.c
@@ -414,7 +414,8 @@ static int
selinux_edit_create_tfiles(struct command_details *command_details,
struct tempfile *tf, char *files[], int nfiles)
{
- char **sesh_args, **sesh_ap, *user_str = NULL;
+ const char **sesh_args, **sesh_ap;
+ char *user_str = NULL;
int i, error, sesh_nargs, ret = -1;
struct stat sb;
debug_decl(selinux_edit_create_tfiles, SUDO_DEBUG_EDIT);
@@ -422,7 +423,6 @@ selinux_edit_create_tfiles(struct command_details *command_details,
if (nfiles < 1)
debug_return_int(0);
- /* Construct common args for sesh */
sesh_nargs = 6 + (nfiles * 2) + 1;
sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *));
if (sesh_args == NULL) {
@@ -430,18 +430,18 @@ selinux_edit_create_tfiles(struct command_details *command_details,
goto done;
}
*sesh_ap++ = "sesh";
- *sesh_ap++ = "-e";
+ *sesh_ap++ = "--edit-create";
if (!ISSET(command_details->flags, CD_SUDOEDIT_FOLLOW))
- *sesh_ap++ = "-h";
+ *sesh_ap++ = "--no-dereference";
if (ISSET(command_details->flags, CD_SUDOEDIT_CHECKDIR)) {
if ((user_str = selinux_fmt_sudo_user()) == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done;
}
- *sesh_ap++ = "-w";
+ *sesh_ap++ = "--edit-checkdir";
*sesh_ap++ = user_str;
}
- *sesh_ap++ = "0";
+ *sesh_ap++ = "--";
for (i = 0; i < nfiles; i++) {
char *tfile, *ofile = files[i];
@@ -470,10 +470,10 @@ selinux_edit_create_tfiles(struct command_details *command_details,
}
*sesh_ap = NULL;
- /* Run sesh -e [-h] 0 <o1> <t1> ... <on> <tn> */
- error = selinux_run_helper(command_details->cred.uid, command_details->cred.gid,
- command_details->cred.ngroups, command_details->cred.groups, sesh_args,
- command_details->envp);
+ /* Run sesh -c [-h] [-w userstr] <o1> <t1> ... <on> <tn> */
+ error = selinux_run_helper(command_details->cred.uid,
+ command_details->cred.gid, command_details->cred.ngroups,
+ command_details->cred.groups, (char **)sesh_args, command_details->envp);
switch (error) {
case SESH_SUCCESS:
break;
@@ -520,7 +520,9 @@ static int
selinux_edit_copy_tfiles(struct command_details *command_details,
struct tempfile *tf, int nfiles, struct timespec *times)
{
- char **sesh_args, **sesh_ap, *user_str = NULL;
+ const char **sesh_args, **sesh_ap;
+ char *user_str = NULL;
+ bool run_helper = false;
int i, error, sesh_nargs, ret = 1;
int tfd = -1;
struct timespec ts;
@@ -530,9 +532,6 @@ selinux_edit_copy_tfiles(struct command_details *command_details,
if (nfiles < 1)
debug_return_int(0);
- const int check_dir = ISSET(command_details->flags, CD_SUDOEDIT_CHECKDIR);
-
- /* Construct common args for sesh */
sesh_nargs = 5 + (nfiles * 2) + 1;
sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *));
if (sesh_args == NULL) {
@@ -540,18 +539,17 @@ selinux_edit_copy_tfiles(struct command_details *command_details,
goto done;
}
*sesh_ap++ = "sesh";
- *sesh_ap++ = "-e";
- if (check_dir) {
+ *sesh_ap++ = "--edit-install";
+ if (ISSET(command_details->flags, CD_SUDOEDIT_CHECKDIR)) {
if ((user_str = selinux_fmt_sudo_user()) == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done;
}
- *sesh_ap++ = "-w";
+ *sesh_ap++ = "--edit-checkdir";
*sesh_ap++ = user_str;
}
- *sesh_ap++ = "1";
+ *sesh_ap++ = "--";
- /* Construct args for sesh -e 1 */
for (i = 0; i < nfiles; i++) {
if (tfd != -1)
close(tfd);
@@ -573,6 +571,7 @@ selinux_edit_copy_tfiles(struct command_details *command_details,
continue;
}
}
+ run_helper = true;
*sesh_ap++ = tf[i].tfile;
*sesh_ap++ = tf[i].ofile;
if (fchown(tfd, command_details->cred.uid, command_details->cred.gid) != 0) {
@@ -581,40 +580,37 @@ selinux_edit_copy_tfiles(struct command_details *command_details,
}
}
*sesh_ap = NULL;
- if (tfd != -1)
- close(tfd);
- /*
- * check dir adds two more args to the array
- */
- if ((!check_dir && sesh_ap - sesh_args > 3)
- || (check_dir && sesh_ap - sesh_args > 5)) {
- /* Run sesh -e 1 <t1> <o1> ... <tn> <on> */
- error = selinux_run_helper(command_details->cred.uid, command_details->cred.gid,
- command_details->cred.ngroups, command_details->cred.groups, sesh_args,
- command_details->envp);
- switch (error) {
- case SESH_SUCCESS:
- ret = 0;
- break;
- case SESH_ERR_NO_FILES:
- sudo_warnx("%s",
- U_("unable to copy temporary files back to their original location"));
- break;
- case SESH_ERR_SOME_FILES:
- sudo_warnx("%s",
- U_("unable to copy some of the temporary files back to their original location"));
- break;
- case SESH_ERR_KILLED:
- sudo_warnx("%s", U_("sesh: killed by a signal"));
- break;
- default:
- sudo_warnx(U_("sesh: unknown error %d"), error);
- break;
- }
+ if (!run_helper)
+ goto done;
+
+ /* Run sesh -i <t1> <o1> ... <tn> <on> */
+ error = selinux_run_helper(command_details->cred.uid,
+ command_details->cred.gid, command_details->cred.ngroups,
+ command_details->cred.groups, (char **)sesh_args, command_details->envp);
+ switch (error) {
+ case SESH_SUCCESS:
+ ret = 0;
+ break;
+ case SESH_ERR_NO_FILES:
+ sudo_warnx("%s",
+ U_("unable to copy temporary files back to their original location"));
+ break;
+ case SESH_ERR_SOME_FILES:
+ sudo_warnx("%s",
+ U_("unable to copy some of the temporary files back to their original location"));
+ break;
+ case SESH_ERR_KILLED:
+ sudo_warnx("%s", U_("sesh: killed by a signal"));
+ break;
+ default:
+ sudo_warnx(U_("sesh: unknown error %d"), error);
+ break;
}
done:
+ if (tfd != -1)
+ close(tfd);
/* Contents of tf will be freed by caller. */
free(sesh_args);
free(user_str);
diff --git a/src/sudo_exec.h b/src/sudo_exec.h
index 2f099a332..a75d6f17f 100644
--- a/src/sudo_exec.h
+++ b/src/sudo_exec.h
@@ -27,6 +27,13 @@
#endif
/*
+ * Linux-specific wait flag used with ptrace(2).
+ */
+#ifndef __WALL
+# define __WALL 0
+#endif
+
+/*
* Some older systems support siginfo but predate SI_USER.
*/
#ifdef SI_USER
@@ -35,8 +42,66 @@
# define USER_SIGNALED(_info) ((_info) != NULL && (_info)->si_code <= 0)
#endif
+/* Values for ttymode. */
+#define TERM_COOKED 0
+#define TERM_RAW 1
+
+struct command_details;
+struct command_status;
+struct sudo_event_base;
+struct stat;
+
+/*
+ * Closure passed to I/O event callbacks.
+ */
+struct exec_closure {
+ 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 *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;
+ struct sudo_event *sigwinch_event;
+ struct command_status *cstat;
+ void *intercept;
+ pid_t monitor_pid;
+ pid_t cmnd_pid;
+ pid_t ppgrp;
+ short rows;
+ short cols;
+};
+
/*
- * Indices into io_fds[] when running a command in a pty.
+ * 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 *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);
+
+/*
+ * Indices into io_fds[] when logging I/O.
*/
#define SFD_STDIN 0
#define SFD_STDOUT 1
@@ -45,6 +110,9 @@
#define SFD_FOLLOWER 4
#define SFD_USERTTY 5
+/* 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])
+
/*
* Special values to indicate whether continuing in foreground or background.
*/
@@ -104,18 +172,11 @@ union sudo_token_un {
# endif /* HAVE_DECL_SECCOMP_MODE_FILTER */
#endif /* _PATH_SUDO_INTERCEPT && __linux__ */
-/*
- * Symbols shared between exec.c, exec_nopty.c, exec_pty.c and exec_monitor.c
- */
-struct command_details;
-struct command_status;
-struct sudo_event_base;
-struct stat;
-
/* exec.c */
void exec_cmnd(struct command_details *details, sigset_t *mask, int intercept_fd, int errfd);
void terminate_command(pid_t pid, bool use_pgrp);
bool sudo_terminated(struct command_status *cstat);
+void free_exec_closure(struct exec_closure *ec);
/* exec_common.c */
int sudo_execve(int fd, const char *path, char *const argv[], char *envp[], int intercept_fd, int flags);
@@ -126,6 +187,24 @@ char **enable_monitor(char *envp[], const char *dso);
void *intercept_setup(int fd, struct sudo_event_base *evbase, struct command_details *details);
void intercept_cleanup(void);
+/* exec_iolog.c */
+bool log_ttyin(const char *buf, unsigned int n, struct io_buffer *iob);
+bool log_stdin(const char *buf, unsigned int n, struct io_buffer *iob);
+bool log_ttyout(const char *buf, unsigned int n, struct io_buffer *iob);
+bool log_stdout(const char *buf, unsigned int n, struct io_buffer *iob);
+bool log_stderr(const char *buf, unsigned int n, struct io_buffer *iob);
+void log_suspend(struct exec_closure *ec, int signo);
+void log_winchange(struct exec_closure *ec, unsigned int rows, unsigned int cols);
+void io_buf_new(int rfd, int wfd, bool (*action)(const char *, unsigned int, struct io_buffer *), void (*read_cb)(int fd, int what, void *v), void (*write_cb)(int fd, int what, void *v), struct exec_closure *ec, struct io_buffer_list *head);
+int safe_close(int fd);
+void ev_free_by_fd(struct sudo_event_base *evbase, int fd);
+void free_io_bufs(void);
+void add_io_events(struct sudo_event_base *evbase);
+void del_io_events(bool nonblocking);
+void init_ttyblock(void);
+extern struct io_buffer_list iobufs;
+extern int ttymode;
+
/* exec_nopty.c */
void exec_nopty(struct command_details *details, struct command_status *cstat);
@@ -144,7 +223,8 @@ bool utmp_login(const char *from_line, const char *to_line, int ttyfd,
bool utmp_logout(const char *line, int status);
/* exec_preload.c */
-char **sudo_preload_dso(char *envp[], const char *dso_file, int intercept_fd);
+char **sudo_preload_dso(char *const envp[], const char *dso_file, int intercept_fd);
+char **sudo_preload_dso_mmap(char *const envp[], const char *dso_file, int intercept_fd);
/* exec_ptrace.c */
bool exec_ptrace_stopped(pid_t pid, int status, void *intercept);
@@ -152,6 +232,6 @@ bool set_exec_filter(void);
int exec_ptrace_seize(pid_t child);
/* suspend_nopty.c */
-void suspend_sudo_nopty(int signo, pid_t ppgrp, pid_t cmnd_pid);
+void suspend_sudo_nopty(struct exec_closure *ec, int signo, pid_t ppgrp, pid_t cmnd_pid);
#endif /* SUDO_EXEC_H */
diff --git a/src/sudo_intercept.c b/src/sudo_intercept.c
index 943739400..7c2a2d3e5 100644
--- a/src/sudo_intercept.c
+++ b/src/sudo_intercept.c
@@ -62,6 +62,49 @@ extern bool command_allowed(const char *cmnd, char * const argv[], char * const
typedef int (*sudo_fn_execve_t)(const char *, char *const *, char *const *);
+static void
+free_vector(char **vec)
+{
+ char **cur;
+ debug_decl(free_vector, SUDO_DEBUG_EXEC);
+
+ if (vec != NULL) {
+ for (cur = vec; *cur != NULL; cur++) {
+ sudo_mmap_free(*cur);
+ }
+ sudo_mmap_free(vec);
+ }
+
+ debug_return;
+}
+
+static char **
+copy_vector(char * const *src)
+{
+ char **copy;
+ int i, len = 0;
+ debug_decl(copy_vector, SUDO_DEBUG_EXEC);
+
+ if (src != NULL) {
+ while (src[len] != NULL)
+ len++;
+ }
+ copy = sudo_mmap_allocarray(len + 1, sizeof(char *));
+ if (copy == NULL) {
+ debug_return_ptr(NULL);
+ }
+ for (i = 0; i < len; i++) {
+ copy[i] = sudo_mmap_strdup(src[i]);
+ if (copy[i] == NULL) {
+ sudo_mmap_free(copy);
+ debug_return_ptr(NULL);
+ }
+ }
+ copy[i] = NULL;
+
+ debug_return_ptr(copy);
+}
+
/*
* We do PATH resolution here rather than in the policy because we
* want to use the PATH in the current environment.
@@ -74,6 +117,7 @@ resolve_path(const char *cmnd, char *out_cmnd, size_t out_size)
char path[PATH_MAX];
char **p, *cp, *endp;
int dirlen, len;
+ debug_decl(resolve_path, SUDO_DEBUG_EXEC);
for (p = environ; (cp = *p) != NULL; p++) {
if (strncmp(cp, "PATH=", sizeof("PATH=") - 1) == 0) {
@@ -83,7 +127,7 @@ resolve_path(const char *cmnd, char *out_cmnd, size_t out_size)
}
if (cp == NULL) {
errno = ENOENT;
- return false;
+ debug_return_bool(false);
}
endp = cp + strlen(cp);
@@ -104,11 +148,13 @@ resolve_path(const char *cmnd, char *out_cmnd, size_t out_size)
}
if (stat(path, &sb) == 0) {
+ if (!S_ISREG(sb.st_mode))
+ continue;
if (strlcpy(out_cmnd, path, out_size) >= out_size) {
errval = ENAMETOOLONG;
break;
}
- return true;
+ debug_return_bool(true);
}
switch (errno) {
case EACCES:
@@ -119,33 +165,74 @@ resolve_path(const char *cmnd, char *out_cmnd, size_t out_size)
case ENOENT:
break;
default:
- return false;
+ debug_return_bool(false);
}
}
errno = errval;
- return false;
+ debug_return_bool(false);
}
static int
exec_wrapper(const char *cmnd, char * const argv[], char * const envp[],
bool is_execvp)
{
+ char *cmnd_copy = NULL, **argv_copy = NULL, **envp_copy = NULL;
char *ncmnd = NULL, **nargv = NULL, **nenvp = NULL;
char cmnd_buf[PATH_MAX];
void *fn = NULL;
debug_decl(exec_wrapper, SUDO_DEBUG_EXEC);
+ if (cmnd == NULL) {
+ errno = EINVAL;
+ debug_return_int(-1);
+ }
+
/* Only check PATH for the command for execlp/execvp/execvpe. */
if (strchr(cmnd, '/') == NULL) {
if (!is_execvp) {
errno = ENOENT;
- debug_return_int(-1);
+ goto bad;
}
if (!resolve_path(cmnd, cmnd_buf, sizeof(cmnd_buf))) {
- debug_return_int(-1);
+ goto bad;
}
cmnd = cmnd_buf;
+ } else {
+ struct stat sb;
+
+ /* Absolute or relative path name. */
+ if (stat(cmnd, &sb) == -1) {
+ /* Leave errno unchanged. */
+ goto bad;
+ } else if (!S_ISREG(sb.st_mode)) {
+ errno = EACCES;
+ goto bad;
+ }
+ }
+
+ /*
+ * Make copies of cmnd, argv, and envp.
+ */
+ cmnd_copy = sudo_mmap_strdup(cmnd);
+ if (cmnd_copy == NULL) {
+ debug_return_int(-1);
+ }
+ sudo_mmap_protect(cmnd_copy);
+ cmnd = cmnd_copy;
+
+ argv_copy = copy_vector(argv);
+ if (argv_copy == NULL) {
+ goto bad;
}
+ sudo_mmap_protect(argv_copy);
+ argv = argv_copy;
+
+ envp_copy = copy_vector(envp);
+ if (envp_copy == NULL) {
+ goto bad;
+ }
+ sudo_mmap_protect(envp_copy);
+ envp = envp_copy;
# if defined(HAVE___INTERPOSE)
fn = execve;
@@ -156,7 +243,7 @@ exec_wrapper(const char *cmnd, char * const argv[], char * const envp[],
# endif
if (fn == NULL) {
errno = EACCES;
- debug_return_int(-1);
+ goto bad;
}
if (command_allowed(cmnd, argv, envp, &ncmnd, &nargv, &nenvp)) {
@@ -166,28 +253,34 @@ exec_wrapper(const char *cmnd, char * const argv[], char * const envp[],
/* Fall back to exec via shell for execvp and friends. */
if (errno == ENOEXEC && is_execvp) {
int argc;
- char **shargv;
+ const char **shargv;
for (argc = 0; argv[argc] != NULL; argc++)
continue;
- shargv = reallocarray(NULL, (argc + 2), sizeof(char *));
+ shargv = sudo_mmap_allocarray(argc + 2, sizeof(char *));
if (shargv == NULL)
- return -1;
+ goto bad;
shargv[0] = "sh";
shargv[1] = ncmnd;
memcpy(shargv + 2, nargv + 1, argc * sizeof(char *));
- ((sudo_fn_execve_t)fn)(_PATH_SUDO_BSHELL, shargv, nenvp);
- free(shargv);
+ ((sudo_fn_execve_t)fn)(_PATH_SUDO_BSHELL, (char **)shargv, nenvp);
+ sudo_mmap_free(shargv);
}
} else {
errno = EACCES;
}
- if (ncmnd != cmnd)
- free(ncmnd);
- if (nargv != argv)
- free(nargv);
- if (nenvp != envp)
- free(nenvp);
+
+bad:
+ sudo_mmap_free(cmnd_copy);
+ if (ncmnd != cmnd_copy)
+ sudo_mmap_free(ncmnd);
+ free_vector(argv_copy);
+ if (nargv != argv_copy)
+ free_vector(nargv);
+ free_vector(envp_copy);
+ /* Leaks allocated preload vars. */
+ if (nenvp != envp_copy)
+ sudo_mmap_free(nenvp);
debug_return_int(-1);
}
@@ -201,11 +294,16 @@ execl_wrapper(int type, const char *name, const char *arg, va_list ap)
va_list ap2;
debug_decl(execl_wrapper, SUDO_DEBUG_EXEC);
+ if (name == NULL || arg == NULL) {
+ errno = EINVAL;
+ debug_return_int(-1);
+ }
+
va_copy(ap2, ap);
while (va_arg(ap2, char *) != NULL)
argc++;
va_end(ap2);
- argv = reallocarray(NULL, (argc + 1), sizeof(char *));
+ argv = sudo_mmap_allocarray(argc + 1, sizeof(char *));
if (argv == NULL)
debug_return_int(-1);
@@ -217,7 +315,7 @@ execl_wrapper(int type, const char *name, const char *arg, va_list ap)
envp = va_arg(ap, char **);
exec_wrapper(name, argv, envp, type == SUDO_EXECLP);
- free(argv);
+ sudo_mmap_free(argv);
debug_return_int(-1);
}
@@ -225,7 +323,7 @@ execl_wrapper(int type, const char *name, const char *arg, va_list ap)
static int
system_wrapper(const char *cmnd)
{
- char * const argv[] = { "sh", "-c", (char *)cmnd, NULL };
+ const char * const argv[] = { "sh", "-c", cmnd, NULL };
const char shell[] = _PATH_SUDO_BSHELL;
struct sigaction saveint, savequit, sa;
sigset_t mask, omask;
@@ -253,7 +351,7 @@ system_wrapper(const char *cmnd)
case 0:
/* child */
if (sigprocmask(SIG_SETMASK, &omask, NULL) != -1)
- exec_wrapper(shell, argv, environ, false);
+ exec_wrapper(shell, (char **)argv, environ, false);
_exit(127);
default:
/* parent */
@@ -408,39 +506,50 @@ sudo_shl_get_next(const char *symbol, short type)
}
# endif /* HAVE_SHL_LOAD */
-sudo_dso_public int
+sudo_dso_public int system(const char *cmnd);
+sudo_dso_public int execve(const char *cmnd, char * const argv[], char * const envp[]);
+sudo_dso_public int execv(const char *cmnd, char * const argv[]);
+#ifdef HAVE_EXECVPE
+sudo_dso_public int execvpe(const char *cmnd, char * const argv[], char * const envp[]);
+#endif
+sudo_dso_public int execvp(const char *cmnd, char * const argv[]);
+sudo_dso_public int execl(const char *name, const char *arg, ...);
+sudo_dso_public int execle(const char *name, const char *arg, ...);
+sudo_dso_public int execlp(const char *name, const char *arg, ...);
+
+int
system(const char *cmnd)
{
return system_wrapper(cmnd);
}
-sudo_dso_public int
+int
execve(const char *cmnd, char * const argv[], char * const envp[])
{
return exec_wrapper(cmnd, argv, envp, false);
}
-sudo_dso_public int
+int
execv(const char *cmnd, char * const argv[])
{
return execve(cmnd, argv, environ);
}
#ifdef HAVE_EXECVPE
-sudo_dso_public int
+int
execvpe(const char *cmnd, char * const argv[], char * const envp[])
{
return exec_wrapper(cmnd, argv, envp, true);
}
#endif
-sudo_dso_public int
+int
execvp(const char *cmnd, char * const argv[])
{
return exec_wrapper(cmnd, argv, environ, true);
}
-sudo_dso_public int
+int
execl(const char *name, const char *arg, ...)
{
va_list ap;
@@ -452,7 +561,7 @@ execl(const char *name, const char *arg, ...)
return -1;
}
-sudo_dso_public int
+int
execle(const char *name, const char *arg, ...)
{
va_list ap;
@@ -464,7 +573,7 @@ execle(const char *name, const char *arg, ...)
return -1;
}
-sudo_dso_public int
+int
execlp(const char *name, const char *arg, ...)
{
va_list ap;
diff --git a/src/sudo_intercept_common.c b/src/sudo_intercept_common.c
index e6431882b..0dc3de53e 100644
--- a/src/sudo_intercept_common.c
+++ b/src/sudo_intercept_common.c
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2021-2022 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -51,8 +51,8 @@
#include "sudo_compat.h"
#include "sudo_conf.h"
#include "sudo_debug.h"
-#include "sudo_fatal.h"
#include "sudo_exec.h"
+#include "sudo_fatal.h"
#include "sudo_gettext.h"
#include "sudo_util.h"
#include "intercept.pb-c.h"
@@ -61,6 +61,7 @@ extern char **environ;
static union sudo_token_un intercept_token;
static in_port_t intercept_port;
+static bool log_only;
/* Send entire request to sudo (blocking). */
static bool
@@ -97,7 +98,7 @@ send_client_hello(int sock)
/* Setup client hello. */
hello.pid = getpid();
- msg.type_case = INTERCEPT_REQUEST__TYPE_HELLO;;
+ msg.type_case = INTERCEPT_REQUEST__TYPE_HELLO;
msg.u.hello = &hello;
len = intercept_request__get_packed_size(&msg);
@@ -110,7 +111,7 @@ send_client_hello(int sock)
msg_len = len;
len += sizeof(msg_len);
- if ((buf = malloc(len)) == NULL) {
+ if ((buf = sudo_mmap_alloc(len)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done;
}
@@ -120,14 +121,14 @@ send_client_hello(int sock)
ret = send_req(sock, buf, len);
done:
- free(buf);
+ sudo_mmap_free(buf);
debug_return_bool(ret);
}
/*
* Receive InterceptResponse from sudo over fd.
*/
-InterceptResponse *
+static InterceptResponse *
recv_intercept_response(int fd)
{
InterceptResponse *res = NULL;
@@ -168,7 +169,7 @@ recv_intercept_response(int fd)
}
/* Read response from sudo (blocking). */
- if ((buf = malloc(res_len)) == NULL) {
+ if ((buf = sudo_mmap_alloc(res_len)) == NULL) {
goto done;
}
cp = buf;
@@ -201,7 +202,7 @@ recv_intercept_response(int fd)
}
done:
- free(buf);
+ sudo_mmap_free(buf);
debug_return_ptr(res);
}
@@ -273,6 +274,7 @@ sudo_interposer_init(void)
intercept_token.u64[0] = res->u.hello_resp->token_lo;
intercept_token.u64[1] = res->u.hello_resp->token_hi;
intercept_port = res->u.hello_resp->portno;
+ log_only = res->u.hello_resp->log_only;
} else {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unexpected type_case value %d in %s from %s",
@@ -295,6 +297,7 @@ send_policy_check_req(int sock, const char *cmnd, char * const argv[],
InterceptRequest msg = INTERCEPT_REQUEST__INIT;
PolicyCheckRequest req = POLICY_CHECK_REQUEST__INIT;
char cwdbuf[PATH_MAX];
+ char *empty[1] = { NULL };
uint8_t *buf = NULL;
bool ret = false;
uint32_t msg_len;
@@ -311,14 +314,12 @@ send_policy_check_req(int sock, const char *cmnd, char * const argv[],
/* Setup policy check request. */
req.intercept_fd = sock;
req.command = (char *)cmnd;
- req.argv = (char **)argv;
- for (len = 0; argv[len] != NULL; len++)
+ req.argv = argv ? (char **)argv : empty;
+ for (req.n_argv = 0; req.argv[req.n_argv] != NULL; req.n_argv++)
continue;
- req.n_argv = len;
- req.envp = (char **)envp;
- for (len = 0; envp[len] != NULL; len++)
+ req.envp = envp ? (char **)envp : empty;
+ for (req.n_envp = 0; req.envp[req.n_envp] != NULL; req.n_envp++)
continue;
- req.n_envp = len;
if (getcwd(cwdbuf, sizeof(cwdbuf)) != NULL) {
req.cwd = cwdbuf;
}
@@ -335,7 +336,7 @@ send_policy_check_req(int sock, const char *cmnd, char * const argv[],
msg_len = len;
len += sizeof(msg_len);
- if ((buf = malloc(len)) == NULL) {
+ if ((buf = sudo_mmap_alloc(len)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done;
}
@@ -345,7 +346,7 @@ send_policy_check_req(int sock, const char *cmnd, char * const argv[],
ret = send_req(sock, buf, len);
done:
- free(buf);
+ sudo_mmap_free(buf);
debug_return_bool(ret);
}
@@ -357,18 +358,18 @@ intercept_connect(void)
{
int sock = -1;
int on = 1;
- struct sockaddr_in sin;
- debug_decl(command_allowed, SUDO_DEBUG_EXEC);
+ struct sockaddr_in sin4;
+ debug_decl(intercept_connect, SUDO_DEBUG_EXEC);
if (intercept_port == 0) {
- sudo_warnx(U_("intercept port not set"));
+ sudo_warnx("%s", U_("intercept port not set"));
goto done;
}
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- sin.sin_port = htons(intercept_port);
+ memset(&sin4, 0, sizeof(sin4));
+ sin4.sin_family = AF_INET;
+ sin4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ sin4.sin_port = htons(intercept_port);
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
@@ -379,7 +380,7 @@ intercept_connect(void)
/* Send data immediately, we need low latency IPC. */
(void)setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));
- if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
+ if (connect(sock, (struct sockaddr *)&sin4, sizeof(sin4)) == -1) {
sudo_warn("connect");
close(sock);
sock = -1;
@@ -390,6 +391,9 @@ done:
debug_return_int(sock);
}
+/* Called from sudo_intercept.c */
+bool command_allowed(const char *cmnd, char * const argv[], char * const envp[], char **ncmndp, char ***nargvp, char ***nenvpp);
+
bool
command_allowed(const char *cmnd, char * const argv[],
char * const envp[], char **ncmndp, char ***nargvp, char ***nenvpp)
@@ -404,9 +408,11 @@ command_allowed(const char *cmnd, char * const argv[],
if (sudo_debug_needed(SUDO_DEBUG_INFO)) {
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
"req_command: %s", cmnd);
- for (idx = 0; argv[idx] != NULL; idx++) {
- sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
- "req_argv[%zu]: %s", idx, argv[idx]);
+ if (argv != NULL) {
+ for (idx = 0; argv[idx] != NULL; idx++) {
+ sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+ "req_argv[%zu]: %s", idx, argv[idx]);
+ }
}
}
@@ -417,6 +423,18 @@ command_allowed(const char *cmnd, char * const argv[],
if (!send_policy_check_req(sock, cmnd, argv, envp))
goto done;
+ if (log_only) {
+ /* Just logging, no policy check. */
+ nenvp = sudo_preload_dso_mmap(envp, sudo_conf_intercept_path(), sock);
+ if (nenvp == NULL)
+ goto oom;
+ *ncmndp = (char *)cmnd; /* safe */
+ *nargvp = (char **)argv; /* safe */
+ *nenvpp = nenvp;
+ ret = true;
+ goto done;
+ }
+
res = recv_intercept_response(sock);
if (res == NULL)
goto done;
@@ -431,22 +449,20 @@ command_allowed(const char *cmnd, char * const argv[],
"run_argv[%zu]: %s", idx, res->u.accept_msg->run_argv[idx]);
}
}
- ncmnd = strdup(res->u.accept_msg->run_command);
+ ncmnd = sudo_mmap_strdup(res->u.accept_msg->run_command);
if (ncmnd == NULL)
goto oom;
- nargv = reallocarray(NULL, res->u.accept_msg->n_run_argv + 1,
+ nargv = sudo_mmap_allocarray(res->u.accept_msg->n_run_argv + 1,
sizeof(char *));
if (nargv == NULL)
goto oom;
for (len = 0; len < res->u.accept_msg->n_run_argv; len++) {
- nargv[len] = strdup(res->u.accept_msg->run_argv[len]);
+ nargv[len] = sudo_mmap_strdup(res->u.accept_msg->run_argv[len]);
if (nargv[len] == NULL)
goto oom;
}
nargv[len] = NULL;
- // XXX - bogus cast
- nenvp = sudo_preload_dso((char **)envp, sudo_conf_intercept_path(),
- sock);
+ nenvp = sudo_preload_dso_mmap(envp, sudo_conf_intercept_path(), sock);
if (nenvp == NULL)
goto oom;
*ncmndp = ncmnd;
@@ -466,15 +482,15 @@ command_allowed(const char *cmnd, char * const argv[],
default:
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unexpected type_case value %d in %s from %s",
- res->type_case, "InterceptResponse", "sudo");
+ res->type_case, "InterceptResponse", "sudo");
goto done;
}
oom:
- free(ncmnd);
+ sudo_mmap_free(ncmnd);
while (len > 0)
- free(nargv[--len]);
- free(nargv);
+ sudo_mmap_free(nargv[--len]);
+ sudo_mmap_free(nargv);
done:
/* Keep socket open for ctor when we execute the command. */
diff --git a/src/sudo_noexec.c b/src/sudo_noexec.c
index fd8117226..71a36d6fe 100644
--- a/src/sudo_noexec.c
+++ b/src/sudo_noexec.c
@@ -88,32 +88,32 @@ typedef struct interpose_s {
}
#define EXEC_REPL1(fn, t1) \
-sudo_dso_public int \
-FN_NAME(fn)(t1 a1) \
+sudo_dso_public int FN_NAME(fn)(t1 a1); \
+int FN_NAME(fn)(t1 a1) \
EXEC_REPL_BODY \
INTERPOSE(fn)
#define EXEC_REPL2(fn, t1, t2) \
-sudo_dso_public int \
-FN_NAME(fn)(t1 a1, t2 a2) \
+sudo_dso_public int FN_NAME(fn)(t1 a1, t2 a2); \
+int FN_NAME(fn)(t1 a1, t2 a2) \
EXEC_REPL_BODY \
INTERPOSE(fn)
#define EXEC_REPL3(fn, t1, t2, t3) \
-sudo_dso_public int \
-FN_NAME(fn)(t1 a1, t2 a2, t3 a3) \
+sudo_dso_public int FN_NAME(fn)(t1 a1, t2 a2, t3 a3); \
+int FN_NAME(fn)(t1 a1, t2 a2, t3 a3) \
EXEC_REPL_BODY \
INTERPOSE(fn)
#define EXEC_REPL6(fn, t1, t2, t3, t4, t5, t6) \
-sudo_dso_public int \
-FN_NAME(fn)(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
+sudo_dso_public int FN_NAME(fn)(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6); \
+int FN_NAME(fn)(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \
EXEC_REPL_BODY \
INTERPOSE(fn)
#define EXEC_REPL_VA(fn, t1, t2) \
-sudo_dso_public int \
-FN_NAME(fn)(t1 a1, t2 a2, ...) \
+sudo_dso_public int FN_NAME(fn)(t1 a1, t2 a2, ...); \
+int FN_NAME(fn)(t1 a1, t2 a2, ...) \
EXEC_REPL_BODY \
INTERPOSE(fn)
@@ -159,8 +159,8 @@ EXEC_REPL6(posix_spawnp, pid_t *, const char *, const posix_spawn_file_actions_t
*/
EXEC_REPL1(system, const char *)
-sudo_dso_public FILE *
-FN_NAME(popen)(const char *c, const char *t)
+sudo_dso_public FILE *FN_NAME(popen)(const char *c, const char *t);
+FILE *FN_NAME(popen)(const char *c, const char *t)
{
errno = EACCES;
return NULL;
@@ -174,8 +174,8 @@ INTERPOSE(popen)
*/
typedef int (*sudo_fn_wordexp_t)(const char *, wordexp_t *, int);
-sudo_dso_public int
-FN_NAME(wordexp)(const char *words, wordexp_t *we, int flags)
+sudo_dso_public int FN_NAME(wordexp)(const char *words, wordexp_t *we, int flags);
+int FN_NAME(wordexp)(const char *words, wordexp_t *we, int flags)
{
#if defined(HAVE___INTERPOSE)
return wordexp(words, we, flags | WRDE_NOCMD);
diff --git a/src/sudo_plugin_int.h b/src/sudo_plugin_int.h
index 63e4a7da3..7a15d7c26 100644
--- a/src/sudo_plugin_int.h
+++ b/src/sudo_plugin_int.h
@@ -38,7 +38,7 @@ 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[],
+ sudo_printf_t sudo_plugin_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);
@@ -46,16 +46,16 @@ struct policy_plugin_1_0 {
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);
+ const char *user);
int (*validate)(void);
- void (*invalidate)(int remove);
+ void (*invalidate)(int rmcred);
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[],
+ sudo_printf_t sudo_plugin_printf, char * const settings[],
char * const user_info[], int argc, char * const argv[],
char * const user_env[]);
void (*close)(int exit_status, int error);
@@ -70,7 +70,7 @@ 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[],
+ sudo_printf_t sudo_plugin_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 */
diff --git a/src/sudo_usage.h.in b/src/sudo_usage.h.in
index fce40d30c..9b85a8580 100644
--- a/src/sudo_usage.h.in
+++ b/src/sudo_usage.h.in
@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
- * Copyright (c) 2007-2010, 2013, 2015, 2017, 2020
+ * Copyright (c) 2007-2010, 2013, 2015, 2017, 2020-2022
* Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -26,10 +26,10 @@
*/
#define SUDO_USAGE0 " -h | -V"
#define SUDO_USAGE1 " -h | -K | -k | -V"
-#define SUDO_USAGE2 " -v [-ABknS] @BSDAUTH_USAGE@[-g group] [-h host] [-p prompt] [-u user]"
-#define SUDO_USAGE3 " -l [-ABknS] @BSDAUTH_USAGE@[-g group] [-h host] [-p prompt] [-U user] [-u user] [command]"
-#define SUDO_USAGE4 " [-ABbEHknPS] @BSDAUTH_USAGE@@SELINUX_USAGE@[-C num] [-D directory] @LOGINCAP_USAGE@[-g group] [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]"
-#define SUDO_USAGE5 " -e [-ABknS] @BSDAUTH_USAGE@@SELINUX_USAGE@[-C num] @LOGINCAP_USAGE@[-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] file ..."
+#define SUDO_USAGE2 " -v [-ABkNnS] @BSDAUTH_USAGE@[-g group] [-h host] [-p prompt] [-u user]"
+#define SUDO_USAGE3 " -l [-ABkNnS] @BSDAUTH_USAGE@[-g group] [-h host] [-p prompt] [-U user] [-u user] [command]"
+#define SUDO_USAGE4 " [-ABbEHkNnPS] @BSDAUTH_USAGE@@SELINUX_USAGE@[-C num] [-D directory] @LOGINCAP_USAGE@[-g group] [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]"
+#define SUDO_USAGE5 " -e [-ABkNnS] @BSDAUTH_USAGE@@SELINUX_USAGE@[-C num] @LOGINCAP_USAGE@[-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] file ..."
/*
* Configure script arguments used to build sudo.
diff --git a/src/suspend_nopty.c b/src/suspend_nopty.c
index babeae29b..896b7e2fa 100644
--- a/src/suspend_nopty.c
+++ b/src/suspend_nopty.c
@@ -34,7 +34,8 @@
#include "sudo_exec.h"
void
-suspend_sudo_nopty(int signo, pid_t ppgrp, pid_t cmnd_pid)
+suspend_sudo_nopty(struct exec_closure *ec, int signo, pid_t ppgrp,
+ pid_t cmnd_pid)
{
struct sigaction sa, osa;
pid_t saved_pgrp = -1;
@@ -80,6 +81,9 @@ suspend_sudo_nopty(int signo, pid_t ppgrp, pid_t cmnd_pid)
}
}
+ /* Log the suspend event. */
+ log_suspend(ec, signo);
+
if (signo == SIGTSTP) {
memset(&sa, 0, sizeof(sa));
sigemptyset(&sa.sa_mask);
@@ -94,6 +98,10 @@ suspend_sudo_nopty(int signo, pid_t ppgrp, pid_t cmnd_pid)
if (sudo_sigaction(SIGTSTP, &osa, NULL) != 0)
sudo_warn(U_("unable to restore handler for signal %d"), SIGTSTP);
}
+
+ /* Log the resume event. */
+ log_suspend(ec, SIGCONT);
+
if (saved_pgrp != -1) {
/*
* On resume, restore foreground process group, if different.