Imported Upstream version 1.9.5 upstream/1.9.5
authorDongHun Kwak <dh0128.kwak@samsung.com>
Thu, 11 Mar 2021 02:01:10 +0000 (11:01 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Thu, 11 Mar 2021 02:01:10 +0000 (11:01 +0900)
106 files changed:
ChangeLog
MANIFEST
Makefile.in
NEWS
configure
configure.ac
doc/LICENSE
doc/sudoers.man.in
doc/sudoers.man.in.sed
doc/sudoers.mdoc.in
etc/sudo-logsrvd.pp
etc/sudo-python.pp
etc/sudo.pp
include/sudo_compat.h
include/sudo_util.h
lib/eventlog/Makefile.in
lib/eventlog/eventlog.c
lib/iolog/Makefile.in
lib/iolog/iolog_fileio.c
lib/logsrv/Makefile.in
lib/util/Makefile.in
lib/util/arc4random.c
lib/util/fatal.c
lib/util/pread.c [new file with mode: 0644]
lib/util/progname.c
lib/util/pwrite.c [new file with mode: 0644]
lib/util/sudo_debug.c
lib/util/util.exp.in
logsrvd/Makefile.in
logsrvd/logsrvd.c
plugins/audit_json/Makefile.in
plugins/audit_json/audit_json.c
plugins/group_file/Makefile.in
plugins/group_file/getgrent.c
plugins/group_file/plugin_test.c
plugins/python/Makefile.in
plugins/python/python_convmessage.c
plugins/python/python_importblocker.c
plugins/sample/Makefile.in
plugins/sample_approval/Makefile.in
plugins/sudoers/Makefile.in
plugins/sudoers/auth/pam.c
plugins/sudoers/check.c
plugins/sudoers/def_data.c
plugins/sudoers/def_data.h
plugins/sudoers/def_data.in
plugins/sudoers/defaults.c
plugins/sudoers/editor.c
plugins/sudoers/fmtsudoers.c
plugins/sudoers/getdate.c
plugins/sudoers/getdate.y
plugins/sudoers/goodpath.c
plugins/sudoers/gram.c
plugins/sudoers/gram.h
plugins/sudoers/gram.y
plugins/sudoers/ldap_util.c
plugins/sudoers/linux_audit.c
plugins/sudoers/logging.c
plugins/sudoers/match_command.c
plugins/sudoers/parse.h
plugins/sudoers/po/hr.mo
plugins/sudoers/po/hr.po
plugins/sudoers/po/it.mo
plugins/sudoers/po/it.po
plugins/sudoers/po/ko.mo
plugins/sudoers/po/ko.po
plugins/sudoers/po/sr.mo
plugins/sudoers/po/sr.po
plugins/sudoers/po/sudoers.pot
plugins/sudoers/po/sv.mo
plugins/sudoers/po/sv.po
plugins/sudoers/policy.c
plugins/sudoers/rcstr.c
plugins/sudoers/redblack.c
plugins/sudoers/starttime.c
plugins/sudoers/sudoers.c
plugins/sudoers/timestamp.c
plugins/sudoers/toke.c
plugins/sudoers/toke.l
plugins/sudoers/toke_util.c
plugins/sudoers/tsgetgrpw.c
plugins/sudoers/visudo.c
plugins/system_group/Makefile.in
po/ko.mo
po/ko.po
po/sr.mo
po/sr.po
po/sudo.pot
po/sv.mo
po/sv.po
scripts/mkdep.pl
src/Makefile.in
src/copy_file.c
src/edit_open.c [new file with mode: 0644]
src/exec.c
src/exec_common.c
src/exec_pty.c
src/net_ifs.c
src/sesh.c
src/sudo.c
src/sudo.h
src/sudo_edit.c
src/sudo_edit.h [new file with mode: 0644]
src/sudo_exec.h
src/tgetpass.c
src/ttyname.c

index 6265c3e..53e31c9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,235 @@
+2021-01-09  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * .hgtags:
+       Added tag SUDO_1_9_5 for changeset 4059f5520d9d
+       [ee76c8a938de] [tip] <1.9>
+
+       * Merge sudo 1.9.5 from tip
+       [4059f5520d9d] [SUDO_1_9_5] <1.9>
+
+       * plugins/sudoers/po/sudoers.pot, po/sudo.pot:
+       Update .pot files for 1.9.5.
+       [49dae07bda23]
+
+2021-01-08  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * NEWS, configure, configure.ac, doc/LICENSE, etc/sudo-logsrvd.pp,
+       etc/sudo-python.pp, etc/sudo.pp:
+       Sudo 1.9.5
+       [3a0e500981a8]
+
+       * doc/sudoers.man.in, doc/sudoers.man.in.sed, doc/sudoers.mdoc.in,
+       plugins/sudoers/def_data.c, plugins/sudoers/def_data.h,
+       plugins/sudoers/def_data.in, plugins/sudoers/defaults.c,
+       plugins/sudoers/policy.c:
+       Allow SELinux support to be disabled via the sudoers file. Defaults
+       to true if sudo is built with SELinux support and SELinux is not
+       disabled on the system.
+       [c457eaae8692]
+
+2021-01-06  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * plugins/python/python_importblocker.c:
+       Add a comment to verify_import() to clarify its purpose.
+       [30ef680f4104]
+
+       * lib/eventlog/eventlog.c, lib/util/arc4random.c,
+       lib/util/sudo_debug.c, plugins/audit_json/audit_json.c,
+       plugins/python/python_convmessage.c, plugins/sudoers/auth/pam.c,
+       plugins/sudoers/getdate.c, plugins/sudoers/getdate.y,
+       plugins/sudoers/goodpath.c, plugins/sudoers/gram.c,
+       plugins/sudoers/gram.h, plugins/sudoers/gram.y,
+       plugins/sudoers/rcstr.c, plugins/sudoers/redblack.c,
+       plugins/sudoers/toke.c, plugins/sudoers/toke.l,
+       plugins/sudoers/toke_util.c, plugins/sudoers/visudo.c,
+       src/exec_common.c, src/sesh.c, src/sudo.c, src/sudo_edit.c:
+       Suppress PVS Studio false positives.
+       [077f46549351]
+
+       * plugins/sudoers/gram.c, plugins/sudoers/gram.y:
+       Plug a memory leak in sudoerserrorf().
+       [a3c14cf0283e]
+
+       * plugins/sudoers/editor.c, plugins/sudoers/fmtsudoers.c,
+       plugins/sudoers/gram.c, plugins/sudoers/gram.y,
+       plugins/sudoers/ldap_util.c, plugins/sudoers/parse.h,
+       plugins/sudoers/starttime.c, plugins/sudoers/tsgetgrpw.c,
+       src/ttyname.c:
+       Quiet a few harmless cppcheck warnings.
+       [ab123790b3fd]
+
+       * src/copy_file.c, src/sudo_edit.c:
+       In sudoedit, use sudo_check_temp_file() for non-SELinux too.
+       [b5d5bd506487]
+
+       * MANIFEST, src/Makefile.in, src/edit_open.c, src/sesh.c,
+       src/sudo_edit.c, src/sudo_edit.h, src/sudo_exec.h:
+       Move safe open code out of sudo_edit.c and into edit_open.c.
+       [108fcca05798]
+
+       * src/Makefile.in, src/edit_open.c, src/sesh.c, src/sudo_edit.c,
+       src/sudo_edit.h:
+       Add directory writability checks for SELinux RBAC sudoedit. These
+       were never added to the SELinux RBAC path.
+       [0d4f28b5a8e2]
+
+       * src/edit_open.c, src/exec.c, src/exec_pty.c, src/sesh.c, src/sudo.c,
+       src/sudo.h, src/sudo_edit.c, src/sudo_edit.h, src/tgetpass.c:
+       Add struct sudo_cred to hold the invoking or runas user credentials.
+       We can use this when we need to pass around credential info instead
+       of the user_details and command_details structs.
+       [20594f3f00c1]
+
+       * src/edit_open.c, src/sesh.c, src/sudo_edit.c, src/sudo_edit.h:
+       Rename run_cred -> cur_cred and stash existing creds in
+       set_tmpdir(). For sudo_edit_open() et al what we need is a copy of
+       the current cred to restore after dir_is_writable() changes to the
+       user cred.
+       [dcfce8a11282]
+
+       * configure, configure.ac, include/sudo_compat.h, lib/util/progname.c:
+       Add setprogname(3) for those without it.
+       [e2f1d1ecedb0]
+
+       * src/sesh.c, src/sudo_edit.c:
+       Split up sesh_sudoedit() so it is organized more like sudo_edit.c.
+       The new sesh_edit_create_tfiles() and sesh_edit_copy_tfiles()
+       functions are analogous to sudo_edit_create_tfiles() and
+       sudo_edit_copy_tfiles(). Also use "sudoedit" in the warning/error
+       messages from sesh_sudoedit(). Otherwise, the user gets a mix of
+       messages from sudoedit and sesh.
+       [5510be4b2129]
+
+       * Makefile.in, lib/eventlog/Makefile.in, lib/iolog/Makefile.in,
+       lib/logsrv/Makefile.in, lib/util/Makefile.in, logsrvd/Makefile.in,
+       plugins/audit_json/Makefile.in, plugins/group_file/Makefile.in,
+       plugins/python/Makefile.in, plugins/sample/Makefile.in,
+       plugins/sample_approval/Makefile.in, plugins/sudoers/Makefile.in,
+       plugins/system_group/Makefile.in, src/Makefile.in:
+       Remove the --force option from the cppcheck args, it causes errors.
+       [57f2ad72e874]
+
+       * include/sudo_util.h, lib/util/progname.c, lib/util/util.exp.in,
+       src/sudo.c:
+       For sudo, only allow "sudo" or "sudoedit" as the program name. The
+       program name is also used when matching Debug lines in sudo.conf. We
+       don't want the user to be able to influence sudo.conf Debug
+       matching. The string "sudoedit" is treated the same as "sudo" in
+       sudo.conf. Problem reported by Matthias Gerstner of SUSE.
+       [1d32c53859f9]
+
+       * lib/iolog/iolog_fileio.c, lib/util/sudo_debug.c,
+       plugins/group_file/getgrent.c, plugins/sudoers/linux_audit.c,
+       plugins/sudoers/tsgetgrpw.c:
+       Check the return value of fcntl() when setting FD_CLOEXEC. This
+       should never fail unless the fd is invalid. Problem reported by
+       Matthias Gerstner of SUSE.
+       [f1ca39a0d870]
+
+       * src/sudo_edit.c:
+       Fix potential directory existing info leak in sudoedit. When
+       creating a new file, sudoedit checks to make sure the parent
+       directory exists so it can provide the user with a sensible error
+       message. However, this could be used to test for the existence of
+       directories not normally accessible to the user by pointing to them
+       with a symbolic link when the parent directory is controlled by the
+       user. Problem reported by Matthias Gerstner of SUSE.
+       [ea19d0073c02]
+
+       * src/copy_file.c, src/sesh.c, src/sudo_edit.c, src/sudo_exec.h:
+       Add security checks before using temp files for SELinux RBAC
+       sudoedit. Otherwise, it may be possible for the user running
+       sudoedit to replace the newly-created temporary files with a
+       symbolic link and have sudoedit set the owner of an arbitrary file.
+       Problem reported by Matthias Gerstner of SUSE.
+       [8fcb36ef422a]
+
+       * plugins/sudoers/po/hr.mo, plugins/sudoers/po/hr.po,
+       plugins/sudoers/po/it.mo, plugins/sudoers/po/it.po,
+       plugins/sudoers/po/ko.mo, plugins/sudoers/po/ko.po,
+       plugins/sudoers/po/sr.mo, plugins/sudoers/po/sr.po,
+       plugins/sudoers/po/sv.mo, plugins/sudoers/po/sv.po, po/ko.mo,
+       po/ko.po, po/sr.mo, po/sr.po, po/sv.mo, po/sv.po:
+       Updated translations from translationproject.org
+       [e68c92c767f1]
+
+2021-01-04  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * plugins/sudoers/sudoers.c:
+       Use debug_return_int() not debug_return_bool() to return -1. Found
+       by PVS Studio.
+       [f1f67ca51aeb]
+
+       * plugins/sudoers/logging.c:
+       Fix a crash introduced in 1.9.4 when running "sudo -i" as an unknown
+       user.
+       [d1a3f0f4d0f9]
+
+2021-01-03  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * plugins/sudoers/check.c:
+       Make sure lecture file is a regular file before reading it.
+       [c9c68eff1e45]
+
+2021-01-02  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * Makefile.in, lib/eventlog/Makefile.in, lib/iolog/Makefile.in,
+       lib/logsrv/Makefile.in, lib/util/Makefile.in, logsrvd/Makefile.in,
+       plugins/audit_json/Makefile.in, plugins/group_file/Makefile.in,
+       plugins/group_file/plugin_test.c, plugins/python/Makefile.in,
+       plugins/sample/Makefile.in, plugins/sample_approval/Makefile.in,
+       plugins/sudoers/Makefile.in, plugins/sudoers/parse.h,
+       plugins/system_group/Makefile.in, src/Makefile.in:
+       Minor fixes pointed out by cppcheck. Also add
+       compareBoolExpressionWithInt to suppression list.
+       [52316819700e]
+
+       * logsrvd/logsrvd.c:
+       Avoid potential use after free with eventlog-only connections.
+       Coverity CID 215884.
+       [cca5cffabe42]
+
+       * src/exec.c:
+       Cannot do direct exec of a command when SELinux RBAC is enabled.
+       [2706b0fc1451]
+
+       * MANIFEST, configure, configure.ac, include/sudo_compat.h,
+       lib/util/Makefile.in, lib/util/pread.c, lib/util/pwrite.c,
+       scripts/mkdep.pl:
+       Add emulation of pread(3) and pwrite(3) for systems without them.
+       This makes it possible to remove some ugly #ifdefs and only affects
+       very old systems.
+       [1c2a31bda598]
+
+       * lib/iolog/iolog_fileio.c, plugins/sudoers/match_command.c,
+       plugins/sudoers/timestamp.c:
+       Remove #ifdefs around code using pread(3) and pwrite(3).
+       [3830fdf650df]
+
+       * plugins/sudoers/Makefile.in:
+       Regen now that ldap.c and sssd.c no longer need gram.h
+       [5cc4e107f301]
+
+2020-12-30  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * lib/util/fatal.c:
+       Fix deregistration of a callback that is not at the head of the
+       list. The SLIST_FOREACH_PREVPTR macro doesn't work the way I thought
+       it did. Just store our own prev pointer and use that instead.
+       [04c290fe1fcb]
+
+2020-12-21  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+       * src/net_ifs.c:
+       Fix the buffer size parameter when serializing the interface list.
+       Problem reported by Matthias Gerstner of SUSE.
+       [b0cae3ac8e46]
+
 2020-12-20  Todd C. Miller  <Todd.Miller@sudo.ws>
 
        * .hgtags:
        Added tag SUDO_1_9_4p2 for changeset 8aed5221ede9
-       [a74faf363dbb] [tip] <1.9>
+       [a74faf363dbb] <1.9>
 
        * merge sudo 1.9.4p2 from tip
        [8aed5221ede9] [SUDO_1_9_4p2] <1.9>
index a04ca98..2d7746d 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -182,8 +182,10 @@ lib/util/nanosleep.c
 lib/util/openat.c
 lib/util/parseln.c
 lib/util/pipe2.c
+lib/util/pread.c
 lib/util/progname.c
 lib/util/pw_dup.c
+lib/util/pwrite.c
 lib/util/reallocarray.c
 lib/util/regress/fnmatch/fnm_test.c
 lib/util/regress/fnmatch/fnm_test.in
@@ -993,6 +995,7 @@ scripts/unanon
 src/Makefile.in
 src/conversation.c
 src/copy_file.c
+src/edit_open.c
 src/env_hooks.c
 src/exec.c
 src/exec_common.c
@@ -1017,6 +1020,7 @@ src/solaris.c
 src/sudo.c
 src/sudo.h
 src/sudo_edit.c
+src/sudo_edit.h
 src/sudo_exec.h
 src/sudo_noexec.c
 src/sudo_plugin_int.h
index d6b73a5..9d9d754 100644 (file)
@@ -94,7 +94,7 @@ XGETTEXT_OPTS = -F -k_ -kN_ -kU_ --copyright-holder="Todd C. Miller" \
                --flag sudo_lbuf_append_quoted:3:c-format --foreign-user
 
 # Default cppcheck options when run from the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # Default splint options when run from the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
diff --git a/NEWS b/NEWS
index 0949f20..a3a1a8c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,66 @@
+What's new in Sudo 1.9.5
+
+ * Fixed a crash introduced in 1.9.4 when running "sudo -i" as an
+   unknown user.  This is related to but distinct from Bug #948.
+
+ * If the "lecture_file" setting is enabled in sudoers, it must now
+   refer to a regular file or a symbolic link to a regular file.
+
+ * Fixed a potential use-after-free bug in sudo_logsrvd when the
+   server shuts down if there are existing connections from clients
+   that are only logging events and not session I/O data.
+
+ * Fixed a buffer size mismatch when serializing the list of IP
+   addresses for configured network interfaces.  This bug is not
+   actually exploitable since the allocated buffer is large enough
+   to hold the list of addresses.
+
+ * If sudo is executed with a name other that "sudo" or "sudoedit",
+   it will now fall back to "sudo" as the program name.  This affects
+   warning, help and usage messages as well as the matching of Debug
+   lines in the /etc/sudo.conf file.  Previously, it was possible
+   for the invoking user to manipulate the program name by setting
+   argv[0] to an arbitrary value when executing sudo.
+
+ * Sudo now checks for failure when setting the close-on-exec flag
+   on open file descriptors.  This should never fail but, if it
+   were to, there is the possibility of a file descriptor leak to
+   a child process (such as the command sudo runs).
+
+ * Fixed CVE-2021-23239, a potential information leak in sudoedit
+   that could be used to test for the existence of directories not
+   normally accessible to the user in certain circumstances.  When
+   creating a new file, sudoedit checks to make sure the parent
+   directory of the new file exists before running the editor.
+   However, a race condition exists if the invoking user can replace
+   (or create) the parent directory.  If a symbolic link is created
+   in place of the parent directory, sudoedit will run the editor
+   as long as the target of the link exists.  If the target of the
+   link does not exist, an error message will be displayed.  The
+   race condition can be used to test for the existence of an
+   arbitrary directory.  However, it _cannot_ be used to write to
+   an arbitrary location.
+
+ * Fixed CVE-2021-23240, a flaw in the temporary file handling of
+   sudoedit's SELinux RBAC support.  On systems where SELinux is
+   enabled, a user with sudoedit permissions may be able to set the
+   owner of an arbitrary file to the user-ID of the target user.
+   On Linux kernels that support "protected symlinks", setting
+   /proc/sys/fs/protected_symlinks to 1 will prevent the bug from
+   being exploited.  For more information see
+   https://www.sudo.ws/alerts/sudoedit_selinux.html.
+
+ * Added writability checks for sudoedit when SELinux RBAC is in use.
+   This makes sudoedit behavior consistent regardless of whether
+   or not SELinux RBAC is in use.  Previously, the "sudoedit_checkdir"
+   setting had no effect for RBAC entries.
+
+ * A new sudoers option "selinux" can be used to disable sudo's
+   SELinux RBAC support.
+
+ * Quieted warnings from PVS Studio, clang analyzer, and cppcheck.
+   Added suppression annotations for PVS Studio false positives.
+
 What's new in Sudo 1.9.4p2
 
  * Fixed a bug introduced in sudo 1.9.4p1 which could lead to a crash
index 192a22a..5bf112d 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for sudo 1.9.4p2.
+# Generated by GNU Autoconf 2.69 for sudo 1.9.5.
 #
 # Report bugs to <https://bugzilla.sudo.ws/>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='sudo'
 PACKAGE_TARNAME='sudo'
-PACKAGE_VERSION='1.9.4p2'
-PACKAGE_STRING='sudo 1.9.4p2'
+PACKAGE_VERSION='1.9.5'
+PACKAGE_STRING='sudo 1.9.5'
 PACKAGE_BUGREPORT='https://bugzilla.sudo.ws/'
 PACKAGE_URL=''
 
@@ -1584,7 +1584,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.4p2 to adapt to many kinds of systems.
+\`configure' configures sudo 1.9.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1650,7 +1650,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of sudo 1.9.4p2:";;
+     short | recursive ) echo "Configuration of sudo 1.9.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1924,7 +1924,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-sudo configure 1.9.4p2
+sudo configure 1.9.5
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2633,7 +2633,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.4p2, which was
+It was created by sudo $as_me 1.9.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2928,8 +2928,6 @@ as_fn_append ac_header_list " sys/statvfs.h"
 as_fn_append ac_func_list " fexecve"
 as_fn_append ac_func_list " killpg"
 as_fn_append ac_func_list " nl_langinfo"
-as_fn_append ac_func_list " pread"
-as_fn_append ac_func_list " pwrite"
 as_fn_append ac_func_list " faccessat"
 as_fn_append ac_func_list " wordexp"
 as_fn_append ac_func_list " getauxval"
@@ -19437,10 +19435,6 @@ done
 
 
 
-
-
-
-
 case "$host_os" in
     hpux*)
        if test X"$ac_cv_func_pread" = X"yes"; then
@@ -19466,6 +19460,58 @@ done
        fi
        ;;
 esac
+for ac_func in pread
+do :
+  ac_fn_c_check_func "$LINENO" "pread" "ac_cv_func_pread"
+if test "x$ac_cv_func_pread" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PREAD 1
+_ACEOF
+
+else
+
+    case " $LIBOBJS " in
+  *" pread.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS pread.$ac_objext"
+ ;;
+esac
+
+
+    for _sym in sudo_pread; do
+       COMPAT_EXP="${COMPAT_EXP}${_sym}
+"
+    done
+
+
+fi
+done
+
+for ac_func in pwrite
+do :
+  ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite"
+if test "x$ac_cv_func_pwrite" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PWRITE 1
+_ACEOF
+
+else
+
+    case " $LIBOBJS " in
+  *" pwrite.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS pwrite.$ac_objext"
+ ;;
+esac
+
+
+    for _sym in sudo_pwrite; do
+       COMPAT_EXP="${COMPAT_EXP}${_sym}
+"
+    done
+
+
+fi
+done
+
 for ac_func in cfmakeraw
 do :
   ac_fn_c_check_func "$LINENO" "cfmakeraw" "ac_cv_func_cfmakeraw"
@@ -22884,7 +22930,8 @@ if test "x$ac_cv_func_getprogname" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_GETPROGNAME 1
 _ACEOF
- for ac_func in setprogname
+
+    for ac_func in setprogname
 do :
   ac_fn_c_check_func "$LINENO" "setprogname" "ac_cv_func_setprogname"
 if test "x$ac_cv_func_setprogname" = xyes; then :
@@ -22892,9 +22939,17 @@ if test "x$ac_cv_func_setprogname" = xyes; then :
 #define HAVE_SETPROGNAME 1
 _ACEOF
 
+else
+
+    for _sym in sudo_setprogname; do
+       COMPAT_EXP="${COMPAT_EXP}${_sym}
+"
+    done
+
 fi
 done
 
+
 else
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __progname" >&5
@@ -22936,6 +22991,12 @@ $as_echo "$sudo_cv___progname" >&6; }
     done
 
 
+    for _sym in sudo_setprogname; do
+       COMPAT_EXP="${COMPAT_EXP}${_sym}
+"
+    done
+
+
 fi
 done
 
@@ -28755,7 +28816,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.4p2, which was
+This file was extended by sudo $as_me 1.9.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -28821,7 +28882,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-sudo config.status 1.9.4p2
+sudo config.status 1.9.5
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index 8af315d..2f68c33 100644 (file)
@@ -3,7 +3,7 @@ dnl Use the top-level autogen.sh script to generate configure and config.h.in
 dnl
 dnl SPDX-License-Identifier: ISC
 dnl
-dnl Copyright (c) 1994-1996, 1998-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+dnl Copyright (c) 1994-1996, 1998-2021 Todd C. Miller <Todd.Miller@sudo.ws>
 dnl
 dnl Permission to use, copy, modify, and distribute this software for any
 dnl purpose with or without fee is hereby granted, provided that the above
@@ -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.59])
-AC_INIT([sudo], [1.9.4p2], [https://bugzilla.sudo.ws/], [sudo])
+AC_INIT([sudo], [1.9.5], [https://bugzilla.sudo.ws/], [sudo])
 AC_CONFIG_HEADERS([config.h pathnames.h])
 AC_CONFIG_SRCDIR([src/sudo.c])
 dnl
@@ -2641,7 +2641,7 @@ dnl
 dnl Function checks
 dnl
 AC_FUNC_GETGROUPS
-AC_CHECK_FUNCS_ONCE([fexecve killpg nl_langinfo pread pwrite faccessat wordexp getauxval fseeko])
+AC_CHECK_FUNCS_ONCE([fexecve killpg nl_langinfo faccessat wordexp getauxval fseeko])
 case "$host_os" in
     hpux*)
        if test X"$ac_cv_func_pread" = X"yes"; then
@@ -2654,6 +2654,14 @@ case "$host_os" in
        fi
        ;;
 esac
+AC_CHECK_FUNCS([pread], [], [
+    AC_LIBOBJ(pread)
+    SUDO_APPEND_COMPAT_EXP(sudo_pread)
+])
+AC_CHECK_FUNCS([pwrite], [], [
+    AC_LIBOBJ(pwrite)
+    SUDO_APPEND_COMPAT_EXP(sudo_pwrite)
+])
 AC_CHECK_FUNCS([cfmakeraw], [], [
     AC_LIBOBJ(cfmakeraw)
     SUDO_APPEND_COMPAT_EXP(sudo_cfmakeraw)
@@ -3301,9 +3309,11 @@ esac
 LIBS="$OLIBS"
 
 dnl
-dnl Check for getprogname() or __progname
+dnl Check for getprogname()/setprogname() or __progname
 dnl
-AC_CHECK_FUNCS([getprogname], [AC_CHECK_FUNCS([setprogname])], [
+AC_CHECK_FUNCS([getprogname], [
+    AC_CHECK_FUNCS([setprogname], [], [SUDO_APPEND_COMPAT_EXP(sudo_setprogname)])
+], [
     AC_MSG_CHECKING([for __progname])
     AC_CACHE_VAL(sudo_cv___progname, [
     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[extern char *__progname; if (__progname[0] == '\0') return 1;]])], [sudo_cv___progname=yes], [sudo_cv___progname=no])])
@@ -3312,6 +3322,7 @@ AC_CHECK_FUNCS([getprogname], [AC_CHECK_FUNCS([setprogname])], [
     fi
     AC_MSG_RESULT($sudo_cv___progname)
     SUDO_APPEND_COMPAT_EXP(sudo_getprogname)
+    SUDO_APPEND_COMPAT_EXP(sudo_setprogname)
 ])
 dnl
 dnl Check for __func__ or __FUNCTION__
index 28a9492..60f193f 100644 (file)
@@ -1,6 +1,6 @@
 Sudo is distributed under the following license:
 
-   Copyright (c) 1994-1996, 1998-2020
+   Copyright (c) 1994-1996, 1998-2021
         Todd C. Miller <Todd.Miller@sudo.ws>
 
    Permission to use, copy, modify, and distribute this software for any
index c193506..6bd08d9 100644 (file)
@@ -2,7 +2,7 @@
 .\"
 .\" SPDX-License-Identifier: ISC
 .\"
-.\" Copyright (c) 1994-1996, 1998-2005, 2007-2020
+.\" Copyright (c) 1994-1996, 1998-2005, 2007-2021
 .\"    Todd C. Miller <Todd.Miller@sudo.ws>
 .\"
 .\" Permission to use, copy, modify, and distribute this software for any
@@ -25,7 +25,7 @@
 .nr BA @BAMAN@
 .nr LC @LCMAN@
 .nr PS @PSMAN@
-.TH "SUDOERS" "@mansectform@" "December 11, 2020" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDOERS" "@mansectform@" "January 8, 2020" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
 .nh
 .if n .ad l
 .SH "NAME"
@@ -3238,6 +3238,16 @@ when running a command or editing a file.
 This flag is
 \fIoff\fR
 by default.
+.if \n(SL \{\
+.TP 18n
+selinux
+If enabled, the user may specify an SELinux role and/or type to use
+when running the command, as permitted by the SELinux policy.
+If SELinux is disabled on the system, this flag has no effect.
+This flag is
+\fIon\fR
+by default.
+.\}
 .TP 18n
 set_home
 If enabled and
index 32ee560..eca83a3 100644 (file)
@@ -97,6 +97,14 @@ s/^\(.TH .*\)/.nr SL @SEMAN@\
 .\\}
            }
        }
+       /^\.TP 18n\nselinux$/,/^\.TP 18n/ {
+           /^\.TP 18n/ {
+               /^\.TP 18n\nselinux$/i\
+.if \\n(SL \\{\\
+               /^\.TP 18n\nselinux$/!i\
+.\\}
+           }
+       }
        /^\.TP 18n\nrole$/,/^\.TP 18n/ {
            /^\.TP 18n/ {
                /^\.TP 18n\nrole$/i\
index cb1b9ad..c14855b 100644 (file)
@@ -1,7 +1,7 @@
 .\"
 .\" SPDX-License-Identifier: ISC
 .\"
-.\" Copyright (c) 1994-1996, 1998-2005, 2007-2020
+.\" Copyright (c) 1994-1996, 1998-2005, 2007-2021
 .\"    Todd C. Miller <Todd.Miller@sudo.ws>
 .\"
 .\" Permission to use, copy, modify, and distribute this software for any
@@ -24,7 +24,7 @@
 .nr BA @BAMAN@
 .nr LC @LCMAN@
 .nr PS @PSMAN@
-.Dd December 11, 2020
+.Dd January 8, 2020
 .Dt SUDOERS @mansectform@
 .Os Sudo @PACKAGE_VERSION@
 .Sh NAME
@@ -3051,6 +3051,15 @@ when running a command or editing a file.
 This flag is
 .Em off
 by default.
+.if \n(SL \{\
+.It selinux
+If enabled, the user may specify an SELinux role and/or type to use
+when running the command, as permitted by the SELinux policy.
+If SELinux is disabled on the system, this flag has no effect.
+This flag is
+.Em on
+by default.
+.\}
 .It set_home
 If enabled and
 .Nm sudo
index af167b8..663ae6d 100644 (file)
@@ -5,7 +5,7 @@
 from sudo clients.
 This makes it possible to have all sudo I/O logs on a central server."
        vendor="Todd C. Miller"
-       copyright="(c) 2019-2020 Todd C. Miller"
+       copyright="(c) 2019-2021 Todd C. Miller"
 
 %if [aix]
        # Convert to 4 part version for AIX, including patch level
index e1ef5cb..fac3b34 100644 (file)
@@ -3,7 +3,7 @@
        summary="Sudo Python plugin framework"
        description="The sudo Python plugin allows you to extend sudo using Python."
        vendor="Todd C. Miller"
-       copyright="(c) 2019-2020 Todd C. Miller"
+       copyright="(c) 2019-2021 Todd C. Miller"
 
 %if [aix]
        # Convert to 4 part version for AIX, including patch level
index 2201125..b4ac0d1 100644 (file)
@@ -10,7 +10,7 @@ limited root privileges to users and log root activity.  \
 The basic philosophy is to give as few privileges as possible but \
 still allow people to get their work done."
        vendor="Todd C. Miller"
-       copyright="(c) 1993-1996,1998-2020 Todd C. Miller"
+       copyright="(c) 1993-1996,1998-2021 Todd C. Miller"
        sudoedit_man=`echo ${pp_destdir}$mandir/*/sudoedit.*|sed "s:^${pp_destdir}::"`
        sudoedit_man_target=`basename $sudoedit_man | sed 's/edit//'`
 
index 019a820..15aeeca 100644 (file)
@@ -575,6 +575,11 @@ sudo_dso_public const char *sudo_getprogname(void);
 # undef getprogname
 # define getprogname() sudo_getprogname()
 #endif /* HAVE_GETPROGNAME */
+#ifndef HAVE_SETPROGNAME
+sudo_dso_public void sudo_setprogname(const char *name);
+# undef setprogname
+# define setprogname(_a) sudo_setprogname(_a)
+#endif /* HAVE_SETPROGNAME */
 #ifndef HAVE_REALLOCARRAY
 sudo_dso_public void *sudo_reallocarray(void *ptr, size_t nmemb, size_t size);
 # undef reallocarray
@@ -595,6 +600,16 @@ sudo_dso_public int sudo_pipe2(int fildes[2], int flags);
 # undef pipe2
 # define pipe2(_a, _b) sudo_pipe2((_a), (_b))
 #endif /* HAVE_PIPE2 */
+#ifndef HAVE_PREAD
+sudo_dso_public int sudo_pread(int fd, void *buf, size_t nbytes, off_t offset);
+# undef pread
+# define pread(_a, _b, _c, _d) sudo_pread((_a), (_b), (_c), (_d))
+#endif /* HAVE_PREAD */
+#ifndef HAVE_PWRITE
+sudo_dso_public int sudo_pwrite(int fd, const void *buf, size_t nbytes, off_t offset);
+# undef pwrite
+# define pwrite(_a, _b, _c, _d) sudo_pwrite((_a), (_b), (_c), (_d))
+#endif /* HAVE_PWRITE */
 #ifndef HAVE_UNLINKAT
 sudo_dso_public int sudo_unlinkat(int dfd, const char *path, int flag);
 # undef unlinkat
index 3448149..eb4c81c 100644 (file)
@@ -244,6 +244,7 @@ sudo_dso_public ssize_t sudo_parseln_v2(char **buf, size_t *bufsize, unsigned in
 
 /* progname.c */
 sudo_dso_public void initprogname(const char *);
+sudo_dso_public void initprogname2(const char *, const char * const *);
 
 /* roundup.c */
 sudo_dso_public unsigned int sudo_pow2_roundup_v1(unsigned int len);
index 08272d8..a9a2793 100644 (file)
@@ -62,7 +62,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index 2da61f9..ae16e2e 100644 (file)
@@ -348,7 +348,7 @@ exec_mailer(int pipein)
 
     /* Set stdin to read side of the pipe. */
     if (dup3(pipein, STDIN_FILENO, 0) == -1) {
-       syslog(LOG_ERR, _("unable to dup stdin: %m"));
+       syslog(LOG_ERR, _("unable to dup stdin: %m")); // -V618
        sudo_debug_printf(SUDO_DEBUG_ERROR,
            "unable to dup stdin: %s", strerror(errno));
        sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
@@ -357,7 +357,7 @@ exec_mailer(int pipein)
 
     /* Build up an argv based on the mailer path and flags */
     if ((mflags = strdup(evl_conf.mailerflags)) == NULL) {
-       syslog(LOG_ERR, _("unable to allocate memory"));
+       syslog(LOG_ERR, _("unable to allocate memory")); // -V618
        sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
        _exit(127);
     }
@@ -393,7 +393,7 @@ exec_mailer(int pipein)
        execve(mpath, argv, root_envp);
     else
        execv(mpath, argv);
-    syslog(LOG_ERR, _("unable to execute %s: %m"), mpath);
+    syslog(LOG_ERR, _("unable to execute %s: %m"), mpath); // -V618
     sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to execute %s: %s",
        mpath, strerror(errno));
     _exit(127);
@@ -441,7 +441,7 @@ send_mail(const struct eventlog *evlog, const char *fmt, ...)
            switch (fork()) {
                case -1:
                    /* Error. */
-                   syslog(LOG_ERR, _("unable to fork: %m"));
+                   syslog(LOG_ERR, _("unable to fork: %m")); // -V618
                    sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to fork: %s",
                        strerror(errno));
                    sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
@@ -485,7 +485,7 @@ send_mail(const struct eventlog *evlog, const char *fmt, ...)
     closefrom_nodebug(STDERR_FILENO + 1);
 
     if (pipe2(pfd, O_CLOEXEC) == -1) {
-       syslog(LOG_ERR, _("unable to open pipe: %m"));
+       syslog(LOG_ERR, _("unable to open pipe: %m")); // -V618
        sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to open pipe: %s",
            strerror(errno));
        sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
@@ -495,7 +495,7 @@ send_mail(const struct eventlog *evlog, const char *fmt, ...)
     switch (pid = sudo_debug_fork()) {
        case -1:
            /* Error. */
-           syslog(LOG_ERR, _("unable to fork: %m"));
+           syslog(LOG_ERR, _("unable to fork: %m")); // -V618
            sudo_debug_printf(
                SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
                "unable to fork");
index 20a840d..2ae9c1b 100644 (file)
@@ -64,7 +64,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index 85db919..84aeaa8 100644 (file)
@@ -591,19 +591,19 @@ iolog_open(struct iolog_file *iol, int dfd, int iofd, const char *mode)
                iol->compressed = iolog_compress;
            } else {
                /* check for gzip magic number */
-               if (read(fd, magic, sizeof(magic)) == ssizeof(magic)) {
+               if (pread(fd, magic, sizeof(magic), 0) == ssizeof(magic)) {
                    if (magic[0] == gzip_magic[0] && magic[1] == gzip_magic[1])
                        iol->compressed = true;
                }
-               (void)lseek(fd, 0, SEEK_SET);
            }
-           (void)fcntl(fd, F_SETFD, FD_CLOEXEC);
+           if (fcntl(fd, F_SETFD, FD_CLOEXEC) != -1) {
 #ifdef HAVE_ZLIB_H
-           if (iol->compressed)
-               iol->fd.g = gzdopen(fd, mode);
-           else
+               if (iol->compressed)
+                   iol->fd.g = gzdopen(fd, mode);
+               else
 #endif
-               iol->fd.f = fdopen(fd, mode);
+                   iol->fd.f = fdopen(fd, mode);
+           }
            if (iol->fd.v != NULL) {
                switch ((flags & O_ACCMODE)) {
                case O_WRONLY:
index 2d031ef..76f7d4c 100644 (file)
@@ -56,7 +56,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index 834d8a4..9b4ff8b 100644 (file)
@@ -92,7 +92,7 @@ SSP_LDFLAGS = @SSP_LDFLAGS@
 SHLIB_VERSION = 0:0:0
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
@@ -985,6 +985,12 @@ pipe2.i: $(srcdir)/pipe2.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
        $(CC) -E -o $@ $(CPPFLAGS) $<
 pipe2.plog: pipe2.i
        rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pipe2.c --i-file $< --output-file $@
+pread.lo: $(srcdir)/pread.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
+       $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pread.c
+pread.i: $(srcdir)/pread.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
+       $(CC) -E -o $@ $(CPPFLAGS) $<
+pread.plog: pread.i
+       rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pread.c --i-file $< --output-file $@
 progname.lo: $(srcdir)/progname.c $(incdir)/compat/stdbool.h \
              $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
              $(top_builddir)/config.h
@@ -1011,6 +1017,12 @@ pw_dup.i: $(srcdir)/pw_dup.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
        $(CC) -E -o $@ $(CPPFLAGS) $<
 pw_dup.plog: pw_dup.i
        rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pw_dup.c --i-file $< --output-file $@
+pwrite.lo: $(srcdir)/pwrite.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
+       $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pwrite.c
+pwrite.i: $(srcdir)/pwrite.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
+       $(CC) -E -o $@ $(CPPFLAGS) $<
+pwrite.plog: pwrite.i
+       rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwrite.c --i-file $< --output-file $@
 reallocarray.lo: $(srcdir)/reallocarray.c $(incdir)/sudo_compat.h \
                  $(top_builddir)/config.h
        $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/reallocarray.c
index 77e3ec2..8e19555 100644 (file)
@@ -142,7 +142,7 @@ _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);
+       memset(rs_buf, 0, KEYSZ + IVSZ); // -V512
        rs_have = sizeof(rs_buf) - KEYSZ - IVSZ;
 }
 
index 2b9bdd0..a12879e 100644 (file)
@@ -278,18 +278,19 @@ sudo_fatal_callback_register_v1(sudo_fatal_callback_t func)
 int
 sudo_fatal_callback_deregister_v1(sudo_fatal_callback_t func)
 {
-    struct sudo_fatal_callback *cb, **prev;
+    struct sudo_fatal_callback *cb, *prev = NULL;
 
     /* Search for callback and remove if found, dupes are not allowed. */
-    SLIST_FOREACH_PREVPTR(cb, prev, &callbacks, entries) {
+    SLIST_FOREACH(cb, &callbacks, entries) {
        if (cb->func == func) {
-           if (cb == SLIST_FIRST(&callbacks))
+           if (prev == NULL)
                SLIST_REMOVE_HEAD(&callbacks, entries);
            else
-               SLIST_REMOVE_AFTER(*prev, entries);
+               SLIST_REMOVE_AFTER(prev, entries);
            free(cb);
            return 0;
        }
+       prev = cb;
     }
 
     return -1;
diff --git a/lib/util/pread.c b/lib/util/pread.c
new file mode 100644 (file)
index 0000000..9328c54
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2020 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 <errno.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+
+#if !defined(HAVE_PREAD) && !defined(HAVE_PREAD64)
+ssize_t
+sudo_pread(int fd, void *buf, size_t nbytes, off_t offset)
+{
+    ssize_t nread;
+    off_t old_offset;
+
+    old_offset = lseek(fd, (off_t)0, SEEK_CUR);
+    if (old_offset == -1 || lseek(fd, offset, SEEK_SET) == -1)
+       return -1;
+
+    nread = read(fd, buf, nbytes);
+    if (lseek(fd, old_offset, SEEK_SET) == -1)
+       return -1;
+
+    return nread;
+}
+#endif /* !HAVE_PREAD && !HAVE_PREAD64 */
index 994a869..57a8c03 100644 (file)
 
 #ifdef HAVE_GETPROGNAME
 
+# ifndef HAVE_SETPROGNAME
+/* Assume __progname if have getprogname(3) but not setprogname(3). */
+extern const char *__progname;
+
 void
-initprogname(const char *name)
+sudo_setprogname(const char *name)
+{
+    const char *base = strrchr(name, '/');
+    __progname = base ? base : name;
+}
+# endif
+
+void
+initprogname2(const char *name, const char * const * allowed)
 {
-# ifdef HAVE_SETPROGNAME
     const char *progname;
+    int i;
 
     /* Fall back on "name" if getprogname() returns an empty string. */
     if ((progname = getprogname()) != NULL && *progname != '\0')
@@ -45,10 +57,21 @@ initprogname(const char *name)
     if (name[0] == 'l' && name[1] == 't' && name[2] == '-' && name[3] != '\0')
        name += 3;
 
+    /* Check allow list if present (first element is the default). */
+    if (allowed != NULL) {
+       for (i = 0; ; i++) {
+           if (allowed[i] == NULL) {
+               name = allowed[0];
+               break;
+           }
+           if (strcmp(allowed[i], name) == 0)
+               break;
+       }
+    }
+
     /* Update internal progname if needed. */
     if (name != progname)
        setprogname(name);
-# endif
     return;
 }
 
@@ -57,8 +80,9 @@ initprogname(const char *name)
 static const char *progname = "";
 
 void
-initprogname(const char *name)
+initprogname2(const char *name, const char * const * allowed)
 {
+    int i;
 # ifdef HAVE___PROGNAME
     extern const char *__progname;
 
@@ -76,6 +100,18 @@ initprogname(const char *name)
     if (progname[0] == 'l' && progname[1] == 't' && progname[2] == '-' &&
        progname[3] != '\0')
        progname += 3;
+
+    /* Check allow list if present (first element is the default). */
+    if (allowed != NULL) {
+       for (i = 0; ; i++) {
+           if (allowed[i] == NULL) {
+               progname = allowed[0];
+               break;
+           }
+           if (strcmp(allowed[i], progname) == 0)
+               break;
+       }
+    }
 }
 
 const char *
@@ -83,4 +119,17 @@ sudo_getprogname(void)
 {
     return progname;
 }
+
+void
+sudo_setprogname(const char *name)
+{
+    const char *base = strrchr(name, '/');
+    progname = base ? base : name;
+}
 #endif /* !HAVE_GETPROGNAME */
+
+void
+initprogname(const char *name)
+{
+    initprogname2(name, NULL);
+}
diff --git a/lib/util/pwrite.c b/lib/util/pwrite.c
new file mode 100644 (file)
index 0000000..48f8cbf
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2020 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 <errno.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+
+#if !defined(HAVE_PWRITE) && !defined(HAVE_PWRITE64)
+ssize_t
+sudo_pwrite(int fd, const void *buf, size_t nbytes, off_t offset)
+{
+    ssize_t nwritten;
+    off_t old_offset;
+
+    old_offset = lseek(fd, (off_t)0, SEEK_CUR);
+    if (old_offset == -1 || lseek(fd, offset, SEEK_SET) == -1)
+       return -1;
+
+    nwritten = write(fd, buf, nbytes);
+    if (lseek(fd, old_offset, SEEK_SET) == -1)
+       return -1;
+
+    return nwritten;
+}
+#endif /* HAVE_PWRITE && !HAVE_PWRITE64 */
index 6822b00..50c1845 100644 (file)
@@ -180,7 +180,10 @@ sudo_debug_new_output(struct sudo_debug_instance *instance,
        }
        ignore_result(fchown(output->fd, (uid_t)-1, 0));
     }
-    (void)fcntl(output->fd, F_SETFD, FD_CLOEXEC);
+    if (fcntl(output->fd, F_SETFD, FD_CLOEXEC) == -1) {
+       sudo_warn_nodebug("%s", output->filename);
+       goto bad;
+    }
     if (sudo_debug_fds_size < output->fd) {
        /* Bump fds size to the next multiple of 4 * NBBY. */
        const int old_size = sudo_debug_fds_size / NBBY;
@@ -236,6 +239,7 @@ sudo_debug_new_output(struct sudo_debug_instance *instance,
 
     return output;
 oom:
+    // -V:sudo_warn_nodebug:575, 618
     sudo_warn_nodebug(NULL);
 bad:
     if (output != NULL)
index 6095623..b0b56f0 100644 (file)
@@ -1,4 +1,5 @@
 @COMPAT_EXP@initprogname
+initprogname2
 sudo_conf_askpass_path_v1
 sudo_conf_clear_paths_v1
 sudo_conf_debug_files_v1
index 2be6709..2dcde18 100644 (file)
@@ -79,7 +79,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index d01c62e..66b84c2 100644 (file)
@@ -735,7 +735,7 @@ shutdown_cb(int unused, int what, void *v)
 static void
 server_shutdown(struct sudo_event_base *base)
 {
-    struct connection_closure *closure;
+    struct connection_closure *closure, *next;
     struct sudo_event *ev;
     struct timespec tv = { 0, 0 };
     debug_decl(server_shutdown, SUDO_DEBUG_UTIL);
@@ -745,7 +745,7 @@ server_shutdown(struct sudo_event_base *base)
        debug_return;
     }
 
-    TAILQ_FOREACH(closure, &connections, entries) {
+    TAILQ_FOREACH_SAFE(closure, &connections, entries, next) {
        closure->state = SHUTDOWN;
        sudo_ev_del(base, closure->read_ev);
        if (closure->log_io) {
@@ -761,13 +761,15 @@ server_shutdown(struct sudo_event_base *base)
        }
     }
 
-    /* We need a timed event to exit even if clients time out. */
-    ev = sudo_ev_alloc(-1, SUDO_EV_TIMEOUT, shutdown_cb, base);
-    if (ev != NULL) {
-       tv.tv_sec = SHUTDOWN_TIMEO;
-       if (sudo_ev_add(base, ev, &tv, false) == -1) {
-           sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
-               "unable to add shutdown event");
+    if (!TAILQ_EMPTY(&connections)) {
+       /* We need a timed event to exit even if clients time out. */
+       ev = sudo_ev_alloc(-1, SUDO_EV_TIMEOUT, shutdown_cb, base);
+       if (ev != NULL) {
+           tv.tv_sec = SHUTDOWN_TIMEO;
+           if (sudo_ev_add(base, ev, &tv, false) == -1) {
+               sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+                   "unable to add shutdown event");
+           }
        }
     }
 
index bd98cba..1172e8e 100644 (file)
@@ -69,7 +69,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index 64adcb7..acc4360 100644 (file)
@@ -456,7 +456,7 @@ audit_write_exit_record(int exit_status, int error)
                    goto oom;
             } else {
                json_value.type = JSON_STRING;
-               json_value.u.string = signame;
+               json_value.u.string = signame; // -V507
                if (!sudo_json_add_value(&json, "signal", &json_value))
                    goto oom;
            }
index f528233..ab49bec 100644 (file)
@@ -72,7 +72,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index c8f5138..142fd39 100644 (file)
@@ -64,8 +64,12 @@ mysetgrent(void)
 {
     if (grf == NULL) {
        grf = fopen(grfile, "r");
-       if (grf != NULL)
-           (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
+       if (grf != NULL) {
+           if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) {
+               fclose(grf);
+               grf = NULL;
+           }
+       }
     } else {
        rewind(grf);
     }
@@ -139,7 +143,10 @@ mygetgrnam(const char *name)
     if (grf == NULL) {
        if ((grf = fopen(grfile, "r")) == NULL)
            return NULL;
-       (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
+       if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) {
+           fclose(grf);
+           return NULL;
+       }
     } else {
        rewind(grf);
     }
@@ -162,7 +169,10 @@ mygetgrgid(gid_t gid)
     if (grf == NULL) {
        if ((grf = fopen(grfile, "r")) == NULL)
            return NULL;
-       (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
+       if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) {
+           fclose(grf);
+           return NULL;
+       }
     } else {
        rewind(grf);
     }
index 701d665..3d94e68 100644 (file)
@@ -108,7 +108,7 @@ group_plugin_load(char *plugin_info)
 
     if (SUDO_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) {
        fprintf(stderr,
-           "%s: incompatible group plugin major version %d, expected %d\n",
+           "%s: incompatible group plugin major version %u, expected %d\n",
            path, SUDO_API_VERSION_GET_MAJOR(group_plugin->version),
            GROUP_API_VERSION_MAJOR);
        return -1;
index cab41a1..5315ff0 100644 (file)
@@ -76,7 +76,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index 91cd3df..67e6d96 100644 (file)
@@ -50,11 +50,11 @@ _sudo_ConvMessage__Init(PyObject *py_self, PyObject *py_args, PyObject *py_kwarg
         goto cleanup;
 
     py_object_set_attr_number(py_self, "timeout", conv_message.timeout);
-    if (PyErr_Occurred())
+    if (PyErr_Occurred()) // -V547
         goto cleanup;
 
     py_object_set_attr_string(py_self, "msg", conv_message.msg);
-    if (PyErr_Occurred())
+    if (PyErr_Occurred()) // -V547
         goto cleanup;
 
 cleanup:
@@ -113,11 +113,11 @@ sudo_module_ConvMessage_to_c(PyObject *py_conv_message, struct sudo_conv_message
         debug_return_int(SUDO_RC_ERROR);
 
     conv_message->timeout = (int)py_object_get_optional_attr_number(py_conv_message, "timeout");
-    if (PyErr_Occurred())
+    if (PyErr_Occurred()) // -V547
         debug_return_int(SUDO_RC_ERROR);
 
     conv_message->msg = py_object_get_optional_attr_string(py_conv_message, "msg");
-    if (PyErr_Occurred())
+    if (PyErr_Occurred()) // -V547
         debug_return_int(SUDO_RC_ERROR);
 
     debug_return_int(SUDO_RC_OK);
index a2b98ee..2bce36c 100644 (file)
@@ -35,6 +35,8 @@ _verify_import(const char *file_path)
 {
     debug_decl(_verify_import, PYTHON_DEBUG_INTERNAL);
 
+    // Check mode and owner similar to what we do in open_sudoers().
+    // This is to help avoid loading a potentially insecure module.
     struct stat sb;
     if (stat(file_path, &sb) != 0) {
         PyErr_Format(PyExc_ImportError, "Failed to stat file '%s'", file_path);
index 25a51dd..82bcfd7 100644 (file)
@@ -71,7 +71,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index 86894a6..3e876b1 100644 (file)
@@ -69,7 +69,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index b1d4ad3..5aeeae6 100644 (file)
@@ -101,7 +101,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
@@ -1662,10 +1662,9 @@ kerb5.i: $(authdir)/kerb5.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \
        $(CC) -E -o $@ $(CPPFLAGS) $<
 kerb5.plog: kerb5.i
        rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/kerb5.c --i-file $< --output-file $@
-ldap.lo: $(srcdir)/ldap.c $(devdir)/def_data.h $(devdir)/gram.h \
-         $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
-         $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \
-         $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ldap.lo: $(srcdir)/ldap.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
+         $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+         $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
          $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \
          $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
          $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \
@@ -1673,10 +1672,9 @@ ldap.lo: $(srcdir)/ldap.c $(devdir)/def_data.h $(devdir)/gram.h \
          $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \
          $(top_builddir)/config.h $(top_builddir)/pathnames.h
        $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ldap.c
-ldap.i: $(srcdir)/ldap.c $(devdir)/def_data.h $(devdir)/gram.h \
-         $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
-         $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \
-         $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ldap.i: $(srcdir)/ldap.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
+         $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+         $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
          $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \
          $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
          $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \
@@ -2308,10 +2306,9 @@ solaris_audit.i: $(srcdir)/solaris_audit.c $(devdir)/def_data.h \
        $(CC) -E -o $@ $(CPPFLAGS) $<
 solaris_audit.plog: solaris_audit.i
        rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/solaris_audit.c --i-file $< --output-file $@
-sssd.lo: $(srcdir)/sssd.c $(devdir)/def_data.h $(devdir)/gram.h \
-         $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
-         $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \
-         $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+sssd.lo: $(srcdir)/sssd.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
+         $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+         $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
          $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \
          $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
          $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \
@@ -2319,10 +2316,9 @@ sssd.lo: $(srcdir)/sssd.c $(devdir)/def_data.h $(devdir)/gram.h \
          $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \
          $(top_builddir)/pathnames.h
        $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sssd.c
-sssd.i: $(srcdir)/sssd.c $(devdir)/def_data.h $(devdir)/gram.h \
-         $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
-         $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \
-         $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+sssd.i: $(srcdir)/sssd.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
+         $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+         $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
          $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \
          $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
          $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \
index 53890c2..eb75dcd 100644 (file)
@@ -252,7 +252,7 @@ sudo_pam_init2(struct passwd *pw, sudo_auth *auth, bool quiet)
     if (ttypath == NULL)
        ttypath = "";
 #endif
-    if (ttypath != NULL) {
+    if (ttypath != NULL) { // -V547
        rc = pam_set_item(pamh, PAM_TTY, ttypath);
        if (rc != PAM_SUCCESS) {
            errstr = sudo_pam_strerror(pamh, rc);
index 181b5ed..4a7bb5e 100644 (file)
@@ -33,6 +33,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include <time.h>
 #include <errno.h>
 #include <pwd.h>
@@ -231,11 +232,12 @@ done:
 static bool
 display_lecture(int status)
 {
-    FILE *fp;
-    char buf[BUFSIZ];
-    ssize_t nread;
     struct sudo_conv_message msg;
     struct sudo_conv_reply repl;
+    char buf[BUFSIZ];
+    struct stat sb;
+    ssize_t nread;
+    int fd;
     debug_decl(lecture, SUDOERS_DEBUG_AUTH);
 
     if (def_lecture == never ||
@@ -245,24 +247,46 @@ display_lecture(int status)
     memset(&msg, 0, sizeof(msg));
     memset(&repl, 0, sizeof(repl));
 
-    if (def_lecture_file && (fp = fopen(def_lecture_file, "r")) != NULL) {
-       while ((nread = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) != 0) {
-           buf[nread] = '\0';
-           msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY;
-           msg.msg = buf;
-           sudo_conv(1, &msg, &repl, NULL);
+    if (def_lecture_file) {
+       fd = open(def_lecture_file, O_RDONLY|O_NONBLOCK);
+       if (fd != -1 && fstat(fd, &sb) == 0) {
+           if (S_ISREG(sb.st_mode)) {
+               (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
+               while ((nread = read(fd, buf, sizeof(buf) - 1)) > 0) {
+                   buf[nread] = '\0';
+                   msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY;
+                   msg.msg = buf;
+                   sudo_conv(1, &msg, &repl, NULL);
+               }
+               close(fd);
+               if (nread == -1) {
+                   log_warning(SLOG_RAW_MSG,
+                       N_("error reading lecture file %s"), def_lecture_file);
+                   debug_return_bool(false);
+               }
+               debug_return_bool(true);
+           } else {
+               log_warningx(SLOG_RAW_MSG,
+                   N_("ignoring lecture file %s: not a regular file"),
+                   def_lecture_file);
+           }
+       } else {
+           log_warning(SLOG_RAW_MSG|SLOG_NO_STDERR, N_("unable to open %s"),
+               def_lecture_file);
        }
-       fclose(fp);
-    } else {
-       msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY;
-       msg.msg = _("\n"
-           "We trust you have received the usual lecture from the local System\n"
-           "Administrator. It usually boils down to these three things:\n\n"
-           "    #1) Respect the privacy of others.\n"
-           "    #2) Think before you type.\n"
-           "    #3) With great power comes great responsibility.\n\n");
-       sudo_conv(1, &msg, &repl, NULL);
+       if (fd != -1)
+           close(fd);
     }
+
+    /* Default sudo lecture. */
+    msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY;
+    msg.msg = _("\n"
+       "We trust you have received the usual lecture from the local System\n"
+       "Administrator. It usually boils down to these three things:\n\n"
+       "    #1) Respect the privacy of others.\n"
+       "    #2) Think before you type.\n"
+       "    #3) With great power comes great responsibility.\n\n");
+    sudo_conv(1, &msg, &repl, NULL);
     debug_return_bool(true);
 }
 
index 7e4ec11..56cd224 100644 (file)
@@ -570,6 +570,10 @@ struct sudo_defs_types sudo_defs_table[] = {
        N_("The format of logs to produce: %s"),
        def_data_log_format,
     }, {
+       "selinux", T_FLAG,
+       N_("Enable SELinux RBAC support"),
+       NULL,
+    }, {
        NULL, 0, NULL
     }
 };
index 3c6a668..5c712b8 100644 (file)
 #define def_runchroot           (sudo_defs_table[I_RUNCHROOT].sd_un.str)
 #define I_LOG_FORMAT            130
 #define def_log_format          (sudo_defs_table[I_LOG_FORMAT].sd_un.tuple)
+#define I_SELINUX               131
+#define def_selinux             (sudo_defs_table[I_SELINUX].sd_un.flag)
 
 enum def_tuple {
     never,
index 4f18d6a..e8162e8 100644 (file)
@@ -409,3 +409,6 @@ log_format
        T_TUPLE
        "The format of logs to produce: %s"
        sudo json
+selinux
+       T_FLAG
+       "Enable SELinux RBAC support"
index bfc2652..8bc48b7 100644 (file)
@@ -526,6 +526,9 @@ init_defaults(void)
 #else
     def_pam_session = true;
 #endif
+#ifdef HAVE_SELINUX
+    def_selinux = true;
+#endif
 #ifdef HAVE_INNETGR
     def_use_netgroups = true;
 #endif
index 48d06a7..a0cd63d 100644 (file)
@@ -123,7 +123,7 @@ resolve_editor(const char *ed, size_t edlen, int nfiles, char **files,
     int *argc_out, char ***argv_out, char * const *allowlist)
 {
     char **nargv = NULL, *editor = NULL, *editor_path = NULL;
-    const char *cp, *ep, *tmp;
+    const char *tmp, *cp, *ep = NULL;
     const char *edend = ed + edlen;
     struct stat user_editor_sb;
     int nargc;
index e14bac0..07961a4 100644 (file)
@@ -177,7 +177,7 @@ sudoers_defaults_list_to_tags(struct defaults_list *defs, struct cmndtag *tags)
     struct defaults *d;
     debug_decl(sudoers_defaults_list_to_tags, SUDOERS_DEBUG_UTIL);
 
-    TAGS_INIT(*tags);
+    TAGS_INIT(tags);
     if (defs != NULL) {
        TAILQ_FOREACH(d, defs, entries) {
            if (!sudoers_defaults_to_tags(d->var, d->val, d->op, tags)) {
index 8cd2cbc..b7d08d6 100644 (file)
@@ -29,6 +29,9 @@
 /* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
 /* SUPPRESS 288 on yyerrlab *//* Label unused */
 
+/* PVS Studio suppression*/
+/* -V::1037, 1042*/
+
 #include <config.h>
 
 #include <stdio.h>
@@ -106,7 +109,7 @@ static int  yyerror(const char *s);
 static int     yylex(void);
        int     yyparse(void);
 
-#line 94 "getdate.y"
+#line 97 "getdate.y"
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
@@ -114,7 +117,7 @@ typedef union {
     enum _MERIDIAN     Meridian;
 } YYSTYPE;
 #endif /* YYSTYPE_DEFINED */
-#line 112 "getdate.c"
+#line 115 "getdate.c"
 #define tAGO 257
 #define tDAY 258
 #define tDAYZONE 259
@@ -129,11 +132,7 @@ typedef union {
 #define tZONE 268
 #define tDST 269
 #define YYERRCODE 256
-#if defined(__cplusplus) || defined(__STDC__)
 const short yylhs[] =
-#else
-short yylhs[] =
-#endif
        {                                        -1,
     0,    0,    2,    2,    2,    2,    2,    2,    3,    3,
     3,    3,    3,    4,    4,    4,    6,    6,    6,    5,
@@ -141,11 +140,7 @@ short yylhs[] =
     9,    9,    9,    9,    9,    9,    9,    9,    8,    1,
     1,
 };
-#if defined(__cplusplus) || defined(__STDC__)
 const short yylen[] =
-#else
-short yylen[] =
-#endif
        {                                         2,
     0,    2,    1,    1,    1,    1,    1,    1,    2,    4,
     4,    6,    6,    1,    1,    2,    1,    2,    2,    3,
@@ -153,11 +148,7 @@ short yylen[] =
     2,    1,    2,    2,    1,    2,    2,    1,    1,    0,
     1,
 };
-#if defined(__cplusplus) || defined(__STDC__)
 const short yydefred[] =
-#else
-short yydefred[] =
-#endif
        {                                      1,
     0,    0,   15,   32,    0,   38,   35,    0,    0,    0,
     2,    3,    4,    5,    6,    7,    8,    0,   18,    0,
@@ -165,50 +156,30 @@ short yydefred[] =
     0,    0,   16,   28,    0,   23,   27,   22,    0,    0,
    25,   41,   11,    0,   10,    0,    0,   21,   13,   12,
 };
-#if defined(__cplusplus) || defined(__STDC__)
 const short yydgoto[] =
-#else
-short yydgoto[] =
-#endif
        {                                       1,
    45,   11,   12,   13,   14,   15,   16,   17,   18,
 };
-#if defined(__cplusplus) || defined(__STDC__)
 const short yysindex[] =
-#else
-short yysindex[] =
-#endif
        {                                      0,
  -249,  -38,    0,    0, -260,    0,    0, -240,  -47, -248,
     0,    0,    0,    0,    0,    0,    0, -237,    0,  -18,
     0,    0,    0,    0,    0,    0, -262,    0,    0, -239,
  -238, -236,    0,    0, -235,    0,    0,    0,  -56,  -19,
     0,    0,    0, -234,    0, -232, -258,    0,    0,    0,};
-#if defined(__cplusplus) || defined(__STDC__)
 const short yyrindex[] =
-#else
-short yyrindex[] =
-#endif
        {                                      0,
     0,    1,    0,    0,    0,    0,    0,    0,   69,   12,
     0,    0,    0,    0,    0,    0,    0,   23,    0,   34,
     0,    0,    0,    0,    0,    0,   67,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,   56,   45,
     0,    0,    0,    0,    0,    0,   56,    0,    0,    0,};
-#if defined(__cplusplus) || defined(__STDC__)
 const short yygindex[] =
-#else
-short yygindex[] =
-#endif
        {                                      0,
   -17,    0,    0,    0,    0,    0,    0,    0,    0,
 };
 #define YYTABLESIZE 337
-#if defined(__cplusplus) || defined(__STDC__)
 const short yytable[] =
-#else
-short yytable[] =
-#endif
        {                                      32,
    17,   44,   42,   36,   37,   19,   20,   49,    2,    3,
    31,   14,    4,    5,    6,    7,    8,    9,   10,   34,
@@ -245,11 +216,7 @@ short yytable[] =
    40,    0,   40,   40,   26,   26,    0,   39,   26,   26,
    26,   26,    0,    0,   26,   39,   39,
 };
-#if defined(__cplusplus) || defined(__STDC__)
 const short yycheck[] =
-#else
-short yycheck[] =
-#endif
        {                                      47,
     0,   58,  261,  266,  267,   44,  267,  266,  258,  259,
    58,    0,  262,  263,  264,  265,  266,  267,  268,  257,
@@ -292,11 +259,7 @@ short yycheck[] =
 #endif
 #define YYMAXTOKEN 269
 #if YYDEBUG
-#if defined(__cplusplus) || defined(__STDC__)
 const char * const yyname[] =
-#else
-char *yyname[] =
-#endif
        {
 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,"','",0,0,"'/'",0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0,0,0,0,0,
@@ -308,11 +271,7 @@ char *yyname[] =
 "tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT",
 "tSNUMBER","tUNUMBER","tZONE","tDST",
 };
-#if defined(__cplusplus) || defined(__STDC__)
 const char * const yyrule[] =
-#else
-char *yyrule[] =
-#endif
        {"$accept : spec",
 "spec :",
 "spec : spec item",
@@ -383,7 +342,7 @@ short *yysslim;
 YYSTYPE *yyvs;
 unsigned int yystacksize;
 int yyparse(void);
-#line 313 "getdate.y"
+#line 316 "getdate.y"
 
 /* Month and day table. */
 static TABLE const MonthDayTable[] = {
@@ -1005,13 +964,9 @@ main(int argc, char *argv[])
     /* NOTREACHED */
 }
 #endif /* TEST */
-#line 951 "getdate.c"
+#line 954 "getdate.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
-#if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
-#else
-static int yygrowstack()
-#endif
 {
     unsigned int newsize;
     long sslen;
@@ -1027,23 +982,19 @@ static int yygrowstack()
 #ifdef SIZE_MAX
 #define YY_SIZE_MAX SIZE_MAX
 #else
-#ifdef __STDC__
 #define YY_SIZE_MAX 0xffffffffU
-#else
-#define YY_SIZE_MAX (unsigned int)0xffffffff
-#endif
 #endif
     if (YY_SIZE_MAX / newsize < sizeof *newss)
         goto bail;
     sslen = yyssp - yyss;
-    newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
-      (short *)malloc(newsize * sizeof *newss); /* overflow check above */
+    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 ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
-      (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */
+    newvs = yyvs ? realloc(yyvs, newsize * sizeof *newvs) :
+      malloc(newsize * sizeof *newvs); /* overflow check above */
     if (newvs == NULL)
         goto bail;
     yyvs = newvs;
@@ -1052,10 +1003,8 @@ static int yygrowstack()
     yysslim = yyss + newsize - 1;
     return 0;
 bail:
-    if (yyss)
-            free(yyss);
-    if (yyvs)
-            free(yyvs);
+    free(yyss);
+    free(yyvs);
     yyss = yyssp = NULL;
     yyvs = yyvsp = NULL;
     yystacksize = 0;
@@ -1067,19 +1016,11 @@ bail:
 #define YYACCEPT goto yyaccept
 #define YYERROR goto yyerrlab
 int
-#if defined(__cplusplus) || defined(__STDC__)
 yyparse(void)
-#else
-yyparse()
-#endif
 {
     int yym, yyn, yystate;
 #if YYDEBUG
-#if defined(__cplusplus) || defined(__STDC__)
     const char *yys;
-#else /* !(defined(__cplusplus) || defined(__STDC__)) */
-    char *yys;
-#endif /* !(defined(__cplusplus) || defined(__STDC__)) */
 
     if ((yys = getenv("YYDEBUG")))
     {
@@ -1214,37 +1155,37 @@ yyreduce:
     switch (yyn)
     {
 case 3:
-#line 112 "getdate.y"
+#line 115 "getdate.y"
 {
            yyHaveTime++;
        }
 break;
 case 4:
-#line 115 "getdate.y"
+#line 118 "getdate.y"
 {
            yyHaveZone++;
        }
 break;
 case 5:
-#line 118 "getdate.y"
+#line 121 "getdate.y"
 {
            yyHaveDate++;
        }
 break;
 case 6:
-#line 121 "getdate.y"
+#line 124 "getdate.y"
 {
            yyHaveDay++;
        }
 break;
 case 7:
-#line 124 "getdate.y"
+#line 127 "getdate.y"
 {
            yyHaveRel++;
        }
 break;
 case 9:
-#line 130 "getdate.y"
+#line 133 "getdate.y"
 {
            yyHour = yyvsp[-1].Number;
            yyMinutes = 0;
@@ -1253,7 +1194,7 @@ case 9:
        }
 break;
 case 10:
-#line 136 "getdate.y"
+#line 139 "getdate.y"
 {
            yyHour = yyvsp[-3].Number;
            yyMinutes = yyvsp[-1].Number;
@@ -1262,7 +1203,7 @@ case 10:
        }
 break;
 case 11:
-#line 142 "getdate.y"
+#line 145 "getdate.y"
 {
            yyHour = yyvsp[-3].Number;
            yyMinutes = yyvsp[-1].Number;
@@ -1272,7 +1213,7 @@ case 11:
        }
 break;
 case 12:
-#line 149 "getdate.y"
+#line 152 "getdate.y"
 {
            yyHour = yyvsp[-5].Number;
            yyMinutes = yyvsp[-3].Number;
@@ -1281,7 +1222,7 @@ case 12:
        }
 break;
 case 13:
-#line 155 "getdate.y"
+#line 158 "getdate.y"
 {
            yyHour = yyvsp[-5].Number;
            yyMinutes = yyvsp[-3].Number;
@@ -1292,56 +1233,56 @@ case 13:
        }
 break;
 case 14:
-#line 165 "getdate.y"
+#line 168 "getdate.y"
 {
            yyTimezone = yyvsp[0].Number;
            yyDSTmode = DSToff;
        }
 break;
 case 15:
-#line 169 "getdate.y"
+#line 172 "getdate.y"
 {
            yyTimezone = yyvsp[0].Number;
            yyDSTmode = DSTon;
        }
 break;
 case 16:
-#line 174 "getdate.y"
+#line 177 "getdate.y"
 {
            yyTimezone = yyvsp[-1].Number;
            yyDSTmode = DSTon;
        }
 break;
 case 17:
-#line 180 "getdate.y"
+#line 183 "getdate.y"
 {
            yyDayOrdinal = 1;
            yyDayNumber = yyvsp[0].Number;
        }
 break;
 case 18:
-#line 184 "getdate.y"
+#line 187 "getdate.y"
 {
            yyDayOrdinal = 1;
            yyDayNumber = yyvsp[-1].Number;
        }
 break;
 case 19:
-#line 188 "getdate.y"
+#line 191 "getdate.y"
 {
            yyDayOrdinal = yyvsp[-1].Number;
            yyDayNumber = yyvsp[0].Number;
        }
 break;
 case 20:
-#line 194 "getdate.y"
+#line 197 "getdate.y"
 {
            yyMonth = yyvsp[-2].Number;
            yyDay = yyvsp[0].Number;
        }
 break;
 case 21:
-#line 198 "getdate.y"
+#line 201 "getdate.y"
 {
            if (yyvsp[-4].Number >= 100) {
                yyYear = yyvsp[-4].Number;
@@ -1355,7 +1296,7 @@ case 21:
        }
 break;
 case 22:
-#line 209 "getdate.y"
+#line 212 "getdate.y"
 {
            /* ISO 8601 format.  yyyy-mm-dd.  */
            yyYear = yyvsp[-2].Number;
@@ -1364,7 +1305,7 @@ case 22:
        }
 break;
 case 23:
-#line 215 "getdate.y"
+#line 218 "getdate.y"
 {
            /* e.g. 17-JUN-1992.  */
            yyDay = yyvsp[-2].Number;
@@ -1373,14 +1314,14 @@ case 23:
        }
 break;
 case 24:
-#line 221 "getdate.y"
+#line 224 "getdate.y"
 {
            yyMonth = yyvsp[-1].Number;
            yyDay = yyvsp[0].Number;
        }
 break;
 case 25:
-#line 225 "getdate.y"
+#line 228 "getdate.y"
 {
            yyMonth = yyvsp[-3].Number;
            yyDay = yyvsp[-2].Number;
@@ -1388,14 +1329,14 @@ case 25:
        }
 break;
 case 26:
-#line 230 "getdate.y"
+#line 233 "getdate.y"
 {
            yyMonth = yyvsp[0].Number;
            yyDay = yyvsp[-1].Number;
        }
 break;
 case 27:
-#line 234 "getdate.y"
+#line 237 "getdate.y"
 {
            yyMonth = yyvsp[-1].Number;
            yyDay = yyvsp[-2].Number;
@@ -1403,68 +1344,68 @@ case 27:
        }
 break;
 case 28:
-#line 241 "getdate.y"
+#line 244 "getdate.y"
 {
            yyRelSeconds = -yyRelSeconds;
            yyRelMonth = -yyRelMonth;
        }
 break;
 case 30:
-#line 248 "getdate.y"
+#line 251 "getdate.y"
 {
            yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
        }
 break;
 case 31:
-#line 251 "getdate.y"
+#line 254 "getdate.y"
 {
            yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
        }
 break;
 case 32:
-#line 254 "getdate.y"
+#line 257 "getdate.y"
 {
            yyRelSeconds += yyvsp[0].Number * 60L;
        }
 break;
 case 33:
-#line 257 "getdate.y"
+#line 260 "getdate.y"
 {
            yyRelSeconds += yyvsp[-1].Number;
        }
 break;
 case 34:
-#line 260 "getdate.y"
+#line 263 "getdate.y"
 {
            yyRelSeconds += yyvsp[-1].Number;
        }
 break;
 case 35:
-#line 263 "getdate.y"
+#line 266 "getdate.y"
 {
            yyRelSeconds++;
        }
 break;
 case 36:
-#line 266 "getdate.y"
+#line 269 "getdate.y"
 {
            yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
        }
 break;
 case 37:
-#line 269 "getdate.y"
+#line 272 "getdate.y"
 {
            yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
        }
 break;
 case 38:
-#line 272 "getdate.y"
+#line 275 "getdate.y"
 {
            yyRelMonth += yyvsp[0].Number;
        }
 break;
 case 39:
-#line 277 "getdate.y"
+#line 280 "getdate.y"
 {
            if (yyHaveTime && yyHaveDate && !yyHaveRel)
                yyYear = yyvsp[0].Number;
@@ -1492,18 +1433,18 @@ case 39:
        }
 break;
 case 40:
-#line 304 "getdate.y"
+#line 307 "getdate.y"
 {
            yyval.Meridian = MER24;
        }
 break;
 case 41:
-#line 307 "getdate.y"
+#line 310 "getdate.y"
 {
            yyval.Meridian = yyvsp[0].Meridian;
        }
 break;
-#line 1449 "getdate.c"
+#line 1434 "getdate.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
@@ -1556,19 +1497,15 @@ to state %d\n", YYPREFIX, *yyssp, yystate);
 yyoverflow:
     yyerror("yacc stack overflow");
 yyabort:
-    if (yyss)
-            free(yyss);
-    if (yyvs)
-            free(yyvs);
+    free(yyss);
+    free(yyvs);
     yyss = yyssp = NULL;
     yyvs = yyvsp = NULL;
     yystacksize = 0;
     return (1);
 yyaccept:
-    if (yyss)
-            free(yyss);
-    if (yyvs)
-            free(yyvs);
+    free(yyss);
+    free(yyvs);
     yyss = yyssp = NULL;
     yyvs = yyvsp = NULL;
     yystacksize = 0;
index 531705f..6e424a7 100644 (file)
@@ -12,6 +12,9 @@
 /* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
 /* SUPPRESS 288 on yyerrlab *//* Label unused */
 
+// PVS Studio suppression
+// -V::1037, 1042
+
 #include <config.h>
 
 #include <stdio.h>
index 9f12c40..c4c8bbd 100644 (file)
@@ -55,7 +55,7 @@ sudo_goodpath(const char *path, const char *runchroot, struct stat *sbp)
                errno = ENAMETOOLONG;
                goto done;
            }
-           path = pathbuf;
+           path = pathbuf; // -V507
        }
        if (sbp == NULL)
            sbp = &sb;
index abd299b..0bb7285 100644 (file)
 /* If we last saw a newline the entry is on the preceding line. */
 #define this_lineno    (sudoerschar == '\n' ? sudolineno - 1 : sudolineno)
 
+// PVS Studio suppression
+// -V::1037, 1042
+
 /*
  * Globals
  */
@@ -159,7 +162,7 @@ static struct sudo_command *new_command(char *, char *);
 static struct command_digest *new_digest(int, char *);
 static void alias_error(const char *name, int errnum);
 
-#line 157 "gram.c"
+#line 160 "gram.c"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -316,7 +319,7 @@ extern int sudoersdebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 80 "gram.y"
+#line 83 "gram.y"
 
     struct cmndspec *cmndspec;
     struct defaults *defaults;
@@ -330,7 +333,7 @@ union YYSTYPE
     char *string;
     int tok;
 
-#line 328 "gram.c"
+#line 331 "gram.c"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -836,21 +839,21 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   189,   189,   192,   195,   196,   199,   202,   205,   212,
-     219,   225,   228,   231,   234,   237,   241,   245,   249,   253,
-     259,   262,   268,   271,   277,   278,   284,   291,   298,   305,
-     312,   321,   322,   326,   332,   346,   350,   356,   363,   370,
-     377,   384,   393,   394,   453,   508,   515,   522,   529,   538,
-     539,   545,   548,   569,   573,   579,   591,   603,   608,   612,
-     617,   622,   627,   631,   636,   639,   644,   659,   668,   677,
-     686,   703,   704,   705,   706,   707,   708,   709,   710,   711,
-     712,   715,   721,   724,   728,   732,   740,   748,   759,   765,
-     771,   777,   785,   788,   791,   794,   797,   800,   803,   806,
-     809,   812,   815,   818,   821,   824,   827,   832,   839,   846,
-     862,   863,   866,   866,   876,   879,   880,   886,   887,   890,
-     890,   900,   903,   904,   910,   911,   914,   914,   924,   927,
-     928,   931,   931,   941,   944,   945,   951,   955,   961,   968,
-     975,   982,   989,   998,   999,  1005,  1009,  1015,  1022,  1029
+       0,   192,   192,   195,   198,   199,   202,   205,   208,   215,
+     222,   228,   231,   234,   237,   240,   244,   248,   252,   256,
+     262,   265,   271,   274,   280,   281,   287,   294,   301,   308,
+     315,   324,   325,   329,   335,   349,   353,   359,   366,   373,
+     380,   387,   396,   397,   456,   511,   518,   525,   532,   541,
+     542,   548,   551,   572,   576,   582,   594,   606,   611,   615,
+     620,   625,   630,   634,   639,   642,   647,   662,   671,   680,
+     689,   706,   707,   708,   709,   710,   711,   712,   713,   714,
+     715,   718,   724,   727,   731,   735,   743,   751,   762,   768,
+     774,   780,   788,   791,   794,   797,   800,   803,   806,   809,
+     812,   815,   818,   821,   824,   827,   830,   835,   842,   849,
+     865,   866,   869,   869,   879,   882,   883,   889,   890,   893,
+     893,   903,   906,   907,   913,   914,   917,   917,   927,   930,
+     931,   934,   934,   944,   947,   948,   954,   958,   964,   971,
+     978,   985,   992,  1001,  1002,  1008,  1012,  1018,  1025,  1032
 };
 #endif
 
@@ -1619,31 +1622,31 @@ yyreduce:
   switch (yyn)
     {
   case 2: /* file: %empty  */
-#line 189 "gram.y"
+#line 192 "gram.y"
                         {
                            ; /* empty file */
                        }
-#line 1621 "gram.c"
+#line 1624 "gram.c"
     break;
 
   case 6: /* entry: '\n'  */
-#line 199 "gram.y"
+#line 202 "gram.y"
                              {
                            ; /* blank line */
                        }
-#line 1629 "gram.c"
+#line 1632 "gram.c"
     break;
 
   case 7: /* entry: error '\n'  */
-#line 202 "gram.y"
+#line 205 "gram.y"
                                    {
                            yyerrok;
                        }
-#line 1637 "gram.c"
+#line 1640 "gram.c"
     break;
 
   case 8: /* entry: include  */
-#line 205 "gram.y"
+#line 208 "gram.y"
                                 {
                            if (!push_include((yyvsp[0].string), false)) {
                                free((yyvsp[0].string));
@@ -1651,11 +1654,11 @@ yyreduce:
                            }
                            free((yyvsp[0].string));
                        }
-#line 1649 "gram.c"
+#line 1652 "gram.c"
     break;
 
   case 9: /* entry: includedir  */
-#line 212 "gram.y"
+#line 215 "gram.y"
                                    {
                            if (!push_include((yyvsp[0].string), true)) {
                                free((yyvsp[0].string));
@@ -1663,142 +1666,142 @@ yyreduce:
                            }
                            free((yyvsp[0].string));
                        }
-#line 1661 "gram.c"
+#line 1664 "gram.c"
     break;
 
   case 10: /* entry: userlist privileges '\n'  */
-#line 219 "gram.y"
+#line 222 "gram.y"
                                                  {
                            if (!add_userspec((yyvsp[-2].member), (yyvsp[-1].privilege))) {
                                sudoerserror(N_("unable to allocate memory"));
                                YYERROR;
                            }
                        }
-#line 1672 "gram.c"
+#line 1675 "gram.c"
     break;
 
   case 11: /* entry: USERALIAS useraliases '\n'  */
-#line 225 "gram.y"
+#line 228 "gram.y"
                                                    {
                            ;
                        }
-#line 1680 "gram.c"
+#line 1683 "gram.c"
     break;
 
   case 12: /* entry: HOSTALIAS hostaliases '\n'  */
-#line 228 "gram.y"
+#line 231 "gram.y"
                                                    {
                            ;
                        }
-#line 1688 "gram.c"
+#line 1691 "gram.c"
     break;
 
   case 13: /* entry: CMNDALIAS cmndaliases '\n'  */
-#line 231 "gram.y"
+#line 234 "gram.y"
                                                    {
                            ;
                        }
-#line 1696 "gram.c"
+#line 1699 "gram.c"
     break;
 
   case 14: /* entry: RUNASALIAS runasaliases '\n'  */
-#line 234 "gram.y"
+#line 237 "gram.y"
                                                      {
                            ;
                        }
-#line 1704 "gram.c"
+#line 1707 "gram.c"
     break;
 
   case 15: /* entry: DEFAULTS defaults_list '\n'  */
-#line 237 "gram.y"
+#line 240 "gram.y"
                                                     {
                            if (!add_defaults(DEFAULTS, NULL, (yyvsp[-1].defaults)))
                                YYERROR;
                        }
-#line 1713 "gram.c"
+#line 1716 "gram.c"
     break;
 
   case 16: /* entry: DEFAULTS_USER userlist defaults_list '\n'  */
-#line 241 "gram.y"
+#line 244 "gram.y"
                                                                   {
                            if (!add_defaults(DEFAULTS_USER, (yyvsp[-2].member), (yyvsp[-1].defaults)))
                                YYERROR;
                        }
-#line 1722 "gram.c"
+#line 1725 "gram.c"
     break;
 
   case 17: /* entry: DEFAULTS_RUNAS userlist defaults_list '\n'  */
-#line 245 "gram.y"
+#line 248 "gram.y"
                                                                    {
                            if (!add_defaults(DEFAULTS_RUNAS, (yyvsp[-2].member), (yyvsp[-1].defaults)))
                                YYERROR;
                        }
-#line 1731 "gram.c"
+#line 1734 "gram.c"
     break;
 
   case 18: /* entry: DEFAULTS_HOST hostlist defaults_list '\n'  */
-#line 249 "gram.y"
+#line 252 "gram.y"
                                                                   {
                            if (!add_defaults(DEFAULTS_HOST, (yyvsp[-2].member), (yyvsp[-1].defaults)))
                                YYERROR;
                        }
-#line 1740 "gram.c"
+#line 1743 "gram.c"
     break;
 
   case 19: /* entry: DEFAULTS_CMND cmndlist defaults_list '\n'  */
-#line 253 "gram.y"
+#line 256 "gram.y"
                                                                   {
                            if (!add_defaults(DEFAULTS_CMND, (yyvsp[-2].member), (yyvsp[-1].defaults)))
                                YYERROR;
                        }
-#line 1749 "gram.c"
+#line 1752 "gram.c"
     break;
 
   case 20: /* include: INCLUDE WORD '\n'  */
-#line 259 "gram.y"
+#line 262 "gram.y"
                                           {
                            (yyval.string) = (yyvsp[-1].string);
                        }
-#line 1757 "gram.c"
+#line 1760 "gram.c"
     break;
 
   case 21: /* include: INCLUDE WORD error '\n'  */
-#line 262 "gram.y"
+#line 265 "gram.y"
                                                 {
                            yyerrok;
                            (yyval.string) = (yyvsp[-2].string);
                        }
-#line 1766 "gram.c"
+#line 1769 "gram.c"
     break;
 
   case 22: /* includedir: INCLUDEDIR WORD '\n'  */
-#line 268 "gram.y"
+#line 271 "gram.y"
                                              {
                            (yyval.string) = (yyvsp[-1].string);
                        }
-#line 1774 "gram.c"
+#line 1777 "gram.c"
     break;
 
   case 23: /* includedir: INCLUDEDIR WORD error '\n'  */
-#line 271 "gram.y"
+#line 274 "gram.y"
                                                    {
                            yyerrok;
                            (yyval.string) = (yyvsp[-2].string);
                        }
-#line 1783 "gram.c"
+#line 1786 "gram.c"
     break;
 
   case 25: /* defaults_list: defaults_list ',' defaults_entry  */
-#line 278 "gram.y"
+#line 281 "gram.y"
                                                          {
                            HLTQ_CONCAT((yyvsp[-2].defaults), (yyvsp[0].defaults), entries);
                            (yyval.defaults) = (yyvsp[-2].defaults);
                        }
-#line 1792 "gram.c"
+#line 1795 "gram.c"
     break;
 
   case 26: /* defaults_entry: DEFVAR  */
-#line 284 "gram.y"
+#line 287 "gram.y"
                                {
                            (yyval.defaults) = new_default((yyvsp[0].string), NULL, true);
                            if ((yyval.defaults) == NULL) {
@@ -1806,11 +1809,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1804 "gram.c"
+#line 1807 "gram.c"
     break;
 
   case 27: /* defaults_entry: '!' DEFVAR  */
-#line 291 "gram.y"
+#line 294 "gram.y"
                                    {
                            (yyval.defaults) = new_default((yyvsp[0].string), NULL, false);
                            if ((yyval.defaults) == NULL) {
@@ -1818,11 +1821,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1816 "gram.c"
+#line 1819 "gram.c"
     break;
 
   case 28: /* defaults_entry: DEFVAR '=' WORD  */
-#line 298 "gram.y"
+#line 301 "gram.y"
                                         {
                            (yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), true);
                            if ((yyval.defaults) == NULL) {
@@ -1830,11 +1833,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1828 "gram.c"
+#line 1831 "gram.c"
     break;
 
   case 29: /* defaults_entry: DEFVAR '+' WORD  */
-#line 305 "gram.y"
+#line 308 "gram.y"
                                         {
                            (yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), '+');
                            if ((yyval.defaults) == NULL) {
@@ -1842,11 +1845,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1840 "gram.c"
+#line 1843 "gram.c"
     break;
 
   case 30: /* defaults_entry: DEFVAR '-' WORD  */
-#line 312 "gram.y"
+#line 315 "gram.y"
                                         {
                            (yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), '-');
                            if ((yyval.defaults) == NULL) {
@@ -1854,29 +1857,29 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1852 "gram.c"
+#line 1855 "gram.c"
     break;
 
   case 32: /* privileges: privileges ':' privilege  */
-#line 322 "gram.y"
+#line 325 "gram.y"
                                                  {
                            HLTQ_CONCAT((yyvsp[-2].privilege), (yyvsp[0].privilege), entries);
                            (yyval.privilege) = (yyvsp[-2].privilege);
                        }
-#line 1861 "gram.c"
+#line 1864 "gram.c"
     break;
 
   case 33: /* privileges: privileges ':' error  */
-#line 326 "gram.y"
+#line 329 "gram.y"
                                              {
                            yyerrok;
                            (yyval.privilege) = (yyvsp[-2].privilege);
                        }
-#line 1870 "gram.c"
+#line 1873 "gram.c"
     break;
 
   case 34: /* privilege: hostlist '=' cmndspeclist  */
-#line 332 "gram.y"
+#line 335 "gram.y"
                                                   {
                            struct privilege *p = calloc(1, sizeof(*p));
                            if (p == NULL) {
@@ -1889,29 +1892,29 @@ yyreduce:
                            HLTQ_INIT(p, entries);
                            (yyval.privilege) = p;
                        }
-#line 1887 "gram.c"
+#line 1890 "gram.c"
     break;
 
   case 35: /* ophost: host  */
-#line 346 "gram.y"
+#line 349 "gram.y"
                              {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = false;
                        }
-#line 1896 "gram.c"
+#line 1899 "gram.c"
     break;
 
   case 36: /* ophost: '!' host  */
-#line 350 "gram.y"
+#line 353 "gram.y"
                                  {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = true;
                        }
-#line 1905 "gram.c"
+#line 1908 "gram.c"
     break;
 
   case 37: /* host: ALIAS  */
-#line 356 "gram.y"
+#line 359 "gram.y"
                               {
                            (yyval.member) = new_member((yyvsp[0].string), ALIAS);
                            if ((yyval.member) == NULL) {
@@ -1919,11 +1922,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1917 "gram.c"
+#line 1920 "gram.c"
     break;
 
   case 38: /* host: ALL  */
-#line 363 "gram.y"
+#line 366 "gram.y"
                             {
                            (yyval.member) = new_member(NULL, ALL);
                            if ((yyval.member) == NULL) {
@@ -1931,11 +1934,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1929 "gram.c"
+#line 1932 "gram.c"
     break;
 
   case 39: /* host: NETGROUP  */
-#line 370 "gram.y"
+#line 373 "gram.y"
                                  {
                            (yyval.member) = new_member((yyvsp[0].string), NETGROUP);
                            if ((yyval.member) == NULL) {
@@ -1943,11 +1946,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1941 "gram.c"
+#line 1944 "gram.c"
     break;
 
   case 40: /* host: NTWKADDR  */
-#line 377 "gram.y"
+#line 380 "gram.y"
                                  {
                            (yyval.member) = new_member((yyvsp[0].string), NTWKADDR);
                            if ((yyval.member) == NULL) {
@@ -1955,11 +1958,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1953 "gram.c"
+#line 1956 "gram.c"
     break;
 
   case 41: /* host: WORD  */
-#line 384 "gram.y"
+#line 387 "gram.y"
                              {
                            (yyval.member) = new_member((yyvsp[0].string), WORD);
                            if ((yyval.member) == NULL) {
@@ -1967,11 +1970,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 1965 "gram.c"
+#line 1968 "gram.c"
     break;
 
   case 43: /* cmndspeclist: cmndspeclist ',' cmndspec  */
-#line 394 "gram.y"
+#line 397 "gram.y"
                                                   {
                            struct cmndspec *prev;
                            prev = HLTQ_LAST((yyvsp[-2].cmndspec), cmndspec, entries);
@@ -2029,11 +2032,11 @@ yyreduce:
                            }
                            (yyval.cmndspec) = (yyvsp[-2].cmndspec);
                        }
-#line 2027 "gram.c"
+#line 2030 "gram.c"
     break;
 
   case 44: /* cmndspec: runasspec options cmndtag digcmnd  */
-#line 453 "gram.y"
+#line 456 "gram.y"
                                                           {
                            struct cmndspec *cs = calloc(1, sizeof(*cs));
                            if (cs == NULL) {
@@ -2087,11 +2090,11 @@ yyreduce:
                                cs->tags.setenv = IMPLIED;
                            (yyval.cmndspec) = cs;
                        }
-#line 2085 "gram.c"
+#line 2088 "gram.c"
     break;
 
   case 45: /* digestspec: SHA224_TOK ':' DIGEST  */
-#line 508 "gram.y"
+#line 511 "gram.y"
                                               {
                            (yyval.digest) = new_digest(SUDO_DIGEST_SHA224, (yyvsp[0].string));
                            if ((yyval.digest) == NULL) {
@@ -2099,11 +2102,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2097 "gram.c"
+#line 2100 "gram.c"
     break;
 
   case 46: /* digestspec: SHA256_TOK ':' DIGEST  */
-#line 515 "gram.y"
+#line 518 "gram.y"
                                               {
                            (yyval.digest) = new_digest(SUDO_DIGEST_SHA256, (yyvsp[0].string));
                            if ((yyval.digest) == NULL) {
@@ -2111,11 +2114,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2109 "gram.c"
+#line 2112 "gram.c"
     break;
 
   case 47: /* digestspec: SHA384_TOK ':' DIGEST  */
-#line 522 "gram.y"
+#line 525 "gram.y"
                                               {
                            (yyval.digest) = new_digest(SUDO_DIGEST_SHA384, (yyvsp[0].string));
                            if ((yyval.digest) == NULL) {
@@ -2123,11 +2126,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2121 "gram.c"
+#line 2124 "gram.c"
     break;
 
   case 48: /* digestspec: SHA512_TOK ':' DIGEST  */
-#line 529 "gram.y"
+#line 532 "gram.y"
                                               {
                            (yyval.digest) = new_digest(SUDO_DIGEST_SHA512, (yyvsp[0].string));
                            if ((yyval.digest) == NULL) {
@@ -2135,28 +2138,28 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2133 "gram.c"
+#line 2136 "gram.c"
     break;
 
   case 50: /* digestlist: digestlist ',' digestspec  */
-#line 539 "gram.y"
+#line 542 "gram.y"
                                                   {
                            HLTQ_CONCAT((yyvsp[-2].digest), (yyvsp[0].digest), entries);
                            (yyval.digest) = (yyvsp[-2].digest);
                        }
-#line 2142 "gram.c"
+#line 2145 "gram.c"
     break;
 
   case 51: /* digcmnd: opcmnd  */
-#line 545 "gram.y"
+#line 548 "gram.y"
                                {
                            (yyval.member) = (yyvsp[0].member);
                        }
-#line 2150 "gram.c"
+#line 2153 "gram.c"
     break;
 
   case 52: /* digcmnd: digestlist opcmnd  */
-#line 548 "gram.y"
+#line 551 "gram.y"
                                           {
                            struct sudo_command *c =
                                (struct sudo_command *) (yyvsp[0].member)->name;
@@ -2176,29 +2179,29 @@ yyreduce:
                            HLTQ_TO_TAILQ(&c->digests, (yyvsp[-1].digest), entries);
                            (yyval.member) = (yyvsp[0].member);
                        }
-#line 2174 "gram.c"
+#line 2177 "gram.c"
     break;
 
   case 53: /* opcmnd: cmnd  */
-#line 569 "gram.y"
+#line 572 "gram.y"
                              {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = false;
                        }
-#line 2183 "gram.c"
+#line 2186 "gram.c"
     break;
 
   case 54: /* opcmnd: '!' cmnd  */
-#line 573 "gram.y"
+#line 576 "gram.y"
                                  {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = true;
                        }
-#line 2192 "gram.c"
+#line 2195 "gram.c"
     break;
 
   case 55: /* chdirspec: CWD '=' WORD  */
-#line 579 "gram.y"
+#line 582 "gram.y"
                                      {
                            if ((yyvsp[0].string)[0] != '/' && (yyvsp[0].string)[0] != '~') {
                                if (strcmp((yyvsp[0].string), "*") != 0) {
@@ -2209,11 +2212,11 @@ yyreduce:
                            }
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2207 "gram.c"
+#line 2210 "gram.c"
     break;
 
   case 56: /* chrootspec: CHROOT '=' WORD  */
-#line 591 "gram.y"
+#line 594 "gram.y"
                                         {
                            if ((yyvsp[0].string)[0] != '/' && (yyvsp[0].string)[0] != '~') {
                                if (strcmp((yyvsp[0].string), "*") != 0) {
@@ -2224,83 +2227,83 @@ yyreduce:
                            }
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2222 "gram.c"
+#line 2225 "gram.c"
     break;
 
   case 57: /* timeoutspec: CMND_TIMEOUT '=' WORD  */
-#line 603 "gram.y"
+#line 606 "gram.y"
                                               {
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2230 "gram.c"
+#line 2233 "gram.c"
     break;
 
   case 58: /* notbeforespec: NOTBEFORE '=' WORD  */
-#line 608 "gram.y"
+#line 611 "gram.y"
                                            {
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2238 "gram.c"
+#line 2241 "gram.c"
     break;
 
   case 59: /* notafterspec: NOTAFTER '=' WORD  */
-#line 612 "gram.y"
+#line 615 "gram.y"
                                           {
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2246 "gram.c"
+#line 2249 "gram.c"
     break;
 
   case 60: /* rolespec: ROLE '=' WORD  */
-#line 617 "gram.y"
+#line 620 "gram.y"
                                       {
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2254 "gram.c"
+#line 2257 "gram.c"
     break;
 
   case 61: /* typespec: TYPE '=' WORD  */
-#line 622 "gram.y"
+#line 625 "gram.y"
                                       {
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2262 "gram.c"
+#line 2265 "gram.c"
     break;
 
   case 62: /* privsspec: PRIVS '=' WORD  */
-#line 627 "gram.y"
+#line 630 "gram.y"
                                        {
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2270 "gram.c"
+#line 2273 "gram.c"
     break;
 
   case 63: /* limitprivsspec: LIMITPRIVS '=' WORD  */
-#line 631 "gram.y"
+#line 634 "gram.y"
                                             {
                            (yyval.string) = (yyvsp[0].string);
                        }
-#line 2278 "gram.c"
+#line 2281 "gram.c"
     break;
 
   case 64: /* runasspec: %empty  */
-#line 636 "gram.y"
+#line 639 "gram.y"
                                     {
                            (yyval.runas) = NULL;
                        }
-#line 2286 "gram.c"
+#line 2289 "gram.c"
     break;
 
   case 65: /* runasspec: '(' runaslist ')'  */
-#line 639 "gram.y"
+#line 642 "gram.y"
                                           {
                            (yyval.runas) = (yyvsp[-1].runas);
                        }
-#line 2294 "gram.c"
+#line 2297 "gram.c"
     break;
 
   case 66: /* runaslist: %empty  */
-#line 644 "gram.y"
+#line 647 "gram.y"
                                     {
                            (yyval.runas) = calloc(1, sizeof(struct runascontainer));
                            if ((yyval.runas) != NULL) {
@@ -2316,11 +2319,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2314 "gram.c"
+#line 2317 "gram.c"
     break;
 
   case 67: /* runaslist: userlist  */
-#line 659 "gram.y"
+#line 662 "gram.y"
                                  {
                            (yyval.runas) = calloc(1, sizeof(struct runascontainer));
                            if ((yyval.runas) == NULL) {
@@ -2330,11 +2333,11 @@ yyreduce:
                            (yyval.runas)->runasusers = (yyvsp[0].member);
                            /* $$->runasgroups = NULL; */
                        }
-#line 2328 "gram.c"
+#line 2331 "gram.c"
     break;
 
   case 68: /* runaslist: userlist ':' grouplist  */
-#line 668 "gram.y"
+#line 671 "gram.y"
                                                {
                            (yyval.runas) = calloc(1, sizeof(struct runascontainer));
                            if ((yyval.runas) == NULL) {
@@ -2344,11 +2347,11 @@ yyreduce:
                            (yyval.runas)->runasusers = (yyvsp[-2].member);
                            (yyval.runas)->runasgroups = (yyvsp[0].member);
                        }
-#line 2342 "gram.c"
+#line 2345 "gram.c"
     break;
 
   case 69: /* runaslist: ':' grouplist  */
-#line 677 "gram.y"
+#line 680 "gram.y"
                                       {
                            (yyval.runas) = calloc(1, sizeof(struct runascontainer));
                            if ((yyval.runas) == NULL) {
@@ -2358,11 +2361,11 @@ yyreduce:
                            /* $$->runasusers = NULL; */
                            (yyval.runas)->runasgroups = (yyvsp[0].member);
                        }
-#line 2356 "gram.c"
+#line 2359 "gram.c"
     break;
 
   case 70: /* runaslist: ':'  */
-#line 686 "gram.y"
+#line 689 "gram.y"
                             {
                            (yyval.runas) = calloc(1, sizeof(struct runascontainer));
                            if ((yyval.runas) != NULL) {
@@ -2378,106 +2381,106 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2376 "gram.c"
+#line 2379 "gram.c"
     break;
 
   case 71: /* reserved_word: ALL  */
-#line 703 "gram.y"
+#line 706 "gram.y"
                                         { (yyval.string) = "ALL"; }
-#line 2382 "gram.c"
+#line 2385 "gram.c"
     break;
 
   case 72: /* reserved_word: CHROOT  */
-#line 704 "gram.y"
+#line 707 "gram.y"
                                         { (yyval.string) = "CHROOT"; }
-#line 2388 "gram.c"
+#line 2391 "gram.c"
     break;
 
   case 73: /* reserved_word: CWD  */
-#line 705 "gram.y"
+#line 708 "gram.y"
                                         { (yyval.string) = "CWD"; }
-#line 2394 "gram.c"
+#line 2397 "gram.c"
     break;
 
   case 74: /* reserved_word: CMND_TIMEOUT  */
-#line 706 "gram.y"
+#line 709 "gram.y"
                                         { (yyval.string) = "CMND_TIMEOUT"; }
-#line 2400 "gram.c"
+#line 2403 "gram.c"
     break;
 
   case 75: /* reserved_word: NOTBEFORE  */
-#line 707 "gram.y"
+#line 710 "gram.y"
                                         { (yyval.string) = "NOTBEFORE"; }
-#line 2406 "gram.c"
+#line 2409 "gram.c"
     break;
 
   case 76: /* reserved_word: NOTAFTER  */
-#line 708 "gram.y"
+#line 711 "gram.y"
                                         { (yyval.string) = "NOTAFTER"; }
-#line 2412 "gram.c"
+#line 2415 "gram.c"
     break;
 
   case 77: /* reserved_word: ROLE  */
-#line 709 "gram.y"
+#line 712 "gram.y"
                                         { (yyval.string) = "ROLE"; }
-#line 2418 "gram.c"
+#line 2421 "gram.c"
     break;
 
   case 78: /* reserved_word: TYPE  */
-#line 710 "gram.y"
+#line 713 "gram.y"
                                         { (yyval.string) = "TYPE"; }
-#line 2424 "gram.c"
+#line 2427 "gram.c"
     break;
 
   case 79: /* reserved_word: PRIVS  */
-#line 711 "gram.y"
+#line 714 "gram.y"
                                         { (yyval.string) = "PRIVS"; }
-#line 2430 "gram.c"
+#line 2433 "gram.c"
     break;
 
   case 80: /* reserved_word: LIMITPRIVS  */
-#line 712 "gram.y"
+#line 715 "gram.y"
                                         { (yyval.string) = "LIMITPRIVS"; }
-#line 2436 "gram.c"
+#line 2439 "gram.c"
     break;
 
   case 81: /* reserved_alias: reserved_word  */
-#line 715 "gram.y"
+#line 718 "gram.y"
                                       {
                            sudoerserrorf(U_("syntax error, reserved word %s used as an alias name"), (yyvsp[0].string));
                            YYERROR;
                        }
-#line 2445 "gram.c"
+#line 2448 "gram.c"
     break;
 
   case 82: /* options: %empty  */
-#line 721 "gram.y"
+#line 724 "gram.y"
                                     {
                            init_options(&(yyval.options));
                        }
-#line 2453 "gram.c"
+#line 2456 "gram.c"
     break;
 
   case 83: /* options: options chdirspec  */
-#line 724 "gram.y"
+#line 727 "gram.y"
                                           {
                            free((yyval.options).runcwd);
                            (yyval.options).runcwd = (yyvsp[0].string);
                        }
-#line 2462 "gram.c"
+#line 2465 "gram.c"
     break;
 
   case 84: /* options: options chrootspec  */
-#line 728 "gram.y"
+#line 731 "gram.y"
                                            {
                            free((yyval.options).runchroot);
                            (yyval.options).runchroot = (yyvsp[0].string);
                        }
-#line 2471 "gram.c"
+#line 2474 "gram.c"
     break;
 
   case 85: /* options: options notbeforespec  */
-#line 732 "gram.y"
+#line 735 "gram.y"
                                               {
                            (yyval.options).notbefore = parse_gentime((yyvsp[0].string));
                            free((yyvsp[0].string));
@@ -2486,11 +2489,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2484 "gram.c"
+#line 2487 "gram.c"
     break;
 
   case 86: /* options: options notafterspec  */
-#line 740 "gram.y"
+#line 743 "gram.y"
                                              {
                            (yyval.options).notafter = parse_gentime((yyvsp[0].string));
                            free((yyvsp[0].string));
@@ -2499,11 +2502,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2497 "gram.c"
+#line 2500 "gram.c"
     break;
 
   case 87: /* options: options timeoutspec  */
-#line 748 "gram.y"
+#line 751 "gram.y"
                                             {
                            (yyval.options).timeout = parse_timeout((yyvsp[0].string));
                            free((yyvsp[0].string));
@@ -2515,175 +2518,175 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2513 "gram.c"
+#line 2516 "gram.c"
     break;
 
   case 88: /* options: options rolespec  */
-#line 759 "gram.y"
+#line 762 "gram.y"
                                          {
 #ifdef HAVE_SELINUX
                            free((yyval.options).role);
                            (yyval.options).role = (yyvsp[0].string);
 #endif
                        }
-#line 2524 "gram.c"
+#line 2527 "gram.c"
     break;
 
   case 89: /* options: options typespec  */
-#line 765 "gram.y"
+#line 768 "gram.y"
                                          {
 #ifdef HAVE_SELINUX
                            free((yyval.options).type);
                            (yyval.options).type = (yyvsp[0].string);
 #endif
                        }
-#line 2535 "gram.c"
+#line 2538 "gram.c"
     break;
 
   case 90: /* options: options privsspec  */
-#line 771 "gram.y"
+#line 774 "gram.y"
                                           {
 #ifdef HAVE_PRIV_SET
                            free((yyval.options).privs);
                            (yyval.options).privs = (yyvsp[0].string);
 #endif
                        }
-#line 2546 "gram.c"
+#line 2549 "gram.c"
     break;
 
   case 91: /* options: options limitprivsspec  */
-#line 777 "gram.y"
+#line 780 "gram.y"
                                                {
 #ifdef HAVE_PRIV_SET
                            free((yyval.options).limitprivs);
                            (yyval.options).limitprivs = (yyvsp[0].string);
 #endif
                        }
-#line 2557 "gram.c"
+#line 2560 "gram.c"
     break;
 
   case 92: /* cmndtag: %empty  */
-#line 785 "gram.y"
+#line 788 "gram.y"
                                     {
-                           TAGS_INIT((yyval.tag));
+                           TAGS_INIT(&(yyval.tag));
                        }
-#line 2565 "gram.c"
+#line 2568 "gram.c"
     break;
 
   case 93: /* cmndtag: cmndtag NOPASSWD  */
-#line 788 "gram.y"
+#line 791 "gram.y"
                                          {
                            (yyval.tag).nopasswd = true;
                        }
-#line 2573 "gram.c"
+#line 2576 "gram.c"
     break;
 
   case 94: /* cmndtag: cmndtag PASSWD  */
-#line 791 "gram.y"
+#line 794 "gram.y"
                                        {
                            (yyval.tag).nopasswd = false;
                        }
-#line 2581 "gram.c"
+#line 2584 "gram.c"
     break;
 
   case 95: /* cmndtag: cmndtag NOEXEC  */
-#line 794 "gram.y"
+#line 797 "gram.y"
                                        {
                            (yyval.tag).noexec = true;
                        }
-#line 2589 "gram.c"
+#line 2592 "gram.c"
     break;
 
   case 96: /* cmndtag: cmndtag EXEC  */
-#line 797 "gram.y"
+#line 800 "gram.y"
                                      {
                            (yyval.tag).noexec = false;
                        }
-#line 2597 "gram.c"
+#line 2600 "gram.c"
     break;
 
   case 97: /* cmndtag: cmndtag SETENV  */
-#line 800 "gram.y"
+#line 803 "gram.y"
                                        {
                            (yyval.tag).setenv = true;
                        }
-#line 2605 "gram.c"
+#line 2608 "gram.c"
     break;
 
   case 98: /* cmndtag: cmndtag NOSETENV  */
-#line 803 "gram.y"
+#line 806 "gram.y"
                                          {
                            (yyval.tag).setenv = false;
                        }
-#line 2613 "gram.c"
+#line 2616 "gram.c"
     break;
 
   case 99: /* cmndtag: cmndtag LOG_INPUT  */
-#line 806 "gram.y"
+#line 809 "gram.y"
                                           {
                            (yyval.tag).log_input = true;
                        }
-#line 2621 "gram.c"
+#line 2624 "gram.c"
     break;
 
   case 100: /* cmndtag: cmndtag NOLOG_INPUT  */
-#line 809 "gram.y"
+#line 812 "gram.y"
                                             {
                            (yyval.tag).log_input = false;
                        }
-#line 2629 "gram.c"
+#line 2632 "gram.c"
     break;
 
   case 101: /* cmndtag: cmndtag LOG_OUTPUT  */
-#line 812 "gram.y"
+#line 815 "gram.y"
                                            {
                            (yyval.tag).log_output = true;
                        }
-#line 2637 "gram.c"
+#line 2640 "gram.c"
     break;
 
   case 102: /* cmndtag: cmndtag NOLOG_OUTPUT  */
-#line 815 "gram.y"
+#line 818 "gram.y"
                                              {
                            (yyval.tag).log_output = false;
                        }
-#line 2645 "gram.c"
+#line 2648 "gram.c"
     break;
 
   case 103: /* cmndtag: cmndtag FOLLOWLNK  */
-#line 818 "gram.y"
+#line 821 "gram.y"
                                           {
                            (yyval.tag).follow = true;
                        }
-#line 2653 "gram.c"
+#line 2656 "gram.c"
     break;
 
   case 104: /* cmndtag: cmndtag NOFOLLOWLNK  */
-#line 821 "gram.y"
+#line 824 "gram.y"
                                             {
                            (yyval.tag).follow = false;
                        }
-#line 2661 "gram.c"
+#line 2664 "gram.c"
     break;
 
   case 105: /* cmndtag: cmndtag MAIL  */
-#line 824 "gram.y"
+#line 827 "gram.y"
                                      {
                            (yyval.tag).send_mail = true;
                        }
-#line 2669 "gram.c"
+#line 2672 "gram.c"
     break;
 
   case 106: /* cmndtag: cmndtag NOMAIL  */
-#line 827 "gram.y"
+#line 830 "gram.y"
                                        {
                            (yyval.tag).send_mail = false;
                        }
-#line 2677 "gram.c"
+#line 2680 "gram.c"
     break;
 
   case 107: /* cmnd: ALL  */
-#line 832 "gram.y"
+#line 835 "gram.y"
                             {
                            (yyval.member) = new_member(NULL, ALL);
                            if ((yyval.member) == NULL) {
@@ -2691,11 +2694,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2689 "gram.c"
+#line 2692 "gram.c"
     break;
 
   case 108: /* cmnd: ALIAS  */
-#line 839 "gram.y"
+#line 842 "gram.y"
                               {
                            (yyval.member) = new_member((yyvsp[0].string), ALIAS);
                            if ((yyval.member) == NULL) {
@@ -2703,11 +2706,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2701 "gram.c"
+#line 2704 "gram.c"
     break;
 
   case 109: /* cmnd: COMMAND  */
-#line 846 "gram.y"
+#line 849 "gram.y"
                                 {
                            struct sudo_command *c;
 
@@ -2722,20 +2725,20 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2720 "gram.c"
+#line 2723 "gram.c"
     break;
 
   case 112: /* $@1: %empty  */
-#line 866 "gram.y"
+#line 869 "gram.y"
                               {
                            alias_line = this_lineno;
                            alias_column = sudolinebuf.toke_start + 1;
                        }
-#line 2729 "gram.c"
+#line 2732 "gram.c"
     break;
 
   case 113: /* hostalias: ALIAS $@1 '=' hostlist  */
-#line 869 "gram.y"
+#line 872 "gram.y"
                                        {
                            if (!alias_add(&parsed_policy, (yyvsp[-3].string), HOSTALIAS,
                                sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2743,29 +2746,29 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2741 "gram.c"
+#line 2744 "gram.c"
     break;
 
   case 116: /* hostlist: hostlist ',' ophost  */
-#line 880 "gram.y"
+#line 883 "gram.y"
                                             {
                            HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
                            (yyval.member) = (yyvsp[-2].member);
                        }
-#line 2750 "gram.c"
+#line 2753 "gram.c"
     break;
 
   case 119: /* $@2: %empty  */
-#line 890 "gram.y"
+#line 893 "gram.y"
                               {
                            alias_line = this_lineno;
                            alias_column = sudolinebuf.toke_start + 1;
                        }
-#line 2759 "gram.c"
+#line 2762 "gram.c"
     break;
 
   case 120: /* cmndalias: ALIAS $@2 '=' cmndlist  */
-#line 893 "gram.y"
+#line 896 "gram.y"
                                        {
                            if (!alias_add(&parsed_policy, (yyvsp[-3].string), CMNDALIAS,
                                sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2773,29 +2776,29 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2771 "gram.c"
+#line 2774 "gram.c"
     break;
 
   case 123: /* cmndlist: cmndlist ',' digcmnd  */
-#line 904 "gram.y"
+#line 907 "gram.y"
                                              {
                            HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
                            (yyval.member) = (yyvsp[-2].member);
                        }
-#line 2780 "gram.c"
+#line 2783 "gram.c"
     break;
 
   case 126: /* $@3: %empty  */
-#line 914 "gram.y"
+#line 917 "gram.y"
                               {
                            alias_line = this_lineno;
                            alias_column = sudolinebuf.toke_start + 1;
                        }
-#line 2789 "gram.c"
+#line 2792 "gram.c"
     break;
 
   case 127: /* runasalias: ALIAS $@3 '=' userlist  */
-#line 917 "gram.y"
+#line 920 "gram.y"
                                        {
                            if (!alias_add(&parsed_policy, (yyvsp[-3].string), RUNASALIAS,
                                sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2803,20 +2806,20 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2801 "gram.c"
+#line 2804 "gram.c"
     break;
 
   case 131: /* $@4: %empty  */
-#line 931 "gram.y"
+#line 934 "gram.y"
                               {
                            alias_line = this_lineno;
                            alias_column = sudolinebuf.toke_start + 1;
                        }
-#line 2810 "gram.c"
+#line 2813 "gram.c"
     break;
 
   case 132: /* useralias: ALIAS $@4 '=' userlist  */
-#line 934 "gram.y"
+#line 937 "gram.y"
                                        {
                            if (!alias_add(&parsed_policy, (yyvsp[-3].string), USERALIAS,
                                sudoers, alias_line, alias_column, (yyvsp[0].member))) {
@@ -2824,38 +2827,38 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2822 "gram.c"
+#line 2825 "gram.c"
     break;
 
   case 135: /* userlist: userlist ',' opuser  */
-#line 945 "gram.y"
+#line 948 "gram.y"
                                             {
                            HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
                            (yyval.member) = (yyvsp[-2].member);
                        }
-#line 2831 "gram.c"
+#line 2834 "gram.c"
     break;
 
   case 136: /* opuser: user  */
-#line 951 "gram.y"
+#line 954 "gram.y"
                              {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = false;
                        }
-#line 2840 "gram.c"
+#line 2843 "gram.c"
     break;
 
   case 137: /* opuser: '!' user  */
-#line 955 "gram.y"
+#line 958 "gram.y"
                                  {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = true;
                        }
-#line 2849 "gram.c"
+#line 2852 "gram.c"
     break;
 
   case 138: /* user: ALIAS  */
-#line 961 "gram.y"
+#line 964 "gram.y"
                               {
                            (yyval.member) = new_member((yyvsp[0].string), ALIAS);
                            if ((yyval.member) == NULL) {
@@ -2863,11 +2866,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2861 "gram.c"
+#line 2864 "gram.c"
     break;
 
   case 139: /* user: ALL  */
-#line 968 "gram.y"
+#line 971 "gram.y"
                             {
                            (yyval.member) = new_member(NULL, ALL);
                            if ((yyval.member) == NULL) {
@@ -2875,11 +2878,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2873 "gram.c"
+#line 2876 "gram.c"
     break;
 
   case 140: /* user: NETGROUP  */
-#line 975 "gram.y"
+#line 978 "gram.y"
                                  {
                            (yyval.member) = new_member((yyvsp[0].string), NETGROUP);
                            if ((yyval.member) == NULL) {
@@ -2887,11 +2890,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2885 "gram.c"
+#line 2888 "gram.c"
     break;
 
   case 141: /* user: USERGROUP  */
-#line 982 "gram.y"
+#line 985 "gram.y"
                                   {
                            (yyval.member) = new_member((yyvsp[0].string), USERGROUP);
                            if ((yyval.member) == NULL) {
@@ -2899,11 +2902,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2897 "gram.c"
+#line 2900 "gram.c"
     break;
 
   case 142: /* user: WORD  */
-#line 989 "gram.y"
+#line 992 "gram.y"
                              {
                            (yyval.member) = new_member((yyvsp[0].string), WORD);
                            if ((yyval.member) == NULL) {
@@ -2911,38 +2914,38 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2909 "gram.c"
+#line 2912 "gram.c"
     break;
 
   case 144: /* grouplist: grouplist ',' opgroup  */
-#line 999 "gram.y"
+#line 1002 "gram.y"
                                               {
                            HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries);
                            (yyval.member) = (yyvsp[-2].member);
                        }
-#line 2918 "gram.c"
+#line 2921 "gram.c"
     break;
 
   case 145: /* opgroup: group  */
-#line 1005 "gram.y"
+#line 1008 "gram.y"
                               {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = false;
                        }
-#line 2927 "gram.c"
+#line 2930 "gram.c"
     break;
 
   case 146: /* opgroup: '!' group  */
-#line 1009 "gram.y"
+#line 1012 "gram.y"
                                   {
                            (yyval.member) = (yyvsp[0].member);
                            (yyval.member)->negated = true;
                        }
-#line 2936 "gram.c"
+#line 2939 "gram.c"
     break;
 
   case 147: /* group: ALIAS  */
-#line 1015 "gram.y"
+#line 1018 "gram.y"
                               {
                            (yyval.member) = new_member((yyvsp[0].string), ALIAS);
                            if ((yyval.member) == NULL) {
@@ -2950,11 +2953,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2948 "gram.c"
+#line 2951 "gram.c"
     break;
 
   case 148: /* group: ALL  */
-#line 1022 "gram.y"
+#line 1025 "gram.y"
                             {
                            (yyval.member) = new_member(NULL, ALL);
                            if ((yyval.member) == NULL) {
@@ -2962,11 +2965,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2960 "gram.c"
+#line 2963 "gram.c"
     break;
 
   case 149: /* group: WORD  */
-#line 1029 "gram.y"
+#line 1032 "gram.y"
                              {
                            (yyval.member) = new_member((yyvsp[0].string), WORD);
                            if ((yyval.member) == NULL) {
@@ -2974,11 +2977,11 @@ yyreduce:
                                YYERROR;
                            }
                        }
-#line 2972 "gram.c"
+#line 2975 "gram.c"
     break;
 
 
-#line 2976 "gram.c"
+#line 2979 "gram.c"
 
       default: break;
     }
@@ -3172,7 +3175,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 1037 "gram.y"
+#line 1040 "gram.y"
 
 /* Like yyerror() but takes a printf-style format string. */
 void
@@ -3205,7 +3208,9 @@ sudoerserrorf(const char *fmt, ...)
                /* Optimize common case, a single string. */
                s = _(va_arg(ap, char *));
            } else {
-               if (vasprintf(&s, fmt, ap) == -1)
+               if (vasprintf(&s, fmt, ap) != -1)
+                   tofree = s;
+               else
                    s = _("syntax error");
            }
            sudo_printf(SUDO_CONV_ERROR_MSG, _("%s:%d:%d: %s\n"), sudoers,
@@ -3241,6 +3246,7 @@ sudoerserrorf(const char *fmt, ...)
 void
 sudoerserror(const char *s)
 {
+    // -V:sudoerserror:575, 618
     if (s == NULL)
        sudoerserrorf(NULL);
     else
index 1827de8..97c6638 100644 (file)
@@ -167,7 +167,7 @@ extern int sudoersdebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 80 "gram.y"
+#line 83 "gram.y"
 
     struct cmndspec *cmndspec;
     struct defaults *defaults;
index b9439f3..d4dcf0d 100644 (file)
@@ -45,6 +45,9 @@
 /* If we last saw a newline the entry is on the preceding line. */
 #define this_lineno    (sudoerschar == '\n' ? sudolineno - 1 : sudolineno)
 
+// PVS Studio suppression
+// -V::1037, 1042
+
 /*
  * Globals
  */
@@ -783,7 +786,7 @@ options             :       /* empty */ {
                ;
 
 cmndtag                :       /* empty */ {
-                           TAGS_INIT($$);
+                           TAGS_INIT(&$$);
                        }
                |       cmndtag NOPASSWD {
                            $$.nopasswd = true;
@@ -1066,7 +1069,9 @@ sudoerserrorf(const char *fmt, ...)
                /* Optimize common case, a single string. */
                s = _(va_arg(ap, char *));
            } else {
-               if (vasprintf(&s, fmt, ap) == -1)
+               if (vasprintf(&s, fmt, ap) != -1)
+                   tofree = s;
+               else
                    s = _("syntax error");
            }
            sudo_printf(SUDO_CONV_ERROR_MSG, _("%s:%d:%d: %s\n"), sudoers,
@@ -1102,6 +1107,7 @@ sudoerserrorf(const char *fmt, ...)
 void
 sudoerserror(const char *s)
 {
+    // -V:sudoerserror:575, 618
     if (s == NULL)
        sudoerserrorf(NULL);
     else
index 5d7a4b1..080c77e 100644 (file)
@@ -458,7 +458,7 @@ sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers,
            TAILQ_INSERT_TAIL(&priv->cmndlist, cmndspec, entries);
 
        /* Initialize cmndspec */
-       TAGS_INIT(cmndspec->tags);
+       TAGS_INIT(&cmndspec->tags);
        cmndspec->notbefore = UNSPEC;
        cmndspec->notafter = UNSPEC;
        cmndspec->timeout = UNSPEC;
index 4f57f45..e5eb2c2 100644 (file)
@@ -56,8 +56,10 @@ linux_audit_open(void)
            au_fd = AUDIT_NOT_CONFIGURED;
        else
            sudo_warn("%s", U_("unable to open audit system"));
-    } else {
-       (void)fcntl(au_fd, F_SETFD, FD_CLOEXEC);
+    } else if (fcntl(au_fd, F_SETFD, FD_CLOEXEC) == -1) {
+       sudo_warn("%s", U_("unable to open audit system"));
+       audit_close(au_fd);
+       au_fd = -1;
     }
     debug_return_int(au_fd);
 }
index e0d4628..776f881 100644 (file)
@@ -669,7 +669,7 @@ sudoers_to_eventlog(struct eventlog *evlog, char * const argv[],
     }
     if (def_runcwd && strcmp(def_runcwd, "*") != 0) {
        evlog->runcwd = def_runcwd;
-    } else if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) {
+    } else if (ISSET(sudo_mode, MODE_LOGIN_SHELL) && runas_pw != NULL) {
        evlog->runcwd = runas_pw->pw_dir;
     } else {
        evlog->runcwd = user_cwd;
index 8ad7514..ff8e8dc 100644 (file)
@@ -115,14 +115,10 @@ is_script(int fd)
     char magic[2];
     debug_decl(is_script, SUDOERS_DEBUG_MATCH);
 
-    if (read(fd, magic, 2) == 2) {
+    if (pread(fd, magic, 2, 0) == 2) {
        if (magic[0] == '#' && magic[1] == '!')
            ret = true;
     }
-    if (lseek(fd, (off_t)0, SEEK_SET) == -1) {
-       sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO,
-           "unable to rewind script fd");
-    }
     debug_return_int(ret);
 }
 
index 6bd2c1e..711bf87 100644 (file)
  * Initialize all tags to UNSPEC.
  */
 #define TAGS_INIT(t)   do {                                                   \
-    (t).follow = UNSPEC;                                                      \
-    (t).log_input = UNSPEC;                                                   \
-    (t).log_output = UNSPEC;                                                  \
-    (t).noexec = UNSPEC;                                                      \
-    (t).nopasswd = UNSPEC;                                                    \
-    (t).send_mail = UNSPEC;                                                   \
-    (t).setenv = UNSPEC;                                                      \
+    (t)->follow = UNSPEC;                                                     \
+    (t)->log_input = UNSPEC;                                                  \
+    (t)->log_output = UNSPEC;                                                 \
+    (t)->noexec = UNSPEC;                                                     \
+    (t)->nopasswd = UNSPEC;                                                   \
+    (t)->send_mail = UNSPEC;                                                  \
+    (t)->setenv = UNSPEC;                                                     \
 } while (0)
 
 /*
@@ -318,7 +318,7 @@ void free_userspec(struct userspec *us);
 void free_userspecs(struct userspec_list *usl);
 void free_default(struct defaults *def, struct member_list **binding);
 void free_defaults(struct defaults_list *defs);
-void init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *shost, const char *lhost);
+void init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *lhost, const char *shost);
 void free_parse_tree(struct sudoers_parse_tree *parse_tree);
 void reparent_parse_tree(struct sudoers_parse_tree *new_tree);
 
index f0fc734..618c68e 100644 (file)
Binary files a/plugins/sudoers/po/hr.mo and b/plugins/sudoers/po/hr.mo differ
index e499c92..cfbd98d 100644 (file)
@@ -1164,7 +1164,7 @@ msgstr "početni redoslijed (order): %s: %s"
 #: plugins/sudoers/cvtsudoers.c:220
 #, c-format
 msgid "order padding: %s: %s"
-msgstr "popuna redoslijeda (order): %s: %s"
+msgstr "ispuna redoslijeda (order): %s: %s"
 
 #: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179
 #, c-format
@@ -1282,8 +1282,8 @@ msgstr ""
 "  -b, --base=dn              osnovni DN za sudo LDAP upite\n"
 "  -c, --config=conf_file     staza do konfiguracijske datoteke\n"
 "  -d, --defaults=deftypes    pretvori samo Defaults od specificiranih deftypes\n"
-"  -e, --expand-aliases       proširuje aliase kada pretvara\n"
-"  -f, --output-format=format izlazni format jedan od: JSON, LDIF ili sudoers\n"
+"  -e, --expand-aliases       proširuje aliase prilikom pretvaranja\n"
+"  -f, --output-format=format izlazni format je jedan od: JSON, LDIF ili sudoers\n"
 "  -i, --input-format=format  ulazni format jedan od: LDIF ili sudoers\n"
 "  -I, --increment=num        inkrement za num svaki sudoOrder\n"
 "  -h, --help                 pokaže ovu pomoć i završi\n"
@@ -1292,7 +1292,7 @@ msgstr ""
 "  -o, --output=output_file   pretvoreni sudoers zapiše u output_file\n"
 "  -O, --order-start=num      prvi sudoOrder započinje od num\n"
 "  -p, --prune-matches        izreže nepodudarne korisnike, grupe i računala\n"
-"  -P, --padding=num          osnovna popuna za sudoOrder inkrement\n"
+"  -P, --padding=num          osnovna ispuna za sudoOrder inkrement\n"
 "  -s, --suppress=sections    izostavi izlaz od sections sekcija\n"
 "  -V, --version              informira o inačici ovog programa i završi"
 
index 21fc58d..1270b0f 100644 (file)
Binary files a/plugins/sudoers/po/it.mo and b/plugins/sudoers/po/it.mo differ
index 5f977d6..e3a1cae 100644 (file)
@@ -4,10 +4,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: sudoers-1.9.3b2\n"
+"Project-Id-Version: sudoers-1.9.4b1\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-09-14 06:53-0600\n"
-"PO-Revision-Date: 2020-09-28 09:10+0200\n"
+"POT-Creation-Date: 2020-11-14 06:24-0700\n"
+"PO-Revision-Date: 2020-12-03 09:48+0100\n"
 "Last-Translator: Milo Casagrande <milo@milo.name>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
 "Language: it\n"
@@ -19,7 +19,7 @@ msgstr ""
 "X-Generator: Poedit 2.4.1\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
-#: confstr.sh:1
+#: confstr.sh:1 gram.y:1077
 msgid "syntax error"
 msgstr "errore di sintassi"
 
@@ -43,70 +43,70 @@ msgstr "*** Informazioni di SICUREZZA per %h ***"
 msgid "Sorry, try again."
 msgstr "Riprovare."
 
-#: gram.y:218 gram.y:284 gram.y:291 gram.y:298 gram.y:305 gram.y:312
-#: gram.y:332 gram.y:356 gram.y:363 gram.y:370 gram.y:377 gram.y:384
-#: gram.y:453 gram.y:462 gram.y:473 gram.y:508 gram.y:515 gram.y:522
-#: gram.y:529 gram.y:556 gram.y:652 gram.y:659 gram.y:668 gram.y:677
-#: gram.y:694 gram.y:814 gram.y:821 gram.y:829 gram.y:835 gram.y:935
-#: gram.y:942 gram.y:949 gram.y:956 gram.y:963 gram.y:989 gram.y:996
-#: gram.y:1003 gram.y:1176 gram.y:1465 lib/iolog/iolog_fileio.c:1111
-#: lib/iolog/iolog_json.c:119 lib/iolog/iolog_json.c:304
-#: lib/iolog/iolog_json.c:334 lib/iolog/iolog_json.c:456
-#: lib/iolog/iolog_util.c:105 lib/iolog/iolog_util.c:114
-#: lib/iolog/iolog_util.c:124 lib/iolog/iolog_util.c:132
-#: lib/iolog/iolog_util.c:136 lib/iolog/iolog_util.c:195
-#: logsrvd/eventlog.c:233 logsrvd/sendlog.c:464 plugins/sudoers/alias.c:125
-#: plugins/sudoers/alias.c:132 plugins/sudoers/alias.c:148
-#: plugins/sudoers/audit.c:108 plugins/sudoers/audit.c:217
-#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118
-#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: 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:641 plugins/sudoers/cvtsudoers.c:756
-#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1178
-#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284
-#: 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:626
-#: plugins/sudoers/defaults.c:918 plugins/sudoers/defaults.c:1093
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:85
-#: plugins/sudoers/editor.c:96 plugins/sudoers/env.c:261
-#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
-#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56
-#: plugins/sudoers/group_plugin.c:133 plugins/sudoers/interfaces.c:72
-#: plugins/sudoers/iolog.c:491 plugins/sudoers/iolog_client.c:104
-#: plugins/sudoers/iolog_client.c:381 plugins/sudoers/iolog_client.c:547
-#: plugins/sudoers/iolog_client.c:561 plugins/sudoers/iolog_client.c:680
-#: plugins/sudoers/iolog_client.c:698 plugins/sudoers/iolog_client.c:1192
-#: plugins/sudoers/iolog_client.c:1421 plugins/sudoers/iolog_client.c:1739
-#: plugins/sudoers/iolog_client.c:1767 plugins/sudoers/ldap.c:183
-#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431
-#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743
-#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279
-#: plugins/sudoers/ldap.c:1707 plugins/sudoers/ldap.c:1744
-#: plugins/sudoers/ldap.c:1825 plugins/sudoers/ldap.c:1960
-#: plugins/sudoers/ldap.c:2061 plugins/sudoers/ldap.c:2077
+#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314
+#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386
+#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524
+#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679
+#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971
+#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032
+#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280
+#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062
+#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120
+#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335
+#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480
+#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134
+#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143
+#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144
+#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 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:641
+#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764
+#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182
+#: plugins/sudoers/cvtsudoers.c:1284 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:630 plugins/sudoers/defaults.c:923
+#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181
+#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92
+#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
+#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133
+#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596
+#: plugins/sudoers/iolog.c:613 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:604 plugins/sudoers/linux_audit.c:84
-#: plugins/sudoers/logging.c:102 plugins/sudoers/logging.c:191
-#: plugins/sudoers/logging.c:518 plugins/sudoers/logging.c:544
-#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:722
-#: plugins/sudoers/logging.c:1091 plugins/sudoers/match_command.c:280
-#: plugins/sudoers/match_command.c:448 plugins/sudoers/match_command.c:498
-#: plugins/sudoers/match_command.c:572 plugins/sudoers/match_digest.c:80
+#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84
+#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381
+#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:281
+#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499
+#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93
 #: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213
 #: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244
 #: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275
@@ -119,27 +119,27 @@ msgstr "Riprovare."
 #: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624
 #: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707
 #: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752
-#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:521
-#: plugins/sudoers/policy.c:869 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
 #: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
 #: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
 #: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
 #: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
 #: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
-#: plugins/sudoers/sssd.c:146 plugins/sudoers/sssd.c:409
-#: plugins/sudoers/sssd.c:472 plugins/sudoers/sssd.c:516
-#: plugins/sudoers/sssd.c:563 plugins/sudoers/sssd.c:756
-#: plugins/sudoers/stubs.c:103 plugins/sudoers/stubs.c:111
-#: plugins/sudoers/sudoers.c:303 plugins/sudoers/sudoers.c:328
-#: plugins/sudoers/sudoers.c:372 plugins/sudoers/sudoers.c:383
-#: plugins/sudoers/sudoers.c:393 plugins/sudoers/sudoers.c:435
-#: plugins/sudoers/sudoers.c:797 plugins/sudoers/sudoers.c:960
-#: plugins/sudoers/sudoers.c:994 plugins/sudoers/sudoers.c:1298
-#: plugins/sudoers/sudoreplay.c:551 plugins/sudoers/sudoreplay.c:554
-#: plugins/sudoers/sudoreplay.c:1258 plugins/sudoers/sudoreplay.c:1468
-#: plugins/sudoers/sudoreplay.c:1472 plugins/sudoers/testsudoers.c:128
+#: 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/stubs.c:110 plugins/sudoers/stubs.c:118
+#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326
+#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381
+#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433
+#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927
+#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265
+#: 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:128
 #: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/testsudoers.c:581 plugins/sudoers/timestamp.c:432
+#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432
 #: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986
 #: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104
 #: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157
@@ -147,53 +147,60 @@ msgstr "Riprovare."
 #: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329
 #: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615
 #: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008
-#: plugins/sudoers/visudo.c:1127 toke.l:922 toke.l:1042 toke.l:1100
+#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091
 msgid "unable to allocate memory"
 msgstr "impossibile allocare memoria"
 
-#: gram.y:550
+#: gram.y:552
 msgid "a digest requires a path name"
 msgstr "un digest richiede il nome di percorso"
 
-#: gram.y:579
+#: gram.y:581
 msgid "values for \"CWD\" must start with a '/', '~', or '*'"
 msgstr "i valori per \"CWD\" devono iniziare con un carattere \"/\", \"~\" o \"*\""
 
-#: gram.y:591
+#: gram.y:593
 msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
 msgstr "i valori per \"CHROOT\" devono iniziare con un carattere \"/\", \"~\" o \"*\""
 
 #: gram.y:715
+#, c-format
+msgid "syntax error, reserved word %s used as an alias name"
+msgstr "errore di sintassi, parola riservata %s utilizzata come alias"
+
+#: gram.y:735
 msgid "invalid notbefore value"
 msgstr "valore notbefore non valido"
 
-#: gram.y:723
+#: gram.y:743
 msgid "invalid notafter value"
 msgstr "valore notafter non valido"
 
-#: gram.y:732 plugins/sudoers/policy.c:330
+#: gram.y:752 plugins/sudoers/policy.c:335
 msgid "timeout value too large"
 msgstr "valore timeout troppo grande"
 
-#: gram.y:734 plugins/sudoers/policy.c:332
+#: gram.y:754 plugins/sudoers/policy.c:337
 msgid "invalid timeout value"
 msgstr "valore timeout non valido"
 
-#: gram.y:1041
-#, c-format
-msgid "%s:%d: %s\n"
-msgstr "%s:%d: %s\n"
-
-#: gram.y:1465 lib/iolog/iolog_fileio.c:1111 lib/iolog/iolog_json.c:119
-#: lib/iolog/iolog_json.c:303 lib/iolog/iolog_json.c:334
-#: lib/iolog/iolog_json.c:456 lib/iolog/iolog_json.c:734
-#: lib/iolog/iolog_util.c:105 lib/iolog/iolog_util.c:114
-#: lib/iolog/iolog_util.c:124 lib/iolog/iolog_util.c:132
-#: lib/iolog/iolog_util.c:136 lib/iolog/iolog_util.c:195
-#: logsrvd/eventlog.c:233 logsrvd/logsrvd.c:1208 logsrvd/logsrvd.c:1221
-#: logsrvd/logsrvd.c:1266 logsrvd/sendlog.c:464 logsrvd/sendlog.c:1305
-#: logsrvd/sendlog.c:1312 logsrvd/sendlog.c:1730 plugins/sudoers/audit.c:108
-#: plugins/sudoers/audit.c:217 plugins/sudoers/auth/pam.c:482
+#: gram.y:1079
+#, c-format
+msgid "%s:%d:%d: %s\n"
+msgstr "%s:%d:%d: %s\n"
+
+#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816
+#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998
+#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304
+#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457
+#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321
+#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482
 #: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
 #: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159
 #: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187
@@ -208,93 +215,144 @@ msgstr "%s:%d: %s\n"
 #: 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:626
-#: plugins/sudoers/defaults.c:918 plugins/sudoers/defaults.c:1093
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:85
-#: plugins/sudoers/editor.c:96 plugins/sudoers/env.c:261
+#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630
+#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098
+#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261
 #: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
 #: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56
 #: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72
-#: plugins/sudoers/iolog.c:491 plugins/sudoers/iolog_client.c:104
-#: plugins/sudoers/iolog_client.c:214 plugins/sudoers/iolog_client.c:235
-#: plugins/sudoers/iolog_client.c:248 plugins/sudoers/iolog_client.c:381
-#: plugins/sudoers/iolog_client.c:680 plugins/sudoers/iolog_client.c:698
-#: plugins/sudoers/iolog_client.c:1192 plugins/sudoers/iolog_client.c:1421
-#: plugins/sudoers/iolog_client.c:1739 plugins/sudoers/iolog_client.c:1767
-#: plugins/sudoers/ldap.c:183 plugins/sudoers/ldap.c:421
-#: plugins/sudoers/ldap.c:431 plugins/sudoers/ldap.c:436
-#: plugins/sudoers/ldap.c:440 plugins/sudoers/ldap.c:452
-#: plugins/sudoers/ldap.c:743 plugins/sudoers/ldap.c:907
-#: plugins/sudoers/ldap.c:1279 plugins/sudoers/ldap.c:1707
-#: plugins/sudoers/ldap.c:1744 plugins/sudoers/ldap.c:1825
-#: plugins/sudoers/ldap.c:1960 plugins/sudoers/ldap.c:2061
-#: plugins/sudoers/ldap.c:2077 plugins/sudoers/ldap_conf.c:218
+#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613
+#: 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:604
-#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/logging.c:102
-#: plugins/sudoers/logging.c:191 plugins/sudoers/logging.c:518
-#: plugins/sudoers/logging.c:544 plugins/sudoers/logging.c:584
-#: plugins/sudoers/logging.c:1091 plugins/sudoers/match_command.c:279
-#: plugins/sudoers/match_command.c:447 plugins/sudoers/match_command.c:497
-#: plugins/sudoers/match_command.c:572 plugins/sudoers/match_digest.c:80
-#: plugins/sudoers/parse.c:198 plugins/sudoers/parse.c:212
-#: plugins/sudoers/parse.c:229 plugins/sudoers/parse.c:243
-#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:274
-#: 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:594 plugins/sudoers/parse_ldif.c:623
-#: plugins/sudoers/parse_ldif.c:648 plugins/sudoers/parse_ldif.c:706
-#: plugins/sudoers/parse_ldif.c:723 plugins/sudoers/parse_ldif.c:751
-#: plugins/sudoers/parse_ldif.c:758 plugins/sudoers/policy.c:134
-#: plugins/sudoers/policy.c:143 plugins/sudoers/policy.c:152
-#: plugins/sudoers/policy.c:178 plugins/sudoers/policy.c:315
-#: plugins/sudoers/policy.c:330 plugins/sudoers/policy.c:332
-#: plugins/sudoers/policy.c:361 plugins/sudoers/policy.c:370
-#: plugins/sudoers/policy.c:413 plugins/sudoers/policy.c:423
-#: plugins/sudoers/policy.c:432 plugins/sudoers/policy.c:441
-#: plugins/sudoers/policy.c:521 plugins/sudoers/policy.c:869
-#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:194
-#: plugins/sudoers/pwutil.c:265 plugins/sudoers/pwutil.c:343
-#: plugins/sudoers/pwutil.c:517 plugins/sudoers/pwutil.c:581
-#: plugins/sudoers/pwutil.c:652 plugins/sudoers/pwutil.c:811
-#: plugins/sudoers/pwutil.c:867 plugins/sudoers/pwutil.c:911
-#: plugins/sudoers/pwutil.c:968 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:145 plugins/sudoers/sssd.c:409
-#: plugins/sudoers/sssd.c:472 plugins/sudoers/sssd.c:516
-#: plugins/sudoers/sssd.c:563 plugins/sudoers/sssd.c:756
-#: plugins/sudoers/stubs.c:103 plugins/sudoers/stubs.c:111
-#: plugins/sudoers/sudoers.c:303 plugins/sudoers/sudoers.c:328
-#: plugins/sudoers/sudoers.c:372 plugins/sudoers/sudoers.c:383
-#: plugins/sudoers/sudoers.c:393 plugins/sudoers/sudoers.c:435
-#: plugins/sudoers/sudoers.c:797 plugins/sudoers/sudoers.c:960
-#: plugins/sudoers/sudoers.c:994 plugins/sudoers/sudoers.c:1298
-#: plugins/sudoers/sudoreplay.c:551 plugins/sudoers/sudoreplay.c:554
-#: plugins/sudoers/sudoreplay.c:1258 plugins/sudoers/sudoreplay.c:1468
-#: plugins/sudoers/sudoreplay.c:1472 plugins/sudoers/testsudoers.c:128
-#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/testsudoers.c:581 plugins/sudoers/timestamp.c:432
-#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986
-#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104
-#: plugins/sudoers/toke_util.c:128 plugins/sudoers/toke_util.c:157
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
-#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329
-#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615
-#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008
-#: plugins/sudoers/visudo.c:1127 toke.l:922 toke.l:1042 toke.l:1100
+#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603
+#: plugins/sudoers/linux_audit.c:84 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:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:280 plugins/sudoers/match_command.c:448
+#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198
+#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:274 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:594
+#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648
+#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723
+#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758
+#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148
+#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183
+#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335
+#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366
+#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418
+#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437
+#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
+#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
+#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
+#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
+#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
+#: 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/stubs.c:110
+#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300
+#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370
+#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391
+#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794
+#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961
+#: plugins/sudoers/sudoers.c:1265 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:128 plugins/sudoers/testsudoers.c:228
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587
+#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476
+#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51
+#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128
+#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123
+#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323
+#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439
+#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935
+#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913
+#: toke.l:1033 toke.l:1091
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
+#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463
+#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468
+#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244
+#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571
+#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
+#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618
+#: 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:90
+#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711
+#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161
+#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249
+#: plugins/sudoers/toke_util.c:169
+#, c-format
+msgid "internal error, %s overflow"
+msgstr "errore interno, overflow di %s"
+
+#: lib/eventlog/eventlog.c:343
+#, c-format
+msgid "unable to dup stdin: %m"
+msgstr "impossibile eseguire dup sullo stdin: %m"
+
+#: lib/eventlog/eventlog.c:388
+#, c-format
+msgid "unable to execute %s: %m"
+msgstr "impossibile eseguire %s: %m"
+
+#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198
+msgid "unable to fork"
+msgstr "impossibile eseguire fork"
+
+#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490
+#, c-format
+msgid "unable to fork: %m"
+msgstr "impossibile eseguire fork: %m"
+
+#: lib/eventlog/eventlog.c:480
+#, c-format
+msgid "unable to open pipe: %m"
+msgstr "impossibile aprire una pipe: %m"
+
+#: lib/eventlog/eventlog.c:894
+#, c-format
+msgid "%8s : %s"
+msgstr "%8s : %s"
+
+#: lib/eventlog/eventlog.c:923
+#, c-format
+msgid "%8s : (command continued) %s"
+msgstr "%8s : (comando continuato) %s"
+
 #: lib/iolog/iolog_fileio.c:155
 #, c-format
 msgid "%s exists but is not a directory (0%o)"
@@ -312,132 +370,104 @@ msgstr "impossibile creare la directory %s"
 msgid "unable to change mode of %s to 0%o"
 msgstr "impossibile modificare la modalità di %s a 0%o"
 
-#: lib/iolog/iolog_json.c:113
+#: lib/iolog/iolog_json.c:114
 #, c-format
 msgid "expected JSON_STRING, got %d"
 msgstr "atteso JSON_STRING, ottenuto %d"
 
-#: lib/iolog/iolog_json.c:326
+#: lib/iolog/iolog_json.c:327
 msgid "missing double quote in name"
 msgstr "virgolette doppie mancanti nel nome"
 
-#: lib/iolog/iolog_json.c:413
+#: lib/iolog/iolog_json.c:414
 #, c-format
 msgid "expected JSON_OBJECT, got %d"
 msgstr "atteso JSON_OBJECT, ottenuto %d"
 
-#: lib/iolog/iolog_json.c:462 lib/iolog/iolog_json.c:465
-#: lib/iolog/iolog_json.c:467 lib/iolog/iolog_json.c:559
-#: logsrvd/eventlog.c:238 plugins/sudoers/cvtsudoers_ldif.c:244
-#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571
-#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
-#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:571
-#: plugins/sudoers/iolog.c:587 plugins/sudoers/ldap.c:516
-#: plugins/sudoers/ldap.c:747 plugins/sudoers/ldap.c:1080
-#: plugins/sudoers/ldap_conf.c:222 plugins/sudoers/ldap_conf.c:312
-#: plugins/sudoers/linux_audit.c:90 plugins/sudoers/logging.c:1096
-#: plugins/sudoers/policy.c:551 plugins/sudoers/policy.c:706
-#: plugins/sudoers/policy.c:716 plugins/sudoers/prompt.c:161
-#: plugins/sudoers/sudoers.c:1016 plugins/sudoers/testsudoers.c:249
-#: plugins/sudoers/toke_util.c:169
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "errore interno, overflow di %s"
-
-#: lib/iolog/iolog_json.c:628 lib/iolog/iolog_json.c:752
+#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753
 msgid "unmatched close brace"
 msgstr "parentesi graffa di chiusura senza corrispondenza"
 
-#: lib/iolog/iolog_json.c:637
+#: lib/iolog/iolog_json.c:638
 msgid "unexpected array"
 msgstr "array non atteso"
 
-#: lib/iolog/iolog_json.c:650 lib/iolog/iolog_json.c:754
+#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755
 msgid "unmatched close bracket"
 msgstr "parentesi quadra di chiusura senza corrispondenza"
 
-#: lib/iolog/iolog_json.c:658
+#: lib/iolog/iolog_json.c:659
 msgid "unexpected string"
 msgstr "stringa non attesa"
 
-#: lib/iolog/iolog_json.c:668
+#: lib/iolog/iolog_json.c:669
 msgid "missing colon after name"
 msgstr "due punti mancanti dopo il nome"
 
-#: lib/iolog/iolog_json.c:679 lib/iolog/iolog_json.c:694
-#: lib/iolog/iolog_json.c:709
+#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695
+#: lib/iolog/iolog_json.c:710
 msgid "unexpected boolean"
 msgstr "booleano non atteso"
 
-#: lib/iolog/iolog_json.c:725
+#: lib/iolog/iolog_json.c:726
 msgid "unexpected number"
 msgstr "numero non atteso"
 
-#: lib/iolog/iolog_json.c:762
+#: lib/iolog/iolog_json.c:763
 #, c-format
 msgid "%s:%u unable to parse \"%s\""
 msgstr "%s:%u impossibile analizzare \"%s\""
 
-#: lib/iolog/iolog_util.c:70
+#: lib/iolog/iolog_util.c:71
 #, c-format
 msgid "%s: invalid log file"
 msgstr "%s: file di registro non valido"
 
-#: lib/iolog/iolog_util.c:88
+#: lib/iolog/iolog_util.c:89
 #, c-format
 msgid "%s: time stamp field is missing"
 msgstr "%s: manca il campo della marcatura temporale"
 
-#: lib/iolog/iolog_util.c:94
+#: lib/iolog/iolog_util.c:95
 #, c-format
 msgid "%s: time stamp %s: %s"
 msgstr "%s: marcatura temporale %s: %s"
 
-#: lib/iolog/iolog_util.c:101
+#: lib/iolog/iolog_util.c:102
 #, c-format
 msgid "%s: user field is missing"
 msgstr "%s: manca il campo utente"
 
-#: lib/iolog/iolog_util.c:110
+#: lib/iolog/iolog_util.c:111
 #, c-format
 msgid "%s: runas user field is missing"
 msgstr "%s: manca il campo utente di runas"
 
-#: lib/iolog/iolog_util.c:119
+#: lib/iolog/iolog_util.c:120
 #, c-format
 msgid "%s: runas group field is missing"
 msgstr "%s: manca il campo gruppo di runas"
 
-#: lib/iolog/iolog_util.c:418
+#: lib/iolog/iolog_util.c:419
 #, c-format
 msgid "error reading timing file: %s"
 msgstr "errore nel leggere il file di timing: %s"
 
-#: lib/iolog/iolog_util.c:425
+#: lib/iolog/iolog_util.c:426
 #, c-format
 msgid "invalid timing file line: %s"
 msgstr "riga di timing del file non valida: %s"
 
-#: logsrvd/eventlog.c:440 plugins/sudoers/logging.c:111
-#, c-format
-msgid "%8s : %s"
-msgstr "%8s : %s"
-
-#: logsrvd/eventlog.c:469 plugins/sudoers/logging.c:135
-#, c-format
-msgid "%8s : (command continued) %s"
-msgstr "%8s : (comando continuato) %s"
-
-#: logsrvd/iolog_writer.c:977
+#: logsrvd/iolog_writer.c:919
 msgid "log is already complete, cannot be restarted"
 msgstr "il registro è già completo, non può essere riavviato"
 
-#: logsrvd/iolog_writer.c:1008
+#: logsrvd/iolog_writer.c:950
 msgid "unable to restart log"
 msgstr "impossibile riavviare il registro"
 
 #: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106
-#: plugins/sudoers/sudoreplay.c:351 plugins/sudoers/sudoreplay.c:357
+#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358
 #, c-format
 msgid "unable to open %s/%s"
 msgstr "impossibile aprire %s/%s"
@@ -457,147 +487,155 @@ msgstr "%s/%s: impossibile spostarsi avanti %zu"
 msgid "unable to find resume point [%lld, %ld] in %s/%s"
 msgstr "impossibile trovare il punto di ripristino [%lld, %ld] in %s/%s"
 
-#: logsrvd/logsrvd.c:230 logsrvd/logsrvd.c:299 logsrvd/logsrvd.c:343
-#: logsrvd/logsrvd.c:398 logsrvd/logsrvd.c:445 logsrvd/logsrvd.c:496
-#: logsrvd/logsrvd.c:528 logsrvd/logsrvd.c:560
+#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394
+#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568
+#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632
 msgid "state machine error"
 msgstr "errore della macchina di stato"
 
-#: logsrvd/logsrvd.c:239
+#: logsrvd/logsrvd.c:299
 msgid "invalid AcceptMessage"
-msgstr "AcceoptMessage non valido"
+msgstr "AcceptMessage non valido"
 
-#: logsrvd/logsrvd.c:250
+#: logsrvd/logsrvd.c:307
 msgid "error parsing AcceptMessage"
 msgstr "errore nell'analizzare AcceptMessage"
 
-#: logsrvd/logsrvd.c:257
+#: logsrvd/logsrvd.c:314
 msgid "error creating I/O log"
 msgstr "errore nel creare il registro I/O"
 
-#: logsrvd/logsrvd.c:265
+#: logsrvd/logsrvd.c:321
 msgid "error logging accept event"
 msgstr "errore nel registrare l'evento accept"
 
-#: logsrvd/logsrvd.c:308
+#: logsrvd/logsrvd.c:362
 msgid "invalid RejectMessage"
 msgstr "RejectMessage non valido"
 
-#: logsrvd/logsrvd.c:319
+#: logsrvd/logsrvd.c:370
 msgid "error parsing RejectMessage"
 msgstr "errore nell'analizzare RejectMessage"
 
-#: logsrvd/logsrvd.c:325
+#: logsrvd/logsrvd.c:376
 msgid "error logging reject event"
 msgstr "errore nel registrare l'evento reject"
 
-#: logsrvd/logsrvd.c:430
+#: logsrvd/logsrvd.c:486
+msgid "invalid AlertMessage"
+msgstr "AlertMessage non valido"
+
+#: logsrvd/logsrvd.c:494
+msgid "error parsing AlertMessage"
+msgstr "errore nell'analizzare AlertMessage"
+
+#: logsrvd/logsrvd.c:502
 msgid "error logging alert event"
 msgstr "errore nel registrare l'evento alert"
 
-#: logsrvd/logsrvd.c:451 logsrvd/logsrvd.c:502 logsrvd/logsrvd.c:534
+#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606
 msgid "protocol error"
 msgstr "errore di protocollo"
 
-#: logsrvd/logsrvd.c:461
+#: logsrvd/logsrvd.c:533
 msgid "error writing IoBuffer"
 msgstr "errore nello scrivere IoBuffer"
 
-#: logsrvd/logsrvd.c:513
+#: logsrvd/logsrvd.c:585
 msgid "error writing ChangeWindowSize"
 msgstr "errore nello scrivere ChangeWindowSize"
 
-#: logsrvd/logsrvd.c:545
+#: logsrvd/logsrvd.c:617
 msgid "error writing CommandSuspend"
 msgstr "errore nello scrivere CommandSuspend"
 
-#: logsrvd/logsrvd.c:630
+#: logsrvd/logsrvd.c:702
 msgid "unrecognized ClientMessage type"
 msgstr "tipo di ClientMessage non riconosciuto"
 
-#: logsrvd/logsrvd.c:895
+#: logsrvd/logsrvd.c:967
 msgid "client message too large"
 msgstr "messaggio client troppo grande"
 
-#: logsrvd/logsrvd.c:1125 logsrvd/logsrvd.c:1133
+#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205
 #, c-format
 msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
 msgstr "impossibile impostare il cifrario per TLS 1.2 a %s: %s"
 
-#: logsrvd/logsrvd.c:1153 logsrvd/logsrvd.c:1161
+#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233
 #, c-format
 msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
 msgstr "impossibile impostare il cifrario per TLS 1.3 a %s: %s"
 
-#: logsrvd/logsrvd.c:1197
+#: logsrvd/logsrvd.c:1269
 #, c-format
 msgid "unable to get TLS server method: %s"
 msgstr "impossibile ottenere il metodo TLS del server: %s"
 
-#: logsrvd/logsrvd.c:1202
+#: logsrvd/logsrvd.c:1274
 #, c-format
 msgid "unable to create TLS context: %s"
 msgstr "impossibile creare il contesyo TLS: %s"
 
-#: logsrvd/logsrvd.c:1209 plugins/sudoers/iolog_client.c:236
+#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236
 #, c-format
 msgid "unable to load certificate %s"
 msgstr "impossibile caricare il certificato %s"
 
-#: logsrvd/logsrvd.c:1222 plugins/sudoers/iolog_client.c:216
+#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216
 #, c-format
 msgid "unable to load certificate authority bundle %s"
 msgstr "impossibile caricare il bundle CA %s"
 
-#: logsrvd/logsrvd.c:1267 plugins/sudoers/iolog_client.c:249
+#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249
 #, c-format
 msgid "unable to load private key %s"
 msgstr "impossibile caricare la chiave privata %s"
 
-#: logsrvd/logsrvd.c:1284 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365
 #, c-format
 msgid "unable to set diffie-hellman parameters: %s"
 msgstr "impossibile impostare i parametri diffie-hellman: %s"
 
-#: logsrvd/logsrvd.c:1306
+#: logsrvd/logsrvd.c:1378
 #, c-format
 msgid "unable to set minimum protocol version to TLS 1.2: %s"
 msgstr "impossibile impostare la versione minima del protocollo a TLS 1.2: %s"
 
-#: logsrvd/logsrvd.c:1491
+#: logsrvd/logsrvd.c:1563
 msgid "unable to get remote IP addr"
 msgstr "impossibile ottenere indirizzo IP remoto"
 
-#: logsrvd/logsrvd.c:1519 plugins/sudoers/iolog_client.c:263
+#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263
 #, c-format
 msgid "Unable to attach user data to the ssl object: %s"
 msgstr "Impossibile allegare dati utenti all'oggetto ssl: %s"
 
-#: logsrvd/logsrvd.c:1527 logsrvd/logsrvd.c:1649 logsrvd/logsrvd.c:1749
-#: logsrvd/sendlog.c:1109 logsrvd/sendlog.c:1465 logsrvd/sendlog.c:1480
-#: logsrvd/sendlog.c:1538 plugins/sudoers/iolog.c:931
-#: plugins/sudoers/iolog.c:1064 plugins/sudoers/iolog.c:1162
-#: plugins/sudoers/iolog_client.c:108 plugins/sudoers/iolog_client.c:324
-#: plugins/sudoers/iolog_client.c:340 plugins/sudoers/iolog_client.c:386
-#: plugins/sudoers/iolog_client.c:569 plugins/sudoers/iolog_client.c:576
-#: plugins/sudoers/iolog_client.c:1166 plugins/sudoers/iolog_client.c:1202
-#: plugins/sudoers/iolog_client.c:1210 plugins/sudoers/iolog_client.c:1270
-#: plugins/sudoers/iolog_client.c:1377 plugins/sudoers/iolog_client.c:1493
-#: plugins/sudoers/iolog_client.c:1775 plugins/sudoers/iolog_client.c:1783
-#: plugins/sudoers/sudoreplay.c:511 plugins/sudoers/sudoreplay.c:558
-#: plugins/sudoers/sudoreplay.c:790 plugins/sudoers/sudoreplay.c:902
-#: plugins/sudoers/sudoreplay.c:992 plugins/sudoers/sudoreplay.c:1007
-#: plugins/sudoers/sudoreplay.c:1014 plugins/sudoers/sudoreplay.c:1021
-#: plugins/sudoers/sudoreplay.c:1028 plugins/sudoers/sudoreplay.c:1035
-#: plugins/sudoers/sudoreplay.c:1162
+#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823
+#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496
+#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956
+#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187
+#: 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:587 plugins/sudoers/log_client.c:594
+#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376
+#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425
+#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692
+#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015
+#: 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 "impossibile aggiungere l'evento alla coda"
 
-#: logsrvd/logsrvd.c:1703 logsrvd/logsrvd.c:1937
+#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011
 msgid "unable setup listen socket"
 msgstr "impossibile impostare il socket di ascolto"
 
-#: logsrvd/logsrvd.c:1843 logsrvd/sendlog.c:123
+#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124
 #, c-format
 msgid ""
 "%s - send sudo I/O log to remote server\n"
@@ -606,7 +644,7 @@ msgstr ""
 "%s - Invia registro I/O di sudo a un server remoto\n"
 "\n"
 
-#: logsrvd/logsrvd.c:1846
+#: logsrvd/logsrvd.c:1920
 msgid ""
 "\n"
 "Options:\n"
@@ -624,78 +662,78 @@ msgstr ""
 "  -R, --random-drop  Percentuale di connessioni chiuse\n"
 "  -V, --version      Visualizza la versione ed esce\n"
 
-#: logsrvd/logsrvd.c:1898 logsrvd/sendlog.c:1703
+#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719
 msgid "Protobuf-C version 1.3 or higher required"
 msgstr "È richiesto Protobuf-C 1.3 o successivo"
 
-#: logsrvd/logsrvd.c:1916
+#: logsrvd/logsrvd.c:1990
 #, c-format
 msgid "invalid random drop value: %s"
 msgstr "valore drop casuale non valido: %s"
 
-#: logsrvd/logsrvd.c:1920 logsrvd/sendlog.c:1753
-#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:298
+#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769
+#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299
 #: plugins/sudoers/visudo.c:177
 #, c-format
 msgid "%s version %s\n"
 msgstr "%s versione %s\n"
 
-#: logsrvd/logsrvd_conf.c:393
+#: logsrvd/logsrvd_conf.c:331
 msgid "TLS not supported"
 msgstr "TLS non supportato"
 
-#: logsrvd/logsrvd_conf.c:405
+#: logsrvd/logsrvd_conf.c:343
 #, c-format
 msgid "%s:%s"
 msgstr "%s:%s"
 
-#: logsrvd/logsrvd_conf.c:471 logsrvd/logsrvd_conf.c:715
+#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653
 #, c-format
 msgid "%s: not a fully qualified path"
 msgstr "%s: non è un percorso completo"
 
-#: logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:767
 #, c-format
 msgid "%s:%d unmatched '[': %s"
 msgstr "%s:%d \"[\" non corrispondente: %s"
 
-#: logsrvd/logsrvd_conf.c:840
+#: logsrvd/logsrvd_conf.c:778
 #, c-format
 msgid "%s:%d invalid config section: %s"
 msgstr "%s:%d sezione configurazione non valida: %s"
 
-#: logsrvd/logsrvd_conf.c:848
+#: logsrvd/logsrvd_conf.c:786
 #, c-format
 msgid "%s:%d invalid configuration line: %s"
 msgstr "%s:%d riga di configurazione non valida: %s"
 
-#: logsrvd/logsrvd_conf.c:854
+#: logsrvd/logsrvd_conf.c:792
 #, c-format
 msgid "%s:%d expected section name: %s"
 msgstr "%s:%d atteso nome di sezione: %s"
 
-#: logsrvd/logsrvd_conf.c:868
+#: logsrvd/logsrvd_conf.c:806
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "valore non valido per \"%s\": %s"
 
-#: logsrvd/logsrvd_conf.c:876
+#: logsrvd/logsrvd_conf.c:814
 #, c-format
 msgid "%s:%d unknown key: %s"
 msgstr "%s:%d chiave sconosciuta: %s"
 
-#: logsrvd/logsrvd_conf.c:1032
+#: logsrvd/logsrvd_conf.c:1003
 #, c-format
 msgid "unknown syslog facility %s"
 msgstr "strumento syslog %s sconosciuto"
 
-#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1040
-#: logsrvd/logsrvd_conf.c:1044
+#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011
+#: logsrvd/logsrvd_conf.c:1015
 #, c-format
 msgid "unknown syslog priority %s"
 msgstr "priorità syslog %s sconosciuta"
 
-#: logsrvd/sendlog.c:126
+#: logsrvd/sendlog.c:127
 msgid ""
 "\n"
 "Options:\n"
@@ -730,143 +768,146 @@ msgstr ""
 "                           selezionato N volte in parallelo\n"
 "  -V, --version            Visualizza la versione ed esce\n"
 
-#: logsrvd/sendlog.c:163 plugins/sudoers/iolog_client.c:432
+#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432
 #, c-format
 msgid "unable to look up %s:%s: %s"
 msgstr "impossibile cercare %s:%s: %s"
 
-#: logsrvd/sendlog.c:186
+#: logsrvd/sendlog.c:202
 msgid "unable to get server IP addr"
 msgstr "impossibile ottenere indirizzo IP del server"
 
-#: logsrvd/sendlog.c:240 plugins/sudoers/sudoreplay.c:850
+#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851
 #, c-format
 msgid "unable to read %s/%s: %s"
 msgstr "impossibile leggere %s/%s: %s"
 
-#: logsrvd/sendlog.c:261 plugins/sudoers/iolog_client.c:686
+#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694
 #, c-format
 msgid "client message too large: %zu"
 msgstr "messaggio client troppo grande: %zu"
 
-#: logsrvd/sendlog.c:794
+#: logsrvd/sendlog.c:810
 #, c-format
 msgid "%s: write buffer already in use"
 msgstr "%s: buffer di scrittura già in uso"
 
-#: logsrvd/sendlog.c:846 plugins/sudoers/iolog.c:855
-#: plugins/sudoers/iolog.c:924
+#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880
+#: plugins/sudoers/iolog.c:949
 #, c-format
 msgid "unexpected I/O event %d"
 msgstr "evento I/O %d non atteso"
 
-#: logsrvd/sendlog.c:892 logsrvd/sendlog.c:909 logsrvd/sendlog.c:943
-#: plugins/sudoers/iolog_client.c:1171 plugins/sudoers/iolog_client.c:1241
-#: plugins/sudoers/iolog_client.c:1289
+#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386
+#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490
 #, c-format
 msgid "%s: unexpected state %d"
 msgstr "%s: stato %d non atteso"
 
-#: logsrvd/sendlog.c:915 plugins/sudoers/iolog_client.c:1247
+#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460
 msgid "invalid ServerHello"
 msgstr "ServerHello non valido"
 
-#: logsrvd/sendlog.c:979 plugins/sudoers/iolog_client.c:1333
+#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534
 #, c-format
 msgid "error message received from server: %s"
 msgstr "messaggio di errore ricevuto dal server: %s"
 
-#: logsrvd/sendlog.c:992 plugins/sudoers/iolog_client.c:1346
+#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547
 #, c-format
 msgid "abort message received from server: %s"
 msgstr "messaggio di abort ricevuto dal server: %s"
 
-#: logsrvd/sendlog.c:1011 plugins/sudoers/iolog_client.c:1365
+#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566
 msgid "unable to unpack ServerMessage"
 msgstr "impossibile aprire ServerMessage"
 
-#: logsrvd/sendlog.c:1051 plugins/sudoers/iolog_client.c:1398
+#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597
 #, c-format
 msgid "%s: unexpected type_case value %d"
 msgstr "%s: valore type_case %d non atteso"
 
-#: logsrvd/sendlog.c:1080
+#: logsrvd/sendlog.c:1096
 msgid "timeout reading from server"
 msgstr "timeout nel leggere dal server"
 
-#: logsrvd/sendlog.c:1158
+#: logsrvd/sendlog.c:1174
 msgid "premature EOF"
 msgstr "EOF prematuro"
 
-#: logsrvd/sendlog.c:1171 plugins/sudoers/iolog_client.c:1552
+#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751
 #, c-format
 msgid "server message too large: %u"
 msgstr "messaggio server troppo grande: %u"
 
-#: logsrvd/sendlog.c:1222
+#: logsrvd/sendlog.c:1238
 msgid "timeout writing to server"
 msgstr "timeout nello scrivere sul server"
 
-#: logsrvd/sendlog.c:1441 plugins/sudoers/iolog_client.c:296
+#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296
 msgid "TLS handshake timeout occurred"
 msgstr "timeout handshake TLS"
 
-#: logsrvd/sendlog.c:1460 logsrvd/sendlog.c:1475
-#: plugins/sudoers/iolog_client.c:318 plugins/sudoers/iolog_client.c:334
+#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491
+#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334
 msgid "unable to set event"
 msgstr "impossibile impostare evento"
 
-#: logsrvd/sendlog.c:1485 logsrvd/sendlog.c:1489
+#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505
 #, c-format
 msgid "TLS connection failed: %s"
 msgstr "Connessione TLS non riuscita: %s"
 
-#: logsrvd/sendlog.c:1522
+#: logsrvd/sendlog.c:1538
 #, c-format
 msgid "Unable to initialize ssl context: %s"
 msgstr "Impossibile inizializzare il conteso ssl: %s"
 
-#: logsrvd/sendlog.c:1527 plugins/sudoers/iolog_client.c:258
+#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258
 #, c-format
 msgid "Unable to allocate ssl object: %s"
 msgstr "Impossibile allocare l'oggetto ssl: %s"
 
-#: logsrvd/sendlog.c:1532
+#: logsrvd/sendlog.c:1548
 #, c-format
 msgid "Unable to attach socket to the ssl object: %s"
 msgstr "Impossibile collegare il socket all'oggetto ssl: %s"
 
-#: logsrvd/sendlog.c:1776
+#: logsrvd/sendlog.c:1792
 msgid "both restart point and iolog ID must be specified"
 msgstr "devono essere specificati sia il punto di inizio che l'ID di iolog"
 
-#: logsrvd/sendlog.c:1780
+#: logsrvd/sendlog.c:1796
 msgid "a restart point may not be set when no I/O is sent"
 msgstr "un punto di partenza non può essere impostato quando non è inviato alcun I/O"
 
-#: logsrvd/sendlog.c:1855
+#: logsrvd/sendlog.c:1871
 #, c-format
 msgid "exited prematurely with state %d"
 msgstr "uscito inaspettatamente con stato %d"
 
-#: logsrvd/sendlog.c:1856
+#: logsrvd/sendlog.c:1872
 #, c-format
 msgid "elapsed time sent to server [%lld, %ld]"
 msgstr "tempo trascorso inviato al server [%lld, %ld]"
 
-#: logsrvd/sendlog.c:1858
+#: logsrvd/sendlog.c:1874
 #, c-format
 msgid "commit point received from server [%lld, %ld]"
 msgstr "punto di commit ricevuto dal server [%lld, %ld]"
 
-#: plugins/sudoers/alias.c:144
+#: plugins/sudoers/alias.c:148
 #, c-format
 msgid "Alias \"%s\" already defined"
 msgstr "Alias \"%s\" già definito"
 
-#: plugins/sudoers/auth/aix_auth.c:198 plugins/sudoers/logging.c:783
-msgid "unable to fork"
-msgstr "impossibile eseguire fork"
+#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343
+#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002
+#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114
+msgid "unable to get time of day"
+msgstr "impossibile ottenere l'ora"
 
 #: plugins/sudoers/auth/aix_auth.c:277
 #, c-format
@@ -1095,17 +1136,16 @@ msgstr ""
 "\n"
 
 #: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311
-#: plugins/sudoers/sudoers.c:840 plugins/sudoers/sudoers.c:891
+#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858
 #: plugins/sudoers/tsdump.c:119
 #, c-format
 msgid "unknown uid: %u"
 msgstr "uid sconosciuto: %u"
 
 #: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85
-#: plugins/sudoers/iolog.c:117 plugins/sudoers/policy.c:1083
-#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:443
-#: plugins/sudoers/sudoers.c:1340 plugins/sudoers/testsudoers.c:219
-#: plugins/sudoers/testsudoers.c:386
+#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088
+#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307
+#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386
 #, c-format
 msgid "unknown user: %s"
 msgstr "utente sconosciuto: %s"
@@ -1145,7 +1185,7 @@ msgstr "formato di output %s non supportato"
 msgid "%s: input and output files must be different"
 msgstr "%s: i file di input e output devono essere diversi"
 
-#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:182
+#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178
 #: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249
 #: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926
 msgid "unable to initialize sudoers default values"
@@ -1178,8 +1218,8 @@ msgstr "filtro non valido: %s"
 
 #: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634
 #: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872
-#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1086
-#: plugins/sudoers/sudoreplay.c:1434 plugins/sudoers/timestamp.c:441
+#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441
 #: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922
 #, c-format
 msgid "unable to open %s"
@@ -1200,7 +1240,7 @@ msgstr "errore di analisi in %s vicino alla riga %d\n"
 msgid "parse error in %s\n"
 msgstr "errore di analisi in %s\n"
 
-#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1123
+#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124
 #: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328
 #, c-format
 msgid "unable to write to %s"
@@ -1264,13 +1304,13 @@ msgstr "voce Defaults \"%s\" sconosciuta"
 
 #: 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:502
+#: plugins/sudoers/ldap.c:503
 msgid "unable to get GMT time"
 msgstr "impossibile ottenere l'ora GMT"
 
 #: 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:508
+#: plugins/sudoers/ldap.c:509
 msgid "unable to format timestamp"
 msgstr "impossibile formattare la marcatura temporale"
 
@@ -1283,646 +1323,651 @@ msgstr "troppe voci sudoers, massimo %u"
 msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified."
 msgstr "la variabile d'ambiente SUDOERS_BASE non è impostata e non è stata specificata l'opzione -b."
 
-#: plugins/sudoers/def_data.c:44
+#: plugins/sudoers/def_data.c:50
 #, c-format
 msgid "Syslog facility if syslog is being used for logging: %s"
 msgstr "Infrastruttura syslog se syslog viene utilizzato per le registrazioni: %s"
 
-#: plugins/sudoers/def_data.c:48
+#: plugins/sudoers/def_data.c:54
 #, c-format
 msgid "Syslog priority to use when user authenticates successfully: %s"
 msgstr "Priorità di syslog se l'utente si identifica con successo: %s"
 
-#: plugins/sudoers/def_data.c:52
+#: plugins/sudoers/def_data.c:58
 #, c-format
 msgid "Syslog priority to use when user authenticates unsuccessfully: %s"
 msgstr "Priorità di syslog se l'utente non si identifica con successo: %s"
 
-#: plugins/sudoers/def_data.c:56
+#: plugins/sudoers/def_data.c:62
 msgid "Put OTP prompt on its own line"
 msgstr "Mette il prompt OTP su una riga a parte"
 
-#: plugins/sudoers/def_data.c:60
+#: plugins/sudoers/def_data.c:66
 msgid "Ignore '.' in $PATH"
 msgstr "Ignora \".\" in $PATH"
 
-#: plugins/sudoers/def_data.c:64
+#: plugins/sudoers/def_data.c:70
 msgid "Always send mail when sudo is run"
 msgstr "Invia sempre una email quando viene eseguito sudo"
 
-#: plugins/sudoers/def_data.c:68
+#: plugins/sudoers/def_data.c:74
 msgid "Send mail if user authentication fails"
 msgstr "Invia una email se l'autenticazione utente non riesce"
 
-#: plugins/sudoers/def_data.c:72
+#: plugins/sudoers/def_data.c:78
 msgid "Send mail if the user is not in sudoers"
 msgstr "Invia una email se l'utente non è tra i sudoers"
 
-#: plugins/sudoers/def_data.c:76
+#: plugins/sudoers/def_data.c:82
 msgid "Send mail if the user is not in sudoers for this host"
 msgstr "Invia una email se l'utente non è tra i sudoers per questo host"
 
-#: plugins/sudoers/def_data.c:80
+#: plugins/sudoers/def_data.c:86
 msgid "Send mail if the user is not allowed to run a command"
 msgstr "Invia una email se l'utente non è abilitato a eseguire un comando"
 
-#: plugins/sudoers/def_data.c:84
+#: plugins/sudoers/def_data.c:90
 msgid "Send mail if the user tries to run a command"
 msgstr "Invia una email se l'utente tenta di eseguire un comando"
 
-#: plugins/sudoers/def_data.c:88
+#: plugins/sudoers/def_data.c:94
 msgid "Use a separate timestamp for each user/tty combo"
 msgstr "Usa una marcatura temporale diversa per ogni combinazione utente/tty"
 
-#: plugins/sudoers/def_data.c:92
+#: plugins/sudoers/def_data.c:98
 msgid "Lecture user the first time they run sudo"
 msgstr "Aiuta gli utenti alla prima esecuzione di sudo"
 
-#: plugins/sudoers/def_data.c:96
+#: plugins/sudoers/def_data.c:102
 #, c-format
 msgid "File containing the sudo lecture: %s"
 msgstr "File contenente la lezione su sudo: %s"
 
-#: plugins/sudoers/def_data.c:100
+#: plugins/sudoers/def_data.c:106
 msgid "Require users to authenticate by default"
 msgstr "Richiede in modo predefinito l'autenticazione degli utenti"
 
-#: plugins/sudoers/def_data.c:104
+#: plugins/sudoers/def_data.c:110
 msgid "Root may run sudo"
 msgstr "Root può eseguire sudo"
 
-#: plugins/sudoers/def_data.c:108
+#: plugins/sudoers/def_data.c:114
 msgid "Log the hostname in the (non-syslog) log file"
 msgstr "Registra il nome host nel file di registro (non-syslog)"
 
-#: plugins/sudoers/def_data.c:112
+#: plugins/sudoers/def_data.c:118
 msgid "Log the year in the (non-syslog) log file"
 msgstr "Registra l'anno nel file di registro (non-syslog)"
 
-#: plugins/sudoers/def_data.c:116
+#: plugins/sudoers/def_data.c:122
 msgid "If sudo is invoked with no arguments, start a shell"
 msgstr "Se sudo viene lanciato senza alcun argomento, avvia una shell"
 
-#: plugins/sudoers/def_data.c:120
+#: plugins/sudoers/def_data.c:126
 msgid "Set $HOME to the target user when starting a shell with -s"
 msgstr "Imposta $HOME all'utente definito quando viene avviata una shell con -s"
 
-#: plugins/sudoers/def_data.c:124
+#: plugins/sudoers/def_data.c:130
 msgid "Always set $HOME to the target user's home directory"
 msgstr "Imposta sempre $HOME alla directory home dell'utente definito"
 
-#: plugins/sudoers/def_data.c:128
+#: plugins/sudoers/def_data.c:134
 msgid "Allow some information gathering to give useful error messages"
 msgstr "Consente la raccolta di alcune informazioni per dare messaggi di errore utili"
 
-#: plugins/sudoers/def_data.c:132
+#: plugins/sudoers/def_data.c:138
 msgid "Require fully-qualified hostnames in the sudoers file"
 msgstr "Richiede nomi host completi nel file sudoers"
 
-#: plugins/sudoers/def_data.c:136
+#: plugins/sudoers/def_data.c:142
 msgid "Insult the user when they enter an incorrect password"
 msgstr "Apostrofa l'utente quando inserisce una password errata"
 
-#: plugins/sudoers/def_data.c:140
+#: plugins/sudoers/def_data.c:146
 msgid "Only allow the user to run sudo if they have a tty"
 msgstr "Consente all'utente di seguire sudo solo se dispone di un tty"
 
-#: plugins/sudoers/def_data.c:144
+#: plugins/sudoers/def_data.c:150
 msgid "Visudo will honor the EDITOR environment variable"
 msgstr "visudo utilizzerà il valore definito nella variabile EDITOR"
 
-#: plugins/sudoers/def_data.c:148
+#: plugins/sudoers/def_data.c:154
 msgid "Prompt for root's password, not the users's"
 msgstr "Chiede la password di root, non quella dell'utente"
 
-#: plugins/sudoers/def_data.c:152
+#: plugins/sudoers/def_data.c:158
 msgid "Prompt for the runas_default user's password, not the users's"
 msgstr "Chiede la password dell'utente runas_default, non quella dell'utente"
 
-#: plugins/sudoers/def_data.c:156
+#: plugins/sudoers/def_data.c:162
 msgid "Prompt for the target user's password, not the users's"
 msgstr "Chiede la password dell'utente definito, non quella dell'invocante"
 
-#: plugins/sudoers/def_data.c:160
+#: plugins/sudoers/def_data.c:166
 msgid "Apply defaults in the target user's login class if there is one"
 msgstr "Applica i Defaults nella classe di login dell'utente definito, se presente"
 
-#: plugins/sudoers/def_data.c:164
+#: plugins/sudoers/def_data.c:170
 msgid "Set the LOGNAME and USER environment variables"
 msgstr "Imposta le variabili d'ambiente LOGNAME e USER"
 
-#: plugins/sudoers/def_data.c:168
+#: plugins/sudoers/def_data.c:174
 msgid "Only set the effective uid to the target user, not the real uid"
 msgstr "Imposta lo uid effettivo all'utente definito, non lo uid reale"
 
-#: plugins/sudoers/def_data.c:172
+#: plugins/sudoers/def_data.c:178
 msgid "Don't initialize the group vector to that of the target user"
 msgstr "Non inizializza il vettore di gruppo con quello dell'utente definito"
 
-#: plugins/sudoers/def_data.c:176
+#: plugins/sudoers/def_data.c:182
 #, c-format
 msgid "Length at which to wrap log file lines (0 for no wrap): %u"
 msgstr "Lunghezza a cui andare a capo nei file di registro (0 per non andare a capo): %u"
 
-#: plugins/sudoers/def_data.c:180
+#: plugins/sudoers/def_data.c:186
 #, c-format
 msgid "Authentication timestamp timeout: %.1f minutes"
 msgstr "Timeout marcatura temporale di autenticazione: %.1f minuti"
 
-#: plugins/sudoers/def_data.c:184
+#: plugins/sudoers/def_data.c:190
 #, c-format
 msgid "Password prompt timeout: %.1f minutes"
 msgstr "Timeout per inserimento password: %.1f minuti"
 
-#: plugins/sudoers/def_data.c:188
+#: plugins/sudoers/def_data.c:194
 #, c-format
 msgid "Number of tries to enter a password: %u"
 msgstr "Numero di tentativi per l'inserimento della password: %u"
 
-#: plugins/sudoers/def_data.c:192
+#: plugins/sudoers/def_data.c:198
 #, c-format
 msgid "Umask to use or 0777 to use user's: 0%o"
 msgstr "umask da utilizzare o 0777 per utilizzare quella dell'utente: 0%o"
 
-#: plugins/sudoers/def_data.c:196
+#: plugins/sudoers/def_data.c:202
 #, c-format
 msgid "Path to log file: %s"
 msgstr "Percorso al file di registro: %s"
 
-#: plugins/sudoers/def_data.c:200
+#: plugins/sudoers/def_data.c:206
 #, c-format
 msgid "Path to mail program: %s"
 msgstr "Percorso al programma email: %s"
 
-#: plugins/sudoers/def_data.c:204
+#: plugins/sudoers/def_data.c:210
 #, c-format
 msgid "Flags for mail program: %s"
 msgstr "Flag per il programma email: %s"
 
-#: plugins/sudoers/def_data.c:208
+#: plugins/sudoers/def_data.c:214
 #, c-format
 msgid "Address to send mail to: %s"
 msgstr "Indirizzo a cui mandare l'email: %s"
 
-#: plugins/sudoers/def_data.c:212
+#: plugins/sudoers/def_data.c:218
 #, c-format
 msgid "Address to send mail from: %s"
 msgstr "Indirizzo da cui mandare l'email: %s"
 
-#: plugins/sudoers/def_data.c:216
+#: plugins/sudoers/def_data.c:222
 #, c-format
 msgid "Subject line for mail messages: %s"
 msgstr "Oggetto dell'email: %s"
 
-#: plugins/sudoers/def_data.c:220
+#: plugins/sudoers/def_data.c:226
 #, c-format
 msgid "Incorrect password message: %s"
 msgstr "Messaggio password errata: %s"
 
-#: plugins/sudoers/def_data.c:224
+#: plugins/sudoers/def_data.c:230
 #, c-format
 msgid "Path to lecture status dir: %s"
 msgstr "Percorso directory di stato della lezione: %s"
 
-#: plugins/sudoers/def_data.c:228
+#: plugins/sudoers/def_data.c:234
 #, c-format
 msgid "Path to authentication timestamp dir: %s"
 msgstr "Percorso directory con la marcatura temporale di autenticazione: %s"
 
-#: plugins/sudoers/def_data.c:232
+#: plugins/sudoers/def_data.c:238
 #, c-format
 msgid "Owner of the authentication timestamp dir: %s"
 msgstr "Proprietario directory con la marcatura temporale di autenticazione: %s"
 
-#: plugins/sudoers/def_data.c:236
+#: plugins/sudoers/def_data.c:242
 #, c-format
 msgid "Users in this group are exempt from password and PATH requirements: %s"
 msgstr "Agli utenti di questo gruppo non sono richiesti password e PATH: %s"
 
-#: plugins/sudoers/def_data.c:240
+#: plugins/sudoers/def_data.c:246
 #, c-format
 msgid "Default password prompt: %s"
 msgstr "Prompt predefinito per la password: %s"
 
-#: plugins/sudoers/def_data.c:244
+#: plugins/sudoers/def_data.c:250
 msgid "If set, passprompt will override system prompt in all cases."
 msgstr "Se impostato, passprompt scavalcherà sempre il prompt di sistema."
 
-#: plugins/sudoers/def_data.c:248
+#: plugins/sudoers/def_data.c:254
 #, c-format
 msgid "Default user to run commands as: %s"
 msgstr "Utente predefinito con cui eseguire i comandi: %s"
 
-#: plugins/sudoers/def_data.c:252
+#: plugins/sudoers/def_data.c:258
 #, c-format
 msgid "Value to override user's $PATH with: %s"
 msgstr "Valore con cui sovrascrivere la variabile $PATH dell'utente: %s"
 
-#: plugins/sudoers/def_data.c:256
+#: plugins/sudoers/def_data.c:262
 #, c-format
 msgid "Path to the editor for use by visudo: %s"
 msgstr "Percorso all'editor per visudo: %s"
 
-#: plugins/sudoers/def_data.c:260
+#: plugins/sudoers/def_data.c:266
 #, c-format
 msgid "When to require a password for 'list' pseudocommand: %s"
 msgstr "Quando richiedere una password per il pseudo-comando \"list\": %s"
 
-#: plugins/sudoers/def_data.c:264
+#: plugins/sudoers/def_data.c:270
 #, c-format
 msgid "When to require a password for 'verify' pseudocommand: %s"
 msgstr "Quando richiedere una password per il pseudo-comando \"verify\": %s"
 
-#: plugins/sudoers/def_data.c:268
-msgid "Preload the dummy exec functions contained in the sudo_noexec library"
-msgstr "Pre-carica le funzioni exec dummy contenute nella libreria sudo_noexec"
+#: plugins/sudoers/def_data.c:274
+msgid "Preload the sudo_noexec library which replaces the exec functions"
+msgstr "Carica la libreria sudo_noexec che sostituisce le funzioni exec"
 
-#: plugins/sudoers/def_data.c:272
+#: plugins/sudoers/def_data.c:278
 msgid "If LDAP directory is up, do we ignore local sudoers file"
 msgstr "Se LDAP è funzionante, viene ignorato il file sudoers locale"
 
-#: plugins/sudoers/def_data.c:276
+#: plugins/sudoers/def_data.c:282
 #, c-format
 msgid "File descriptors >= %d will be closed before executing a command"
 msgstr "I descrittori di file >= %d verranno chiusi prima dell'esecuzione di un comando"
 
-#: plugins/sudoers/def_data.c:280
+#: plugins/sudoers/def_data.c:286
 msgid "If set, users may override the value of \"closefrom\" with the -C option"
 msgstr "Se impostata, gli utenti possono sovrascrivere il valore di \"closefrom\" con l'opzione -C"
 
-#: plugins/sudoers/def_data.c:284
+#: plugins/sudoers/def_data.c:290
 msgid "Allow users to set arbitrary environment variables"
 msgstr "Consente agli utenti di impostare variabili d'ambiente"
 
-#: plugins/sudoers/def_data.c:288
+#: plugins/sudoers/def_data.c:294
 msgid "Reset the environment to a default set of variables"
 msgstr "Reimposta l'ambiente con le variabili predefinite"
 
-#: plugins/sudoers/def_data.c:292
-msgid "Environment variables to check for sanity:"
-msgstr "Variabile d'ambienti da validare:"
+#: plugins/sudoers/def_data.c:298
+msgid "Environment variables to check for safety:"
+msgstr "Variabile d'ambienti da verificare per la sicurezza:"
 
-#: plugins/sudoers/def_data.c:296
+#: plugins/sudoers/def_data.c:302
 msgid "Environment variables to remove:"
 msgstr "Variabili d'ambiente da rimuovere:"
 
-#: plugins/sudoers/def_data.c:300
+#: plugins/sudoers/def_data.c:306
 msgid "Environment variables to preserve:"
 msgstr "Variabili d'ambiente da preservare:"
 
-#: plugins/sudoers/def_data.c:304
+#: plugins/sudoers/def_data.c:310
 #, c-format
 msgid "SELinux role to use in the new security context: %s"
 msgstr "Ruolo SELinux da usare nel nuovo contesto di sicurezza: %s"
 
-#: plugins/sudoers/def_data.c:308
+#: plugins/sudoers/def_data.c:314
 #, c-format
 msgid "SELinux type to use in the new security context: %s"
 msgstr "Tipologia di SELinux da usare nel nuovo contesto di sicurezza: %s"
 
-#: plugins/sudoers/def_data.c:312
+#: plugins/sudoers/def_data.c:318
 #, c-format
 msgid "Path to the sudo-specific environment file: %s"
 msgstr "Percorso al file d'ambiente specifico di sudo: %s"
 
-#: plugins/sudoers/def_data.c:316
+#: plugins/sudoers/def_data.c:322
 #, c-format
 msgid "Path to the restricted sudo-specific environment file: %s"
 msgstr "Percorso al file d'ambiente riservato specifico di sudo: %s"
 
-#: plugins/sudoers/def_data.c:320
+#: plugins/sudoers/def_data.c:326
 #, c-format
 msgid "Locale to use while parsing sudoers: %s"
 msgstr "Localizzazione da usare durante l'analisi del file sudoers: %s"
 
-#: plugins/sudoers/def_data.c:324
+#: plugins/sudoers/def_data.c:330
 msgid "Allow sudo to prompt for a password even if it would be visible"
 msgstr "Abilita sudo a chiedere una password anche se sarebbe visibile"
 
-#: plugins/sudoers/def_data.c:328
+#: plugins/sudoers/def_data.c:334
 msgid "Provide visual feedback at the password prompt when there is user input"
 msgstr "Fornisce riscontro visibile al prompt della password nel caso di input utente"
 
-#: plugins/sudoers/def_data.c:332
+#: plugins/sudoers/def_data.c:338
 msgid "Use faster globbing that is less accurate but does not access the filesystem"
 msgstr "Usa glob più veloce e meno preciso, ma non accede al file system"
 
-#: plugins/sudoers/def_data.c:336
+#: plugins/sudoers/def_data.c:342
 msgid "The umask specified in sudoers will override the user's, even if it is more permissive"
 msgstr "La umask definita in sudoers scavalca quella dell'utente, anche se è più permissiva"
 
-#: plugins/sudoers/def_data.c:340
+#: plugins/sudoers/def_data.c:346
 msgid "Log user's input for the command being run"
 msgstr "Registra l'input dell'utente per il comando in esecuzione"
 
-#: plugins/sudoers/def_data.c:344
+#: plugins/sudoers/def_data.c:350
 msgid "Log the output of the command being run"
 msgstr "Registra l'output del comando in esecuzione"
 
-#: plugins/sudoers/def_data.c:348
+#: plugins/sudoers/def_data.c:354
 msgid "Compress I/O logs using zlib"
 msgstr "Comprime i registri utilizzando zlib"
 
-#: plugins/sudoers/def_data.c:352
+#: plugins/sudoers/def_data.c:358
 msgid "Always run commands in a pseudo-tty"
 msgstr "Esegue sempre i comandi in uno pseudo-tty"
 
-#: plugins/sudoers/def_data.c:356
+#: plugins/sudoers/def_data.c:362
 #, c-format
 msgid "Plugin for non-Unix group support: %s"
 msgstr "Plugin per supporto ai gruppi non-Unix: %s"
 
-#: plugins/sudoers/def_data.c:360
+#: plugins/sudoers/def_data.c:366
 #, c-format
 msgid "Directory in which to store input/output logs: %s"
 msgstr "Directory in cui salvare i registri di I/O: %s"
 
-#: plugins/sudoers/def_data.c:364
+#: plugins/sudoers/def_data.c:370
 #, c-format
 msgid "File in which to store the input/output log: %s"
 msgstr "File in cui salvare il registro I/O: %s"
 
-#: plugins/sudoers/def_data.c:368
+#: plugins/sudoers/def_data.c:374
 msgid "Add an entry to the utmp/utmpx file when allocating a pty"
 msgstr "Aggiunge una voce al file utmp/utmpx quando viene allocato un pty"
 
-#: plugins/sudoers/def_data.c:372
+#: plugins/sudoers/def_data.c:378
 msgid "Set the user in utmp to the runas user, not the invoking user"
 msgstr "Imposta l'utente in utmp all'utente runas, non l'utente invocante"
 
-#: plugins/sudoers/def_data.c:376
+#: plugins/sudoers/def_data.c:382
 #, c-format
 msgid "Set of permitted privileges: %s"
 msgstr "Insieme di privilegi concessi: %s"
 
-#: plugins/sudoers/def_data.c:380
+#: plugins/sudoers/def_data.c:386
 #, c-format
 msgid "Set of limit privileges: %s"
 msgstr "Insieme di privilegi non concessi: %s"
 
-#: plugins/sudoers/def_data.c:384
+#: plugins/sudoers/def_data.c:390
 msgid "Run commands on a pty in the background"
 msgstr "Esegue i comandi in un pty in background"
 
-#: plugins/sudoers/def_data.c:388
+#: plugins/sudoers/def_data.c:394
 #, c-format
 msgid "PAM service name to use: %s"
 msgstr "Nome del servizio PAM da usare: %s"
 
-#: plugins/sudoers/def_data.c:392
+#: plugins/sudoers/def_data.c:398
 #, c-format
 msgid "PAM service name to use for login shells: %s"
 msgstr "Nome del servizio PAM da usare per le shell di login: %s"
 
-#: plugins/sudoers/def_data.c:396
+#: plugins/sudoers/def_data.c:402
 msgid "Attempt to establish PAM credentials for the target user"
 msgstr "Tentativo di stabilire le credenziali PAM per l'utente finale"
 
-#: plugins/sudoers/def_data.c:400
+#: plugins/sudoers/def_data.c:406
 msgid "Create a new PAM session for the command to run in"
 msgstr "Crea una nuova sessione PAM in cui eseguire il comando"
 
-#: plugins/sudoers/def_data.c:404
+#: plugins/sudoers/def_data.c:410
 msgid "Perform PAM account validation management"
 msgstr "Esegue la gestione della convalida dell'account PAM"
 
-#: plugins/sudoers/def_data.c:408
+#: plugins/sudoers/def_data.c:414
 #, c-format
 msgid "Maximum I/O log sequence number: %s"
 msgstr "Numero massimo di sequenze I/O di registro: %s"
 
-#: plugins/sudoers/def_data.c:412
+#: plugins/sudoers/def_data.c:418
 msgid "Enable sudoers netgroup support"
 msgstr "Abilita support netgroup in sudoers"
 
-#: plugins/sudoers/def_data.c:416
+#: plugins/sudoers/def_data.c:422
 msgid "Check parent directories for writability when editing files with sudoedit"
 msgstr "Controlla le directory superiori per accesso in scrittura durante le modifiche con sudoedit"
 
-#: plugins/sudoers/def_data.c:420
+#: plugins/sudoers/def_data.c:426
 msgid "Follow symbolic links when editing files with sudoedit"
 msgstr "Segue i collegamenti simbolici durante le modifiche con sudoedit"
 
-#: plugins/sudoers/def_data.c:424
+#: plugins/sudoers/def_data.c:430
 msgid "Query the group plugin for unknown system groups"
 msgstr "Interroga il plugin dei gruppi per gruppi di sistema sconosciuti"
 
-#: plugins/sudoers/def_data.c:428
+#: plugins/sudoers/def_data.c:434
 msgid "Match netgroups based on the entire tuple: user, host and domain"
 msgstr "Corrispondenza gruppi di rete con tutti i valori: utente, host e dominio"
 
-#: plugins/sudoers/def_data.c:432
+#: plugins/sudoers/def_data.c:438
 msgid "Allow commands to be run even if sudo cannot write to the audit log"
 msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul registro di controllo"
 
-#: plugins/sudoers/def_data.c:436
+#: plugins/sudoers/def_data.c:442
 msgid "Allow commands to be run even if sudo cannot write to the I/O log"
 msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul registro di I/O"
 
-#: plugins/sudoers/def_data.c:440
+#: plugins/sudoers/def_data.c:446
 msgid "Allow commands to be run even if sudo cannot write to the log file"
 msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul file di registro"
 
-#: plugins/sudoers/def_data.c:444
+#: plugins/sudoers/def_data.c:450
 msgid "Resolve groups in sudoers and match on the group ID, not the name"
 msgstr "Gestisce i gruppi attraverso sudoers ed esegue la corrispondenza sull'ID del gruppo, non sul nome"
 
-#: plugins/sudoers/def_data.c:448
+#: plugins/sudoers/def_data.c:454
 #, c-format
 msgid "Log entries larger than this value will be split into multiple syslog messages: %u"
 msgstr "Voci di registro più grandi di questo valore vengono divise su più messaggi: %u"
 
-#: plugins/sudoers/def_data.c:452
+#: plugins/sudoers/def_data.c:458
 #, c-format
 msgid "User that will own the I/O log files: %s"
 msgstr "Utente proprietario dei file di registro di I/O: %s"
 
-#: plugins/sudoers/def_data.c:456
+#: plugins/sudoers/def_data.c:462
 #, c-format
 msgid "Group that will own the I/O log files: %s"
 msgstr "Gruppo proprietario dei file di registro di I/O: %s"
 
-#: plugins/sudoers/def_data.c:460
+#: plugins/sudoers/def_data.c:466
 #, c-format
 msgid "File mode to use for the I/O log files: 0%o"
 msgstr "Modalità dei file di registro di I/O: 0%o"
 
-#: plugins/sudoers/def_data.c:464
+#: plugins/sudoers/def_data.c:470
 #, c-format
 msgid "Execute commands by file descriptor instead of by path: %s"
 msgstr "Esegue comandi in base al descrittore del file e non sul percorso: %s"
 
-#: plugins/sudoers/def_data.c:468
+#: plugins/sudoers/def_data.c:474
 msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
 msgstr "Ignora le voci Defaults sconosciute nel file sudoers invece di inviare un avviso"
 
-#: plugins/sudoers/def_data.c:472
+#: plugins/sudoers/def_data.c:478
 #, c-format
 msgid "Time in seconds after which the command will be terminated: %u"
 msgstr "Tempo in secondi dopo il quale il comando viene terminato: %u"
 
-#: plugins/sudoers/def_data.c:476
+#: plugins/sudoers/def_data.c:482
 msgid "Allow the user to specify a timeout on the command line"
 msgstr "Consente all'utente di specificare un timeout attraverso la riga di comando"
 
-#: plugins/sudoers/def_data.c:480
+#: plugins/sudoers/def_data.c:486
 msgid "Flush I/O log data to disk immediately instead of buffering it"
 msgstr "Scrive immediatamente i dati I/O del registro sul disco invece di tenerli in memoria"
 
-#: plugins/sudoers/def_data.c:484
+#: plugins/sudoers/def_data.c:490
 msgid "Include the process ID when logging via syslog"
 msgstr "Include l'ID del processo quando viene usato syslog"
 
-#: plugins/sudoers/def_data.c:488
+#: plugins/sudoers/def_data.c:494
 #, c-format
 msgid "Type of authentication timestamp record: %s"
 msgstr "Tipo di marcatura temporale di autenticazione: %s"
 
-#: plugins/sudoers/def_data.c:492
+#: plugins/sudoers/def_data.c:498
 #, c-format
 msgid "Authentication failure message: %s"
 msgstr "Messaggio di autenticazione non riuscita: %s"
 
-#: plugins/sudoers/def_data.c:496
+#: plugins/sudoers/def_data.c:502
 msgid "Ignore case when matching user names"
 msgstr "Ignora maiuscole/minuscole nella corrispondenza coi nomi utente"
 
-#: plugins/sudoers/def_data.c:500
+#: plugins/sudoers/def_data.c:506
 msgid "Ignore case when matching group names"
 msgstr "Ignora maiuscole/minuscole nella corrispondenza coi gruppi"
 
-#: plugins/sudoers/def_data.c:504
+#: plugins/sudoers/def_data.c:510
 msgid "Log when a command is allowed by sudoers"
 msgstr "Registra quando un comando è consentito da sudoers"
 
-#: plugins/sudoers/def_data.c:508
+#: plugins/sudoers/def_data.c:514
 msgid "Log when a command is denied by sudoers"
 msgstr "Registra quando un comando viene negato da sudoers"
 
-#: plugins/sudoers/def_data.c:512
+#: plugins/sudoers/def_data.c:518
 msgid "Sudo log server(s) to connect to with optional port"
 msgstr "Server di registro per sudo a cui connettersi, con la porta opzionale"
 
-#: plugins/sudoers/def_data.c:516
+#: plugins/sudoers/def_data.c:522
 #, c-format
 msgid "Sudo log server timeout in seconds: %u"
 msgstr "Timeout server di registro per sudo, in secondi: %u"
 
-#: plugins/sudoers/def_data.c:520
+#: plugins/sudoers/def_data.c:526
 msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
 msgstr "Abilita l'opzione SO_KEEPALIVE sul socket connesso al server di registro"
 
-#: plugins/sudoers/def_data.c:524
+#: plugins/sudoers/def_data.c:530
 #, c-format
 msgid "Path to the audit server's CA bundle file: %s"
 msgstr "Percorso al file bundle CA del server di audit: %s"
 
-#: plugins/sudoers/def_data.c:528
+#: plugins/sudoers/def_data.c:534
 #, c-format
 msgid "Path to the sudoers certificate file: %s"
 msgstr "Percorso al file certificato di sudoers: %s"
 
-#: plugins/sudoers/def_data.c:532
+#: plugins/sudoers/def_data.c:538
 #, c-format
 msgid "Path to the sudoers private key file: %s"
 msgstr "Percorso al file chiave privata di sudoers: %s"
 
-#: plugins/sudoers/def_data.c:536
+#: plugins/sudoers/def_data.c:542
 msgid "Verify that the log server's certificate is valid"
 msgstr "Verifica che il certificato del server di registro è valido"
 
-#: plugins/sudoers/def_data.c:540
+#: plugins/sudoers/def_data.c:546
 msgid "Allow the use of unknown runas user and/or group ID"
 msgstr "Consente l'uso di ID utente o gruppo sconosciuto per runas"
 
-#: plugins/sudoers/def_data.c:544
+#: plugins/sudoers/def_data.c:550
 msgid "Only permit running commands as a user with a valid shell"
 msgstr "Consente di eseguire i comandi a un utente con una shell valida"
 
-#: plugins/sudoers/def_data.c:548
+#: plugins/sudoers/def_data.c:554
 msgid "Set the pam remote user to the user running sudo"
 msgstr "Imposta l'utente remoto pam all'utente che esegue sudo"
 
-#: plugins/sudoers/def_data.c:552
+#: plugins/sudoers/def_data.c:558
 msgid "Set the pam remote host to the local host name"
 msgstr "Imposta l'host remoto pam al nome host locale"
 
-#: plugins/sudoers/def_data.c:556
+#: plugins/sudoers/def_data.c:562
 #, c-format
 msgid "Working directory to change to before executing the command: %s"
 msgstr "Directory di lavoro a cui passare prima dell'esecuzione del comando: %s"
 
-#: plugins/sudoers/def_data.c:560
+#: plugins/sudoers/def_data.c:566
 #, c-format
 msgid "Root directory to change to before executing the command: %s"
 msgstr "Directory root a cui passare prima dell'esecuzione del comando: %s"
 
-#: plugins/sudoers/defaults.c:184
+#: plugins/sudoers/def_data.c:570
+#, c-format
+msgid "The format of logs to produce: %s"
+msgstr "Il formato dei registri da creare: %s"
+
+#: plugins/sudoers/defaults.c:185
 #, c-format
-msgid "%s:%d: unknown defaults entry \"%s\""
-msgstr "%s:%d: voce Defaults \"%s\" sconosciuta"
+msgid "%s:%d:%d: unknown defaults entry \"%s\""
+msgstr "%s:%d:%d: voce Defaults \"%s\" sconosciuta"
 
-#: plugins/sudoers/defaults.c:187
+#: plugins/sudoers/defaults.c:188
 #, c-format
 msgid "%s: unknown defaults entry \"%s\""
 msgstr "%s: voce Defaults \"%s\" sconosciuta"
 
-#: plugins/sudoers/defaults.c:233
+#: plugins/sudoers/defaults.c:234
 #, c-format
-msgid "%s:%d: no value specified for \"%s\""
-msgstr "%s:%d: nessun valore specificato per \"%s\""
+msgid "%s:%d:%d: no value specified for \"%s\""
+msgstr "%s:%d:%d: nessun valore specificato per \"%s\""
 
-#: plugins/sudoers/defaults.c:236
+#: plugins/sudoers/defaults.c:237
 #, c-format
 msgid "%s: no value specified for \"%s\""
 msgstr "%s: nessun valore specificato per \"%s\""
 
-#: plugins/sudoers/defaults.c:274
+#: plugins/sudoers/defaults.c:275
 #, c-format
-msgid "%s:%d: option \"%s\" does not take a value"
-msgstr "%s:%d: l'opzione \"%s\" non accetta un valore"
+msgid "%s:%d:%d: option \"%s\" does not take a value"
+msgstr "%s:%d:%d: l'opzione \"%s\" non accetta un valore"
 
-#: plugins/sudoers/defaults.c:277
+#: plugins/sudoers/defaults.c:278
 #, c-format
 msgid "%s: option \"%s\" does not take a value"
 msgstr "%s: l'opzione \"%s\" non accetta un valore"
 
-#: plugins/sudoers/defaults.c:302
+#: plugins/sudoers/defaults.c:303
 #, c-format
-msgid "%s:%d: invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s:%d: tipo Defaults 0x%x non valido per l'opzione \"%s\""
+msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
+msgstr "%s:%d:%d: tipo Defaults 0x%x non valido per l'opzione \"%s\""
 
-#: plugins/sudoers/defaults.c:305
+#: plugins/sudoers/defaults.c:306
 #, c-format
 msgid "%s: invalid Defaults type 0x%x for option \"%s\""
 msgstr "%s: tipo Defaults 0x%x non valido per l'opzione \"%s\""
 
-#: plugins/sudoers/defaults.c:315
+#: plugins/sudoers/defaults.c:316
 #, c-format
-msgid "%s:%d: value \"%s\" is invalid for option \"%s\""
-msgstr "%s:%d: il valore \"%s\" non è valido per l'opzione \"%s\""
+msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
+msgstr "%s:%d:%d: il valore \"%s\" non è valido per l'opzione \"%s\""
 
-#: plugins/sudoers/defaults.c:318
+#: plugins/sudoers/defaults.c:319
 #, c-format
 msgid "%s: value \"%s\" is invalid for option \"%s\""
 msgstr "%s: il valore \"%s\" non è valido per l'opzione \"%s\""
 
-#: plugins/sudoers/defaults.c:1025
+#: plugins/sudoers/defaults.c:1030
 #, c-format
-msgid "%s:%d: values for \"%s\" must start with a '/', '~', or '*'"
-msgstr "%s:%d: i valori per \"%s\" devono iniziare con un carattere \"/\", \"~\" o \"*\""
+msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "%s:%d:%d: i valori per \"%s\" devono iniziare con un carattere \"/\", \"~\" o \"*\""
 
-#: plugins/sudoers/defaults.c:1029
+#: plugins/sudoers/defaults.c:1034
 #, c-format
 msgid "%s: values for \"%s\" must start with a '/', '~', or '*'"
 msgstr "%s: i valori per \"%s\" devono iniziare con un carattere \"/\", \"~\" o \"*\""
 
-#: plugins/sudoers/defaults.c:1040
+#: plugins/sudoers/defaults.c:1045
 #, c-format
-msgid "%s:%d: values for \"%s\" must start with a '/'"
-msgstr "%s:%d: i valori per \"%s\" devono iniziare con un carattere \"/\""
+msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
+msgstr "%s:%d:%d: i valori per \"%s\" devono iniziare con un carattere \"/\""
 
-#: plugins/sudoers/defaults.c:1044
+#: plugins/sudoers/defaults.c:1049
 #, c-format
 msgid "%s: values for \"%s\" must start with a '/'"
 msgstr "%s: i valori per \"%s\" devono iniziare con un carattere \"/\""
@@ -1970,7 +2015,7 @@ msgstr "%s deve essere di proprietà dello uid %d"
 msgid "%s must only be writable by owner"
 msgstr "%s deve essere scrivibile solo dal proprietario"
 
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:571
+#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569
 #, c-format
 msgid "unable to load %s: %s"
 msgstr "impossibile caricare %s: %s"
@@ -1999,115 +2044,70 @@ msgstr "impossibile analizzare la maschera di rete \"%s\""
 msgid "Local IP address and netmask pairs:\n"
 msgstr "Coppia indirizzo IP locale e maschera di rete:\n"
 
-#: plugins/sudoers/iolog.c:142 plugins/sudoers/sudoers.c:448
-#: plugins/sudoers/sudoers.c:449 plugins/sudoers/sudoers.c:1374
-#: plugins/sudoers/testsudoers.c:410
+#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445
+#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410
 #, c-format
 msgid "unknown group: %s"
 msgstr "gruppo sconosciuto: %s"
 
-#: plugins/sudoers/iolog.c:527 plugins/sudoers/iolog.c:817
-#: plugins/sudoers/iolog.c:969 plugins/sudoers/iolog.c:976
-#: plugins/sudoers/iolog.c:1097 plugins/sudoers/iolog.c:1104
-#: plugins/sudoers/iolog.c:1203 plugins/sudoers/iolog.c:1210
+#: plugins/sudoers/iolog.c:622
+msgid "unable to update sequence file"
+msgstr "impossibile aggiornare il file sequenza"
+
+#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841
+#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001
+#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129
+#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235
 #, c-format
 msgid "unable to write to I/O log file: %s"
 msgstr "impossibile scrivere sul file di registro di I/O: %s"
 
-#: plugins/sudoers/iolog.c:576
-msgid "unable to update sequence file"
-msgstr "impossibile aggiornare il file sequenza"
-
-#: plugins/sudoers/iolog.c:615
+#: plugins/sudoers/iolog.c:661
 #, c-format
 msgid "unable to create %s/%s"
 msgstr "impossibile creare %s/%s"
 
-#: plugins/sudoers/iolog.c:641
-msgid "unable to connect to log server"
-msgstr "impossibile connettersi al server del registro"
-
-#: plugins/sudoers/iolog.c:861
+#: plugins/sudoers/iolog.c:886
 #, c-format
 msgid "%s: internal error, I/O log file for event %d not open"
 msgstr "%s: errore interno, file registro IO per l'evento %d non aperto"
 
-#: plugins/sudoers/iolog.c:954 plugins/sudoers/iolog.c:1082
-#: plugins/sudoers/iolog.c:1187 plugins/sudoers/timestamp.c:855
+#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107
+#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855
 #: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493
 #: plugins/sudoers/visudo.c:499
 msgid "unable to read the clock"
 msgstr "impossibile leggere l'orologio"
 
-#: plugins/sudoers/iolog.c:1179 plugins/sudoers/iolog_client.c:993
+#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193
 #, c-format
 msgid "%s: internal error, invalid signal %d"
 msgstr "%s: errore interno, segnale %d non valido"
 
-#: plugins/sudoers/iolog_client.c:112 plugins/sudoers/iolog_client.c:391
-#: plugins/sudoers/iolog_client.c:1216 plugins/sudoers/iolog_client.c:1791
-msgid "error in event loop"
-msgstr "errore nel ciclo dell'evento"
-
-#: plugins/sudoers/iolog_client.c:193
-#, c-format
-msgid "Creation of new SSL_CTX object failed: %s"
-msgstr "Creazione di un nuovo oggetto SSL_CTX non riuscita: %s"
-
-#: plugins/sudoers/iolog_client.c:345 plugins/sudoers/iolog_client.c:350
-#, c-format
-msgid "TLS connection to %s:%s failed: %s"
-msgstr "Connessione TLS a %s:%s non riuscita: %s"
-
-#: plugins/sudoers/iolog_client.c:495
-msgid "TLS initialization was unsuccessful"
-msgstr "inizializzazione TLS non riuscita"
-
-#: plugins/sudoers/iolog_client.c:504
-msgid "TLS handshake was unsuccessful"
-msgstr "handshake TLS non riuscito"
-
-#: plugins/sudoers/iolog_client.c:769 plugins/sudoers/iolog_client.c:975
-msgid "unable to get time of day"
-msgstr "impossibile ottenere l'ora"
-
-#: plugins/sudoers/iolog_client.c:1002
-#, c-format
-msgid "%s: internal error, invalid exit status %d"
-msgstr "%s: errore interno, stato di uscita %d non valido"
-
-#: plugins/sudoers/iolog_client.c:1539
-msgid "lost connection to log server"
-msgstr "connessione al server del registro persa"
-
-#: plugins/sudoers/iolog_client.c:1616
-msgid "missing write buffer"
-msgstr "manca il buffer in scrittura"
-
-#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
 msgid "starttls not supported when using ldaps"
 msgstr "starttls non supportato quando viene utilizzato ldaps"
 
-#: plugins/sudoers/ldap.c:247
+#: plugins/sudoers/ldap.c:248
 #, c-format
 msgid "unable to initialize SSL cert and key db: %s"
 msgstr "impossibile inizializzare il certificato SSL e il database delle chiavi: %s"
 
-#: plugins/sudoers/ldap.c:250
+#: plugins/sudoers/ldap.c:251
 #, c-format
 msgid "you must set TLS_CERT in %s to use SSL"
 msgstr "è necessario impostare TLS_CERT in %s per usare SSL"
 
-#: plugins/sudoers/ldap.c:1658
+#: plugins/sudoers/ldap.c:1660
 #, c-format
 msgid "unable to initialize LDAP: %s"
 msgstr "impossibile inizializzare LDAP: %s"
 
-#: plugins/sudoers/ldap.c:1695
+#: plugins/sudoers/ldap.c:1697
 msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()"
 msgstr "specificato start_tls ma le librerie LDAP non supportano ldap_start_tls_s() o ldap_start_tls_s_np()"
 
-#: plugins/sudoers/ldap.c:1832 plugins/sudoers/parse_ldif.c:744
+#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744
 #, c-format
 msgid "invalid sudoOrder attribute: %s"
 msgstr "attributo sudoOrder non valido: %s"
@@ -2126,7 +2126,7 @@ msgstr "tipologia di uri LDAP non supportata: %s"
 msgid "unable to mix ldap and ldaps URIs"
 msgstr "impossibile utilizzare URI ldap e ldaps assieme"
 
-#: plugins/sudoers/ldap_util.c:554 plugins/sudoers/ldap_util.c:556
+#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555
 #, c-format
 msgid "unable to convert sudoOption: %s%s%s"
 msgstr "impossibile convertire sudoOption: %s%s%s"
@@ -2139,62 +2139,87 @@ msgstr "impossibile aprire il sistema di audit"
 msgid "unable to send audit message"
 msgstr "impossibile inviare il messaggio di audit"
 
-#: plugins/sudoers/logging.c:166
+#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391
+#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023
+msgid "error in event loop"
+msgstr "errore nel ciclo dell'evento"
+
+#: plugins/sudoers/log_client.c:193
 #, c-format
-msgid "unable to open log file: %s"
-msgstr "impossibile aprire il file di registro: %s"
+msgid "Creation of new SSL_CTX object failed: %s"
+msgstr "Creazione di un nuovo oggetto SSL_CTX non riuscita: %s"
 
-#: plugins/sudoers/logging.c:174
+#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350
 #, c-format
-msgid "unable to lock log file: %s"
-msgstr "impossibile impostare il blocco sul file di registro: %s"
+msgid "TLS connection to %s:%s failed: %s"
+msgstr "Connessione TLS a %s:%s non riuscita: %s"
 
-#: plugins/sudoers/logging.c:207
+#: plugins/sudoers/log_client.c:519
+msgid "TLS initialization was unsuccessful"
+msgstr "inizializzazione TLS non riuscita"
+
+#: plugins/sudoers/log_client.c:528
+msgid "TLS handshake was unsuccessful"
+msgstr "handshake TLS non riuscito"
+
+#: plugins/sudoers/log_client.c:1202
 #, c-format
-msgid "unable to write log file: %s"
-msgstr "impossibile scrivere sul file di registro: %s"
+msgid "%s: internal error, invalid exit status %d"
+msgstr "%s: errore interno, stato di uscita %d non valido"
 
-#: plugins/sudoers/logging.c:240
+#: plugins/sudoers/log_client.c:1738
+msgid "lost connection to log server"
+msgstr "connessione al server del registro persa"
+
+#: plugins/sudoers/log_client.c:1815
+msgid "missing write buffer"
+msgstr "manca il buffer in scrittura"
+
+#: plugins/sudoers/log_client.c:1964
+msgid "unable to connect to log server"
+msgstr "impossibile connettersi al server del registro"
+
+#: plugins/sudoers/logging.c:244
 msgid "user NOT in sudoers"
 msgstr "utente non tra i sudoers"
 
-#: plugins/sudoers/logging.c:242
+#: plugins/sudoers/logging.c:246
 msgid "user NOT authorized on host"
 msgstr "utente non autorizzato sull'host"
 
-#: plugins/sudoers/logging.c:244
+#: plugins/sudoers/logging.c:248
 msgid "command not allowed"
 msgstr "comando non consentito"
 
-#: plugins/sudoers/logging.c:287
+#: plugins/sudoers/logging.c:269
 #, c-format
 msgid "%s is not in the sudoers file.  This incident will be reported.\n"
 msgstr "%s non è nel file sudoers. Questo evento verrà segnalato.\n"
 
-#: plugins/sudoers/logging.c:290
+#: plugins/sudoers/logging.c:272
 #, c-format
 msgid "%s is not allowed to run sudo on %s.  This incident will be reported.\n"
 msgstr "A %s non è consentito eseguire sudo su %s. Questo evento verrà segnalato.\n"
 
-#: plugins/sudoers/logging.c:294
+#: plugins/sudoers/logging.c:276
 #, c-format
 msgid "Sorry, user %s may not run sudo on %s.\n"
 msgstr "L'utente %s non può eseguire sudo su %s.\n"
 
-#: plugins/sudoers/logging.c:297
+#: plugins/sudoers/logging.c:279
 #, c-format
 msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n"
 msgstr "All'utente %s non è consentito eseguire \"%s%s%s\" come %s%s%s su %s.\n"
 
-#: plugins/sudoers/logging.c:334 plugins/sudoers/sudoers.c:587
-#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:591
-#: plugins/sudoers/sudoers.c:593 plugins/sudoers/sudoers.c:742
-#: plugins/sudoers/sudoers.c:744
+#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583
+#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587
+#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739
+#: plugins/sudoers/sudoers.c:741
 #, c-format
 msgid "%s: command not found"
 msgstr "%s: comando non trovato"
 
-#: plugins/sudoers/logging.c:336 plugins/sudoers/sudoers.c:583
+#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579
 #, c-format
 msgid ""
 "ignoring \"%s\" found in '.'\n"
@@ -2203,42 +2228,32 @@ msgstr ""
 "viene ignorato \"%s\" trovato in \".\"\n"
 "Usare \"sudo ./%s\" per eseguire \"%s\"."
 
-#: plugins/sudoers/logging.c:353
-msgid "authentication failure"
-msgstr "autenticazione non riuscita"
-
-#: plugins/sudoers/logging.c:379
-msgid "a password is required"
-msgstr "è necessaria una password"
-
-#: plugins/sudoers/logging.c:449
+#: plugins/sudoers/logging.c:337
 #, c-format
 msgid "%u incorrect password attempt"
 msgid_plural "%u incorrect password attempts"
 msgstr[0] "%u tentativo di immissione password non corretto"
 msgstr[1] "%u tentativi di immissione password non corretti"
 
-#: plugins/sudoers/logging.c:713
-#, c-format
-msgid "unable to dup stdin: %m"
-msgstr "impossibile eseguire dup sullo stdin: %m"
+#: plugins/sudoers/logging.c:393
+msgid "authentication failure"
+msgstr "autenticazione non riuscita"
 
-#: plugins/sudoers/logging.c:750
-#, c-format
-msgid "unable to execute %s: %m"
-msgstr "impossibile eseguire %s: %m"
+#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453
+msgid "a password is required"
+msgstr "è necessaria una password"
 
-#: plugins/sudoers/logging.c:791 plugins/sudoers/logging.c:847
+#: plugins/sudoers/logging.c:729
 #, c-format
-msgid "unable to fork: %m"
-msgstr "impossibile eseguire fork: %m"
+msgid "unable to open log file: %s"
+msgstr "impossibile aprire il file di registro: %s"
 
-#: plugins/sudoers/logging.c:837
+#: plugins/sudoers/logging.c:762
 #, c-format
-msgid "unable to open pipe: %m"
-msgstr "impossibile aprire una pipe: %m"
+msgid "unable to write log file: %s"
+msgstr "impossibile scrivere sul file di registro: %s"
 
-#: plugins/sudoers/match_digest.c:116
+#: plugins/sudoers/match_digest.c:129
 #, c-format
 msgid "digest for %s (%s) is not in %s form"
 msgstr "il digest per %s (%s) non è nella forma %s"
@@ -2311,53 +2326,53 @@ msgstr "attributo LDIF non valido: %s"
 msgid "invalid %.*s set by sudo front-end"
 msgstr "%.*s non valido impostato dal front-end sudo"
 
-#: plugins/sudoers/policy.c:305 plugins/sudoers/testsudoers.c:272
+#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272
 msgid "unable to parse network address list"
 msgstr "impossibile analizzare l'elenco degli indirizzi di rete"
 
-#: plugins/sudoers/policy.c:450
+#: plugins/sudoers/policy.c:455
 msgid "user name not set by sudo front-end"
 msgstr "nome utente non impostato dal front-end sudo"
 
-#: plugins/sudoers/policy.c:454
+#: plugins/sudoers/policy.c:459
 msgid "user-ID not set by sudo front-end"
 msgstr "ID utente non impostato dal front-end sudo"
 
-#: plugins/sudoers/policy.c:458
+#: plugins/sudoers/policy.c:463
 msgid "group-ID not set by sudo front-end"
 msgstr "ID gruppo non impostato dal front-end sudo"
 
-#: plugins/sudoers/policy.c:462
+#: plugins/sudoers/policy.c:467
 msgid "host name not set by sudo front-end"
 msgstr "nome dell'host non impostato dal front-end sudo"
 
-#: plugins/sudoers/policy.c:638
+#: plugins/sudoers/policy.c:643
 #, c-format
 msgid "invalid working directory: %s"
 msgstr "directory di lavoro non valida: %s"
 
-#: plugins/sudoers/policy.c:806
+#: plugins/sudoers/policy.c:811
 #, c-format
 msgid "invalid chroot directory: %s"
 msgstr "directory chroot non valida: %s"
 
-#: plugins/sudoers/policy.c:942 plugins/sudoers/visudo.c:231
+#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231
 #: plugins/sudoers/visudo.c:860
 #, c-format
 msgid "unable to execute %s"
 msgstr "impossibile eseguire %s"
 
-#: plugins/sudoers/policy.c:1106
+#: plugins/sudoers/policy.c:1111
 #, c-format
 msgid "Sudoers policy plugin version %s\n"
 msgstr "Versione %s del plugin della politica sudoers\n"
 
-#: plugins/sudoers/policy.c:1108
+#: plugins/sudoers/policy.c:1113
 #, c-format
 msgid "Sudoers file grammar version %d\n"
 msgstr "Versione %d della grammatica del file sudoers\n"
 
-#: plugins/sudoers/policy.c:1112
+#: plugins/sudoers/policy.c:1117
 #, c-format
 msgid ""
 "\n"
@@ -2366,22 +2381,22 @@ msgstr ""
 "\n"
 "Percorso sudoers: %s\n"
 
-#: plugins/sudoers/policy.c:1115
+#: plugins/sudoers/policy.c:1120
 #, c-format
 msgid "nsswitch path: %s\n"
 msgstr "percorso nsswitch: %s\n"
 
-#: plugins/sudoers/policy.c:1117
+#: plugins/sudoers/policy.c:1122
 #, c-format
 msgid "ldap.conf path: %s\n"
 msgstr "percorso ldap.conf: %s\n"
 
-#: plugins/sudoers/policy.c:1118
+#: plugins/sudoers/policy.c:1123
 #, c-format
 msgid "ldap.secret path: %s\n"
 msgstr "percorso ldap.secret: %s\n"
 
-#: plugins/sudoers/policy.c:1151
+#: plugins/sudoers/policy.c:1156
 #, c-format
 msgid "unable to register hook of type %d (version %d.%d)"
 msgstr "impossibile registrare un hook di tipo %d (versione %d.%d)"
@@ -2509,259 +2524,259 @@ msgstr "percorso audit user_cmnd troncato: %s"
 msgid "truncated audit path argv[0]: %s"
 msgstr "percorso audit argv[0] troncato: %s"
 
-#: plugins/sudoers/sssd.c:574
+#: plugins/sudoers/sssd.c:572
 msgid "unable to initialize SSS source. Is SSSD installed on your machine?"
 msgstr "impossibile inizializzare la sorgente SSS. È stato installato SSSD?"
 
-#: plugins/sudoers/sssd.c:582 plugins/sudoers/sssd.c:591
-#: plugins/sudoers/sssd.c:600 plugins/sudoers/sssd.c:609
-#: plugins/sudoers/sssd.c:618
+#: 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
 #, c-format
 msgid "unable to find symbol \"%s\" in %s"
 msgstr "impossibile trovare il simbolo \"%s\" in %s"
 
-#: plugins/sudoers/sudoers.c:218 plugins/sudoers/sudoers.c:1043
+#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010
 msgid "problem with defaults entries"
 msgstr "problema con le voci Defaults"
 
-#: plugins/sudoers/sudoers.c:222
+#: plugins/sudoers/sudoers.c:218
 msgid "no valid sudoers sources found, quitting"
 msgstr "nessuna sorgente valida di sudoers trovata, uscita"
 
-#: plugins/sudoers/sudoers.c:295
+#: plugins/sudoers/sudoers.c:292
 #, c-format
 msgid "user not allowed to change root directory to %s"
 msgstr "l'utente non è autorizzato a cambiare la directory root a %s"
 
-#: plugins/sudoers/sudoers.c:297
+#: plugins/sudoers/sudoers.c:294
 #, c-format
 msgid "you are not permitted to use the -R option with %s"
 msgstr "non è consentito l'uso dell'opzione -R con %s"
 
-#: plugins/sudoers/sudoers.c:321
+#: plugins/sudoers/sudoers.c:319
 #, c-format
 msgid "user not allowed to change directory to %s"
 msgstr "l'utente non è autorizzato a cambiare directory a %s"
 
-#: plugins/sudoers/sudoers.c:322
+#: plugins/sudoers/sudoers.c:320
 #, c-format
 msgid "you are not permitted to use the -D option with %s"
 msgstr "non è consentito l'uso dell'opzione -D con %s"
 
-#: plugins/sudoers/sudoers.c:353
+#: plugins/sudoers/sudoers.c:351
 msgid "sudoers specifies that root is not allowed to sudo"
 msgstr "sudoers indica che a root non è consentito usare sudo"
 
-#: plugins/sudoers/sudoers.c:413
+#: plugins/sudoers/sudoers.c:411
 msgid "user not allowed to override closefrom limit"
 msgstr "l'utente non è autorizzato a scavalcare il limite closefrom"
 
-#: plugins/sudoers/sudoers.c:414
+#: plugins/sudoers/sudoers.c:412
 msgid "you are not permitted to use the -C option"
 msgstr "utente non abilitato all'uso dell'opzione -C"
 
-#: plugins/sudoers/sudoers.c:475
+#: plugins/sudoers/sudoers.c:472
 #, c-format
 msgid "timestamp owner (%s): No such user"
 msgstr "proprietario marcatura temporale (%s): utente inesistente"
 
-#: plugins/sudoers/sudoers.c:490
+#: plugins/sudoers/sudoers.c:487
 msgid "no tty"
 msgstr "nessun tty"
 
-#: plugins/sudoers/sudoers.c:491
+#: plugins/sudoers/sudoers.c:488
 msgid "sorry, you must have a tty to run sudo"
 msgstr "è necessario disporre di un tty per eseguire sudo"
 
-#: plugins/sudoers/sudoers.c:497 plugins/sudoers/sudoers.c:499
+#: plugins/sudoers/sudoers.c:495
 #, c-format
 msgid "invalid shell for user %s: %s"
 msgstr "shell utente %s non valida: %s"
 
-#: plugins/sudoers/sudoers.c:582
+#: plugins/sudoers/sudoers.c:578
 msgid "command in current directory"
 msgstr "comando nella directory corrente"
 
-#: plugins/sudoers/sudoers.c:600
+#: plugins/sudoers/sudoers.c:597
 msgid "user not allowed to set a command timeout"
 msgstr "l'utente non è autorizzato a impostare un timeout per i comandi"
 
-#: plugins/sudoers/sudoers.c:602
+#: plugins/sudoers/sudoers.c:599
 msgid "sorry, you are not allowed set a command timeout"
 msgstr "non è consentito impostare un timeout per i comandi"
 
-#: plugins/sudoers/sudoers.c:610
+#: plugins/sudoers/sudoers.c:607
 msgid "user not allowed to preserve the environment"
 msgstr "l'utente non è autorizzato a preservare l'ambiente"
 
-#: plugins/sudoers/sudoers.c:612
+#: plugins/sudoers/sudoers.c:609
 msgid "sorry, you are not allowed to preserve the environment"
 msgstr "non è consentito preservare l'ambiente"
 
-#: plugins/sudoers/sudoers.c:978
+#: plugins/sudoers/sudoers.c:945
 msgid "command too long"
 msgstr "comando troppo lungo"
 
-#: plugins/sudoers/sudoers.c:1036
+#: plugins/sudoers/sudoers.c:1003
 msgid "sudoedit doesn't need to be run via sudo"
 msgstr "non è necessario eseguire sudoedit via sudo"
 
-#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/sudoreplay.c:1546
+#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547
 #: plugins/sudoers/tsdump.c:138
 #, c-format
 msgid "unable to read %s"
 msgstr "impossibile leggere %s"
 
-#: plugins/sudoers/sudoers.c:1115 plugins/sudoers/visudo.c:432
+#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432
 #: plugins/sudoers/visudo.c:726
 #, c-format
 msgid "unable to stat %s"
 msgstr "impossibile eseguire stat su %s"
 
-#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/visudo.c:1018
+#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018
 #, c-format
 msgid "%s is not a regular file"
 msgstr "%s non è un file regolare"
 
-#: plugins/sudoers/sudoers.c:1123 plugins/sudoers/timestamp.c:252 toke.l:1121
+#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112
 #, c-format
 msgid "%s is owned by uid %u, should be %u"
 msgstr "%s è di proprietà dello uid %u, dovrebbe essere %u"
 
-#: plugins/sudoers/sudoers.c:1127 toke.l:1126
+#: plugins/sudoers/sudoers.c:1094 toke.l:1117
 #, c-format
 msgid "%s is world writable"
 msgstr "%s è scrivibile da tutti"
 
-#: plugins/sudoers/sudoers.c:1131 toke.l:1129
+#: plugins/sudoers/sudoers.c:1098 toke.l:1120
 #, c-format
 msgid "%s is owned by gid %u, should be %u"
 msgstr "%s è di proprietà del gid %u, dovrebbe essere %u"
 
-#: plugins/sudoers/sudoers.c:1164
+#: plugins/sudoers/sudoers.c:1131
 #, c-format
 msgid "only root can use \"-c %s\""
 msgstr "solo root può usare \"-c %s\""
 
-#: plugins/sudoers/sudoers.c:1183
+#: plugins/sudoers/sudoers.c:1150
 #, c-format
 msgid "unknown login class: %s"
 msgstr "classe di login sconosciuta: %s"
 
-#: plugins/sudoers/sudoers.c:1268 plugins/sudoers/sudoers.c:1283
+#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250
 #, c-format
 msgid "unable to resolve host %s"
 msgstr "impossibile risolvere l'host %s"
 
-#: plugins/sudoers/sudoreplay.c:256
+#: plugins/sudoers/sudoreplay.c:257
 #, c-format
 msgid "invalid filter option: %s"
 msgstr "opzione di filtro non valida: %s"
 
-#: plugins/sudoers/sudoreplay.c:272
+#: plugins/sudoers/sudoreplay.c:273
 #, c-format
 msgid "invalid max wait: %s"
 msgstr "attesa massima non valida: %s"
 
-#: plugins/sudoers/sudoreplay.c:295
+#: plugins/sudoers/sudoreplay.c:296
 #, c-format
 msgid "invalid speed factor: %s"
 msgstr "fattore di velocità non valido: %s"
 
-#: plugins/sudoers/sudoreplay.c:331
+#: plugins/sudoers/sudoreplay.c:332
 #, c-format
 msgid "%s/%.2s/%.2s/%.2s: %s"
 msgstr "%s/%.2s/%.2s/%.2s: %s"
 
-#: plugins/sudoers/sudoreplay.c:336
+#: plugins/sudoers/sudoreplay.c:337
 #, c-format
 msgid "%s/timing: %s"
 msgstr "%s/timing: %s"
 
-#: plugins/sudoers/sudoreplay.c:340
+#: plugins/sudoers/sudoreplay.c:341
 #, c-format
 msgid "%s/%s: %s"
 msgstr "%s/%s: %s"
 
-#: plugins/sudoers/sudoreplay.c:364
+#: plugins/sudoers/sudoreplay.c:365
 #, c-format
 msgid "Replaying sudo session: %s"
 msgstr "Riproduzione della sessione sudo: %s"
 
-#: plugins/sudoers/sudoreplay.c:626
+#: plugins/sudoers/sudoreplay.c:627
 msgid "unable to set tty to raw mode"
 msgstr "impossibile impostare il terminale in modalità raw"
 
-#: plugins/sudoers/sudoreplay.c:677
+#: plugins/sudoers/sudoreplay.c:678
 msgid "Warning: your terminal is too small to properly replay the log.\n"
 msgstr "Attenzione: il terminale è troppo piccolo per riprodurre correttamente il registro.\n"
 
-#: plugins/sudoers/sudoreplay.c:678
+#: plugins/sudoers/sudoreplay.c:679
 #, c-format
 msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d."
 msgstr "La geometria del registro è %dx%d, quella del terminale è %dx%d."
 
-#: plugins/sudoers/sudoreplay.c:706
+#: plugins/sudoers/sudoreplay.c:707
 msgid "Replay finished, press any key to restore the terminal."
 msgstr "Riproduzione terminata. Premere un tasto per ripristinare il terminale."
 
-#: plugins/sudoers/sudoreplay.c:1196 plugins/sudoers/sudoreplay.c:1226
+#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227
 #, c-format
 msgid "ambiguous expression \"%s\""
 msgstr "espressione \"%s\" ambigua"
 
-#: plugins/sudoers/sudoreplay.c:1248
+#: plugins/sudoers/sudoreplay.c:1249
 msgid "unmatched ')' in expression"
 msgstr "carattere \")\" nell'espressione non corrisposto"
 
-#: plugins/sudoers/sudoreplay.c:1252
+#: plugins/sudoers/sudoreplay.c:1253
 #, c-format
 msgid "unknown search term \"%s\""
 msgstr "termine di ricerca \"%s\" sconosciuto"
 
-#: plugins/sudoers/sudoreplay.c:1267
+#: plugins/sudoers/sudoreplay.c:1268
 #, c-format
 msgid "%s requires an argument"
 msgstr "%s richiede un argomento"
 
-#: plugins/sudoers/sudoreplay.c:1270 plugins/sudoers/sudoreplay.c:1522
+#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523
 #, c-format
 msgid "invalid regular expression: %s"
 msgstr "espressione regolare non valida: %s"
 
-#: plugins/sudoers/sudoreplay.c:1275
+#: plugins/sudoers/sudoreplay.c:1276
 #, c-format
 msgid "could not parse date \"%s\""
 msgstr "impossibile analizzare la data \"%s\""
 
-#: plugins/sudoers/sudoreplay.c:1284
+#: plugins/sudoers/sudoreplay.c:1285
 msgid "unmatched '(' in expression"
 msgstr "carattere \"(\" nell'espressione non corrisposto"
 
-#: plugins/sudoers/sudoreplay.c:1286
+#: plugins/sudoers/sudoreplay.c:1287
 msgid "illegal trailing \"or\""
 msgstr "\"or\" finale non consentito"
 
-#: plugins/sudoers/sudoreplay.c:1288
+#: plugins/sudoers/sudoreplay.c:1289
 msgid "illegal trailing \"!\""
 msgstr "carattere \"!\" finale non consentito"
 
-#: plugins/sudoers/sudoreplay.c:1346
+#: plugins/sudoers/sudoreplay.c:1347
 #, c-format
 msgid "unknown search type %d"
 msgstr "tipo di ricerca %d sconosciuto"
 
-#: plugins/sudoers/sudoreplay.c:1613
+#: plugins/sudoers/sudoreplay.c:1614
 #, c-format
 msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n"
 msgstr "uso: %s [-hnRS] [-d DIR] [-m NUM] [-s NUM] ID\n"
 
-#: plugins/sudoers/sudoreplay.c:1616
+#: plugins/sudoers/sudoreplay.c:1617
 #, c-format
 msgid "usage: %s [-h] [-d dir] -l [search expression]\n"
 msgstr "uso: %s [-h] [-d DIR] -l [ESPRESSIONE DI RICERCA]\n"
 
-#: plugins/sudoers/sudoreplay.c:1625
+#: plugins/sudoers/sudoreplay.c:1626
 #, c-format
 msgid ""
 "%s - replay sudo session logs\n"
@@ -2770,7 +2785,7 @@ msgstr ""
 "%s - Riproduce i registri di sessione di sudo\n"
 "\n"
 
-#: plugins/sudoers/sudoreplay.c:1627
+#: plugins/sudoers/sudoreplay.c:1628
 msgid ""
 "\n"
 "Options:\n"
@@ -2991,39 +3006,39 @@ msgstr "impossibile bloccare %s"
 msgid "Edit anyway? [y/N]"
 msgstr "Modificare comunque? [y/N]"
 
-#: plugins/sudoers/visudo.c:1089
+#: plugins/sudoers/visudo.c:1091
 #, c-format
-msgid "Error: %s:%d: cycle in %s \"%s\""
-msgstr "Errore: %s:%d: ciclo in %s \"%s\""
+msgid "Error: %s:%d:%d: cycle in %s \"%s\""
+msgstr "Errore: %s:%d:%d: ciclo in %s \"%s\""
 
-#: plugins/sudoers/visudo.c:1090
+#: plugins/sudoers/visudo.c:1092
 #, c-format
-msgid "Warning: %s:%d: cycle in %s \"%s\""
-msgstr "Attenzione: %s:%d: ciclo in %s \"%s\""
+msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
+msgstr "Attenzione: %s:%d:%d: ciclo in %s \"%s\""
 
-#: plugins/sudoers/visudo.c:1094
+#: plugins/sudoers/visudo.c:1096
 #, c-format
-msgid "Error: %s:%d: %s \"%s\" referenced but not defined"
-msgstr "Errore: %1$s:%2$d riferimento a \"%4$s\" %3$s, ma non definito"
+msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
+msgstr "Errore: %1$s:%2$d:%3$d: riferimento a \"%5$s\" %4$s, ma non definito"
 
-#: plugins/sudoers/visudo.c:1095
+#: plugins/sudoers/visudo.c:1097
 #, c-format
-msgid "Warning: %s:%d: %s \"%s\" referenced but not defined"
-msgstr "Attenzione: %1$s:%2$d: riferimento a \"%4$s\" %3$s, ma non definito"
+msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
+msgstr "Attenzione: %1$s:%2$d:%3$d: riferimento a \"%5$s\" %4$s, ma non definito"
 
-#: plugins/sudoers/visudo.c:1186
+#: plugins/sudoers/visudo.c:1188
 #, c-format
-msgid "Warning: %s:%d: unused %s \"%s\""
-msgstr "Attenzione: %s:%d: inutilizzato %s \"%s\""
+msgid "Warning: %s:%d:%d: unused %s \"%s\""
+msgstr "Attenzione: %s:%d:%d: inutilizzato %s \"%s\""
 
-#: plugins/sudoers/visudo.c:1301
+#: plugins/sudoers/visudo.c:1303
 #, c-format
 msgid ""
 "%s - safely edit the sudoers file\n"
 "\n"
 msgstr "%s - Modifica in sicurezza il file sudoers\n"
 
-#: plugins/sudoers/visudo.c:1303
+#: plugins/sudoers/visudo.c:1305
 msgid ""
 "\n"
 "Options:\n"
@@ -3043,6 +3058,30 @@ msgstr ""
 "  -s, --strict       Verifica precisa della sintassi\n"
 "  -V, --version      Visualizza la versione ed esce\n"
 
-#: toke.l:1093
+#: toke.l:179
+msgid "empty string"
+msgstr "stringa vuota"
+
+#: toke.l:189 toke.l:491
+msgid "empty group"
+msgstr "gruppo vuoto"
+
+#: toke.l:197 toke.l:489
+msgid "empty netgroup"
+msgstr "netgroup vuoto"
+
+#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392
+msgid "invalid line continuation"
+msgstr "continuazione riga non valida"
+
+#: toke.l:528 toke.l:540
+msgid "invalid IPv6 address"
+msgstr "indirizzo IPv6 non valido"
+
+#: toke.l:764
+msgid "unexpected line break in string"
+msgstr "interruzione riga non attesa nella stringa"
+
+#: toke.l:1084
 msgid "too many levels of includes"
 msgstr "troppi livelli di inclusioni"
index ddc608f..3a1b32c 100644 (file)
Binary files a/plugins/sudoers/po/ko.mo and b/plugins/sudoers/po/ko.mo differ
index 156fd8e..04af0c5 100644 (file)
@@ -5,10 +5,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: sudoers 1.9.2rc1\n"
+"Project-Id-Version: sudoers 1.9.4b1\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-06-24 05:35-0600\n"
-"PO-Revision-Date: 2020-07-17 23:15+0900\n"
+"POT-Creation-Date: 2020-11-14 06:24-0700\n"
+"PO-Revision-Date: 2020-12-11 01:02+0900\n"
 "Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
 "Language-Team: Korean <translation-team-ko@googlegroups.com>\n"
 "Language: ko\n"
@@ -19,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Poedit 2.3.1\n"
 
-#: confstr.sh:1
+#: confstr.sh:1 gram.y:1077
 msgid "syntax error"
 msgstr "문법 오류"
 
@@ -43,70 +43,73 @@ msgstr "*** %h 보안 알림 ***"
 msgid "Sorry, try again."
 msgstr "죄송합니다만, 다시 시도하십시오."
 
-#: gram.y:203 gram.y:251 gram.y:258 gram.y:265 gram.y:272 gram.y:279
-#: gram.y:295 gram.y:319 gram.y:326 gram.y:333 gram.y:340 gram.y:347
-#: gram.y:410 gram.y:419 gram.y:430 gram.y:463 gram.y:470 gram.y:477
-#: gram.y:484 gram.y:511 gram.y:583 gram.y:590 gram.y:599 gram.y:608
-#: gram.y:625 gram.y:737 gram.y:744 gram.y:752 gram.y:758 gram.y:858
-#: gram.y:865 gram.y:872 gram.y:879 gram.y:886 gram.y:912 gram.y:919
-#: gram.y:926 gram.y:1068 gram.y:1347 lib/iolog/iolog_fileio.c:1101
-#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:283
-#: lib/iolog/iolog_json.c:313 lib/iolog/iolog_json.c:435
-#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115
-#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133
-#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196
-#: logsrvd/eventlog.c:223 logsrvd/sendlog.c:443 plugins/sudoers/alias.c:125
-#: plugins/sudoers/alias.c:132 plugins/sudoers/alias.c:148
-#: plugins/sudoers/audit.c:108 plugins/sudoers/audit.c:212
-#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118
-#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/cvtsudoers.c:120 plugins/sudoers/cvtsudoers.c:161
-#: plugins/sudoers/cvtsudoers.c:178 plugins/sudoers/cvtsudoers.c:189
-#: plugins/sudoers/cvtsudoers.c:301 plugins/sudoers/cvtsudoers.c:429
-#: plugins/sudoers/cvtsudoers.c:562 plugins/sudoers/cvtsudoers.c:579
-#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/cvtsudoers.c:757
-#: plugins/sudoers/cvtsudoers.c:765 plugins/sudoers/cvtsudoers.c:1179
-#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285
-#: 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:426 plugins/sudoers/cvtsudoers_ldif.c:434
-#: plugins/sudoers/cvtsudoers_ldif.c:451 plugins/sudoers/cvtsudoers_ldif.c:460
-#: plugins/sudoers/cvtsudoers_ldif.c:607 plugins/sudoers/defaults.c:626
-#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84
-#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261
+#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314
+#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386
+#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524
+#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679
+#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971
+#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032
+#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280
+#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062
+#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120
+#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335
+#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480
+#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134
+#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143
+#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144
+#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 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:641
+#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764
+#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182
+#: plugins/sudoers/cvtsudoers.c:1284 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:630 plugins/sudoers/defaults.c:923
+#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181
+#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92
 #: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
 #: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483
-#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:382
-#: plugins/sudoers/iolog_client.c:559 plugins/sudoers/iolog_client.c:678
-#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176
-#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723
-#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183
-#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431
-#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743
-#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279
-#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743
-#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959
-#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076
+#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596
+#: plugins/sudoers/iolog.c:613 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:598 plugins/sudoers/linux_audit.c:83
-#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545
-#: plugins/sudoers/logging.c:586 plugins/sudoers/logging.c:723
-#: plugins/sudoers/logging.c:1083 plugins/sudoers/match_command.c:243
-#: plugins/sudoers/match_command.c:391 plugins/sudoers/match_command.c:438
-#: plugins/sudoers/match_command.c:509 plugins/sudoers/match_digest.c:80
-#: plugins/sudoers/parse.c:193 plugins/sudoers/parse.c:205
-#: plugins/sudoers/parse.c:220 plugins/sudoers/parse.c:232
+#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84
+#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381
+#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:281
+#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499
+#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93
+#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213
+#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244
+#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275
 #: 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
@@ -116,115 +119,138 @@ msgstr "죄송합니다만, 다시 시도하십시오."
 #: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624
 #: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707
 #: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752
-#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:491
-#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262
-#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514
-#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649
-#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967
-#: plugins/sudoers/sssd.c:146 plugins/sudoers/sssd.c:409
-#: plugins/sudoers/sssd.c:472 plugins/sudoers/sssd.c:516
-#: plugins/sudoers/sssd.c:563 plugins/sudoers/sssd.c:755
-#: plugins/sudoers/stubs.c:96 plugins/sudoers/stubs.c:104
-#: plugins/sudoers/sudoers.c:316 plugins/sudoers/sudoers.c:327
-#: plugins/sudoers/sudoers.c:337 plugins/sudoers/sudoers.c:380
-#: plugins/sudoers/sudoers.c:720 plugins/sudoers/sudoers.c:849
-#: plugins/sudoers/sudoers.c:894 plugins/sudoers/sudoers.c:1198
-#: plugins/sudoers/sudoreplay.c:553 plugins/sudoers/sudoreplay.c:556
-#: plugins/sudoers/sudoreplay.c:1260 plugins/sudoers/sudoreplay.c:1470
-#: plugins/sudoers/sudoreplay.c:1474 plugins/sudoers/testsudoers.c:128
+#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
+#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
+#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
+#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
+#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
+#: 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/stubs.c:110 plugins/sudoers/stubs.c:118
+#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326
+#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381
+#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433
+#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927
+#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265
+#: 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:128
 #: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/testsudoers.c:581 plugins/sudoers/timestamp.c:432
+#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432
 #: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986
 #: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104
 #: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:146
-#: plugins/sudoers/visudo.c:322 plugins/sudoers/visudo.c:328
-#: plugins/sudoers/visudo.c:438 plugins/sudoers/visudo.c:616
-#: plugins/sudoers/visudo.c:936 plugins/sudoers/visudo.c:1024
-#: plugins/sudoers/visudo.c:1121 toke.l:864 toke.l:981 toke.l:1039
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
+#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329
+#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615
+#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008
+#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091
 msgid "unable to allocate memory"
 msgstr "메모리를 할당할 수 없습니다"
 
-#: gram.y:505
+#: gram.y:552
 msgid "a digest requires a path name"
 msgstr "다이제스트에 경로 이름이 필요합니다"
 
-#: gram.y:638
+#: gram.y:581
+msgid "values for \"CWD\" must start with a '/', '~', or '*'"
+msgstr "%s: \"CWD\" 값은 '/'; '~'; '*' 문자로 시작해야합니다"
+
+#: gram.y:593
+msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
+msgstr "%s: \"CHROOT\" 값은 '/'; '~'; '*' 문자로 시작해야합니다"
+
+#: gram.y:715
+#, c-format
+msgid "syntax error, reserved word %s used as an alias name"
+msgstr "문법 오류. %s 예약어를 별칭으로 썼습니다"
+
+#: gram.y:735
 msgid "invalid notbefore value"
 msgstr "잘못된 notbefore 값"
 
-#: gram.y:646
+#: gram.y:743
 msgid "invalid notafter value"
 msgstr "잘못된 notafter 값"
 
-#: gram.y:655 plugins/sudoers/policy.c:306
+#: gram.y:752 plugins/sudoers/policy.c:335
 msgid "timeout value too large"
 msgstr "제한 시간 값이 너무 큽니다"
 
-#: gram.y:657 plugins/sudoers/policy.c:308
+#: gram.y:754 plugins/sudoers/policy.c:337
 msgid "invalid timeout value"
 msgstr "잘못된 제한 시간 값"
 
-#: gram.y:1347 lib/iolog/iolog_fileio.c:1101 lib/iolog/iolog_json.c:120
-#: lib/iolog/iolog_json.c:282 lib/iolog/iolog_json.c:313
-#: lib/iolog/iolog_json.c:435 lib/iolog/iolog_json.c:713
-#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115
-#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133
-#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196
-#: logsrvd/eventlog.c:223 logsrvd/logsrvd.c:1208 logsrvd/logsrvd.c:1221
-#: logsrvd/logsrvd.c:1266 logsrvd/sendlog.c:443 logsrvd/sendlog.c:1302
-#: logsrvd/sendlog.c:1309 logsrvd/sendlog.c:1727 plugins/sudoers/audit.c:108
-#: plugins/sudoers/audit.c:212 plugins/sudoers/auth/pam.c:482
+#: gram.y:1079
+#, c-format
+msgid "%s:%d:%d: %s\n"
+msgstr "%s:%d:%d: %s\n"
+
+#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816
+#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998
+#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304
+#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457
+#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321
+#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482
 #: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
-#: plugins/sudoers/cvtsudoers.c:120 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:642 plugins/sudoers/cvtsudoers.c:757
-#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1179
-#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285
+#: 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:641 plugins/sudoers/cvtsudoers.c:756
+#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178
+#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284
 #: 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:425 plugins/sudoers/cvtsudoers_ldif.c:433
-#: plugins/sudoers/cvtsudoers_ldif.c:450 plugins/sudoers/cvtsudoers_ldif.c:459
-#: plugins/sudoers/cvtsudoers_ldif.c:606 plugins/sudoers/defaults.c:626
-#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84
-#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261
-#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:132
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483
-#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:215
-#: plugins/sudoers/iolog_client.c:236 plugins/sudoers/iolog_client.c:249
-#: plugins/sudoers/iolog_client.c:382 plugins/sudoers/iolog_client.c:678
-#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176
-#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723
-#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183
-#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431
-#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743
-#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279
-#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743
-#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959
-#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076
-#: 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:598 plugins/sudoers/linux_audit.c:83
-#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545
-#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1083
-#: plugins/sudoers/match_command.c:242 plugins/sudoers/match_command.c:390
-#: plugins/sudoers/match_command.c:437 plugins/sudoers/match_command.c:509
-#: plugins/sudoers/match_digest.c:80 plugins/sudoers/parse.c:192
-#: plugins/sudoers/parse.c:204 plugins/sudoers/parse.c:219
-#: plugins/sudoers/parse.c:231 plugins/sudoers/parse_ldif.c:152
+#: 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:630
+#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098
+#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261
+#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
+#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56
+#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72
+#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613
+#: 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:603
+#: plugins/sudoers/linux_audit.c:84 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:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:280 plugins/sudoers/match_command.c:448
+#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198
+#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:274 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
@@ -234,60 +260,112 @@ msgstr "잘못된 제한 시간 값"
 #: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648
 #: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723
 #: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758
-#: plugins/sudoers/policy.c:120 plugins/sudoers/policy.c:129
-#: plugins/sudoers/policy.c:138 plugins/sudoers/policy.c:164
-#: plugins/sudoers/policy.c:291 plugins/sudoers/policy.c:306
-#: plugins/sudoers/policy.c:308 plugins/sudoers/policy.c:337
-#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:389
-#: plugins/sudoers/policy.c:399 plugins/sudoers/policy.c:408
-#: plugins/sudoers/policy.c:417 plugins/sudoers/policy.c:491
-#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262
-#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514
-#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649
-#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967
+#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148
+#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183
+#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335
+#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366
+#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418
+#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437
+#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
+#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
+#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
+#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
+#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
 #: 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:145
-#: plugins/sudoers/sssd.c:409 plugins/sudoers/sssd.c:472
-#: plugins/sudoers/sssd.c:516 plugins/sudoers/sssd.c:563
-#: plugins/sudoers/sssd.c:755 plugins/sudoers/stubs.c:96
-#: plugins/sudoers/stubs.c:104 plugins/sudoers/sudoers.c:316
-#: plugins/sudoers/sudoers.c:327 plugins/sudoers/sudoers.c:337
-#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:720
-#: plugins/sudoers/sudoers.c:849 plugins/sudoers/sudoers.c:894
-#: plugins/sudoers/sudoers.c:1198 plugins/sudoers/sudoreplay.c:553
-#: plugins/sudoers/sudoreplay.c:556 plugins/sudoers/sudoreplay.c:1260
-#: plugins/sudoers/sudoreplay.c:1470 plugins/sudoers/sudoreplay.c:1474
+#: 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/stubs.c:110
+#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300
+#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370
+#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391
+#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794
+#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961
+#: plugins/sudoers/sudoers.c:1265 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:128 plugins/sudoers/testsudoers.c:228
-#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:581
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587
 #: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476
 #: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51
 #: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128
 #: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:146 plugins/sudoers/visudo.c:322
-#: plugins/sudoers/visudo.c:328 plugins/sudoers/visudo.c:438
-#: plugins/sudoers/visudo.c:616 plugins/sudoers/visudo.c:936
-#: plugins/sudoers/visudo.c:1024 plugins/sudoers/visudo.c:1121 toke.l:864
-#: toke.l:981 toke.l:1039
+#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323
+#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439
+#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935
+#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913
+#: toke.l:1033 toke.l:1091
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: lib/iolog/iolog_fileio.c:157
+#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463
+#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468
+#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244
+#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571
+#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
+#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618
+#: 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:90
+#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711
+#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161
+#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249
+#: plugins/sudoers/toke_util.c:169
+#, c-format
+msgid "internal error, %s overflow"
+msgstr "내부 오류. %s 오버플로우"
+
+#: lib/eventlog/eventlog.c:343
+#, c-format
+msgid "unable to dup stdin: %m"
+msgstr "표준 입력을 복제할 수 없습니다: %m"
+
+#: lib/eventlog/eventlog.c:388
+#, c-format
+msgid "unable to execute %s: %m"
+msgstr "%s을(를) 실행할 수 없습니다: %m"
+
+#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198
+msgid "unable to fork"
+msgstr "포킹할 수 없습니다"
+
+#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490
+#, c-format
+msgid "unable to fork: %m"
+msgstr "포킹할 수 없습니다: %m"
+
+#: lib/eventlog/eventlog.c:480
+#, c-format
+msgid "unable to open pipe: %m"
+msgstr "파이프를 열 수 없습니다: %m"
+
+#: lib/eventlog/eventlog.c:894
+#, c-format
+msgid "%8s : %s"
+msgstr "%8s : %s"
+
+#: lib/eventlog/eventlog.c:923
+#, c-format
+msgid "%8s : (command continued) %s"
+msgstr "%8s : (명령 계속 실행) %s"
+
+#: lib/iolog/iolog_fileio.c:155
 #, c-format
 msgid "%s exists but is not a directory (0%o)"
 msgstr "%s이(가) 있지만 디렉터리가 아닙니다(0%o)"
 
-#: lib/iolog/iolog_fileio.c:187 lib/iolog/iolog_fileio.c:233
+#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231
 #: plugins/sudoers/timestamp.c:205
 #, c-format
 msgid "unable to mkdir %s"
 msgstr "mkdir %s 명령을 실행할 수 없습니다"
 
-#: lib/iolog/iolog_fileio.c:237 plugins/sudoers/visudo.c:733
-#: plugins/sudoers/visudo.c:744
+#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732
+#: plugins/sudoers/visudo.c:743
 #, c-format
 msgid "unable to change mode of %s to 0%o"
 msgstr "%s 모드를 0%o 값으로 바꿀 수 없습니다"
@@ -297,63 +375,45 @@ msgstr "%s 모드를 0%o 값으로 바꿀 수 없습니다"
 msgid "expected JSON_STRING, got %d"
 msgstr "JSON_STRING 값을 기대했지만, %d 결과가 나왔습니다"
 
-#: lib/iolog/iolog_json.c:305
+#: lib/iolog/iolog_json.c:327
 msgid "missing double quote in name"
 msgstr "이름에 이중 따옴표가 빠졌습니다"
 
-#: lib/iolog/iolog_json.c:392
+#: lib/iolog/iolog_json.c:414
 #, c-format
 msgid "expected JSON_OBJECT, got %d"
 msgstr "JSON_OBJECT 값을 기대했지만, %d 결과가 나왔습니다"
 
-#: lib/iolog/iolog_json.c:441 lib/iolog/iolog_json.c:444
-#: lib/iolog/iolog_json.c:446 lib/iolog/iolog_json.c:538
-#: logsrvd/eventlog.c:228 plugins/sudoers/cvtsudoers_ldif.c:244
-#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:563
-#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
-#: plugins/sudoers/env.c:435 plugins/sudoers/iolog.c:561
-#: plugins/sudoers/iolog.c:577 plugins/sudoers/ldap.c:516
-#: plugins/sudoers/ldap.c:747 plugins/sudoers/ldap.c:1080
-#: plugins/sudoers/ldap_conf.c:222 plugins/sudoers/ldap_conf.c:312
-#: plugins/sudoers/linux_audit.c:89 plugins/sudoers/logging.c:1088
-#: plugins/sudoers/policy.c:521 plugins/sudoers/policy.c:668
-#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:161
-#: plugins/sudoers/sudoers.c:916 plugins/sudoers/testsudoers.c:249
-#: plugins/sudoers/toke_util.c:169
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "내부 오류. %s 오버플로우"
-
-#: lib/iolog/iolog_json.c:607 lib/iolog/iolog_json.c:731
+#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753
 msgid "unmatched close brace"
 msgstr "일치하지 않는 중괄호 닫기 표시"
 
-#: lib/iolog/iolog_json.c:616
+#: lib/iolog/iolog_json.c:638
 msgid "unexpected array"
 msgstr "예기치 않은 배열 발견"
 
-#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:733
+#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755
 msgid "unmatched close bracket"
 msgstr "일치하지 않는 각괄호 닫기 표시"
 
-#: lib/iolog/iolog_json.c:637
+#: lib/iolog/iolog_json.c:659
 msgid "unexpected string"
 msgstr "예기치 않은 문자열 값 발견"
 
-#: lib/iolog/iolog_json.c:647
+#: lib/iolog/iolog_json.c:669
 msgid "missing colon after name"
 msgstr "이름 뒤에 콜론이 빠졌습니다"
 
-#: lib/iolog/iolog_json.c:658 lib/iolog/iolog_json.c:673
-#: lib/iolog/iolog_json.c:688
+#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695
+#: lib/iolog/iolog_json.c:710
 msgid "unexpected boolean"
 msgstr "예기치 않은 부울린 값 발견"
 
-#: lib/iolog/iolog_json.c:704
+#: lib/iolog/iolog_json.c:726
 msgid "unexpected number"
 msgstr "예기치 않은 숫자 값 발견"
 
-#: lib/iolog/iolog_json.c:741
+#: lib/iolog/iolog_json.c:763
 #, c-format
 msgid "%s:%u unable to parse \"%s\""
 msgstr "%s:%u \"%s\"을(를) 해석할 수 없습니다"
@@ -398,186 +458,184 @@ msgstr "타이밍 파일 읽기 오류: %s"
 msgid "invalid timing file line: %s"
 msgstr "잘못된 타이밍 파일 행: %s"
 
-#: logsrvd/eventlog.c:430 plugins/sudoers/logging.c:112
-#, c-format
-msgid "%8s : %s"
-msgstr "%8s : %s"
-
-#: logsrvd/eventlog.c:459 plugins/sudoers/logging.c:136
-#, c-format
-msgid "%8s : (command continued) %s"
-msgstr "%8s : (명령 계속 실행) %s"
-
-#: logsrvd/iolog_writer.c:936
+#: logsrvd/iolog_writer.c:919
 msgid "log is already complete, cannot be restarted"
 msgstr "로그를 이미 끝냈으며, 다시 시작할 수 없습니다"
 
-#: logsrvd/iolog_writer.c:967
+#: logsrvd/iolog_writer.c:950
 msgid "unable to restart log"
 msgstr "로그를 다시 시작할 수 없습니다"
 
-#: logsrvd/logsrv_util.c:98 logsrvd/logsrv_util.c:105
-#: plugins/sudoers/sudoreplay.c:353 plugins/sudoers/sudoreplay.c:359
+#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106
+#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358
 #, c-format
 msgid "unable to open %s/%s"
 msgstr "%s/%s을(를) 열 수 없습니다"
 
-#: logsrvd/logsrv_util.c:132
+#: logsrvd/logsrv_util.c:133
 #, c-format
 msgid "missing I/O log file %s/%s"
 msgstr "입출력 로그 파일 %s/%s 빠짐"
 
-#: logsrvd/logsrv_util.c:139
+#: logsrvd/logsrv_util.c:140
 #, c-format
 msgid "%s/%s: unable to seek forward %zu"
 msgstr "%s/%s: %zu회 이전 탐색을 진행할 수 없습니다"
 
-#: logsrvd/logsrv_util.c:149
+#: logsrvd/logsrv_util.c:150
 #, c-format
 msgid "unable to find resume point [%lld, %ld] in %s/%s"
 msgstr "%3$s/%4$s에서 재개 지점[%1$lld, %2$ld]을 찾을 수 없습니다"
 
-#: logsrvd/logsrvd.c:230 logsrvd/logsrvd.c:299 logsrvd/logsrvd.c:343
-#: logsrvd/logsrvd.c:398 logsrvd/logsrvd.c:445 logsrvd/logsrvd.c:496
-#: logsrvd/logsrvd.c:528 logsrvd/logsrvd.c:560
+#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394
+#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568
+#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632
 msgid "state machine error"
 msgstr "상태 머신 오류"
 
-#: logsrvd/logsrvd.c:239
+#: logsrvd/logsrvd.c:299
 msgid "invalid AcceptMessage"
 msgstr "잘못된 AcceptMessage"
 
-#: logsrvd/logsrvd.c:250
+#: logsrvd/logsrvd.c:307
 msgid "error parsing AcceptMessage"
 msgstr "AcceptMessage 해석 오류"
 
-#: logsrvd/logsrvd.c:257
+#: logsrvd/logsrvd.c:314
 msgid "error creating I/O log"
 msgstr "입출력 로그 만드는 중 오류"
 
-#: logsrvd/logsrvd.c:265
+#: logsrvd/logsrvd.c:321
 msgid "error logging accept event"
 msgstr "수락 이벤트 로깅 중 오류"
 
-#: logsrvd/logsrvd.c:308
+#: logsrvd/logsrvd.c:362
 msgid "invalid RejectMessage"
 msgstr "잘못된 RejectMessage"
 
-#: logsrvd/logsrvd.c:319
+#: logsrvd/logsrvd.c:370
 msgid "error parsing RejectMessage"
 msgstr "RejectMessage 해석 오류"
 
-#: logsrvd/logsrvd.c:325
+#: logsrvd/logsrvd.c:376
 msgid "error logging reject event"
 msgstr "거절 이벤트 로깅 중 오류"
 
-#: logsrvd/logsrvd.c:430
+#: logsrvd/logsrvd.c:486
+msgid "invalid AlertMessage"
+msgstr "잘못된 AlertMessage"
+
+#: logsrvd/logsrvd.c:494
+msgid "error parsing AlertMessage"
+msgstr "AlertMessage 해석 오류"
+
+#: logsrvd/logsrvd.c:502
 msgid "error logging alert event"
 msgstr "경고 이벤트 로깅 중 오류"
 
-#: logsrvd/logsrvd.c:451 logsrvd/logsrvd.c:502 logsrvd/logsrvd.c:534
+#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606
 msgid "protocol error"
 msgstr "프로토콜 오류"
 
-#: logsrvd/logsrvd.c:461
+#: logsrvd/logsrvd.c:533
 msgid "error writing IoBuffer"
 msgstr "입출력 버퍼 기록 중 오류"
 
-#: logsrvd/logsrvd.c:513
+#: logsrvd/logsrvd.c:585
 msgid "error writing ChangeWindowSize"
 msgstr "ChangeWindowSize 기록 중 오류"
 
-#: logsrvd/logsrvd.c:545
+#: logsrvd/logsrvd.c:617
 msgid "error writing CommandSuspend"
 msgstr "CommandSuspend 기록 중 오류"
 
-#: logsrvd/logsrvd.c:630
+#: logsrvd/logsrvd.c:702
 msgid "unrecognized ClientMessage type"
 msgstr "인식할 수 없는 ClientMessage 형식"
 
-#: logsrvd/logsrvd.c:895
+#: logsrvd/logsrvd.c:967
 msgid "client message too large"
 msgstr "클라이언트 메시지가 너무 깁니다"
 
-#: logsrvd/logsrvd.c:1125 logsrvd/logsrvd.c:1133
+#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205
 #, c-format
 msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
 msgstr "%s에 TLS 1.2 암호 모음을 설정할 수 없습니다: %s"
 
-#: logsrvd/logsrvd.c:1153 logsrvd/logsrvd.c:1161
+#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233
 #, c-format
 msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
 msgstr "%s에 TLS 1.3 암호 모음을 설정할 수 없습니다: %s"
 
-#: logsrvd/logsrvd.c:1197
+#: logsrvd/logsrvd.c:1269
 #, c-format
 msgid "unable to get TLS server method: %s"
 msgstr "TLS 서버 처리 정보를 가져올 수 없습니다: %s"
 
-#: logsrvd/logsrvd.c:1202
+#: logsrvd/logsrvd.c:1274
 #, c-format
 msgid "unable to create TLS context: %s"
 msgstr "TLS 컨텍스트를 만들 수 없습니다: %s"
 
-#: logsrvd/logsrvd.c:1209 plugins/sudoers/iolog_client.c:237
+#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236
 #, c-format
 msgid "unable to load certificate %s"
 msgstr "%s 인증서를 불러올 수 없습니다"
 
-#: logsrvd/logsrvd.c:1222 plugins/sudoers/iolog_client.c:217
+#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216
 #, c-format
 msgid "unable to load certificate authority bundle %s"
 msgstr "%s 인증서 인증 번들을 불러올 수 없습니다"
 
-#: logsrvd/logsrvd.c:1267 plugins/sudoers/iolog_client.c:250
+#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249
 #, c-format
 msgid "unable to load private key %s"
 msgstr "%s 개인 키를 불러올 수 없습니다"
 
-#: logsrvd/logsrvd.c:1284 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365
 #, c-format
 msgid "unable to set diffie-hellman parameters: %s"
 msgstr "디피-헬먼 매개변수를 설정할 수 없습니다: %s"
 
-#: logsrvd/logsrvd.c:1306
+#: logsrvd/logsrvd.c:1378
 #, c-format
 msgid "unable to set minimum protocol version to TLS 1.2: %s"
 msgstr "TLS 프로토콜 최소 버전을 1.2로 설정할 수 없습니다: %s"
 
-#: logsrvd/logsrvd.c:1491
+#: logsrvd/logsrvd.c:1563
 msgid "unable to get remote IP addr"
 msgstr "원격 IP 주소를 가져올 수 없습니다"
 
-#: logsrvd/logsrvd.c:1519 plugins/sudoers/iolog_client.c:264
+#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263
 #, c-format
 msgid "Unable to attach user data to the ssl object: %s"
 msgstr "ssl 객체에 사용자 데이터를 붙일 수 없습니다: %s"
 
-#: logsrvd/logsrvd.c:1527 logsrvd/logsrvd.c:1649 logsrvd/logsrvd.c:1749
-#: logsrvd/sendlog.c:1106 logsrvd/sendlog.c:1462 logsrvd/sendlog.c:1477
-#: logsrvd/sendlog.c:1535 plugins/sudoers/iolog.c:921
-#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1152
-#: plugins/sudoers/iolog_client.c:109 plugins/sudoers/iolog_client.c:325
-#: plugins/sudoers/iolog_client.c:341 plugins/sudoers/iolog_client.c:387
-#: plugins/sudoers/iolog_client.c:567 plugins/sudoers/iolog_client.c:574
-#: plugins/sudoers/iolog_client.c:1150 plugins/sudoers/iolog_client.c:1186
-#: plugins/sudoers/iolog_client.c:1194 plugins/sudoers/iolog_client.c:1254
-#: plugins/sudoers/iolog_client.c:1361 plugins/sudoers/iolog_client.c:1477
-#: plugins/sudoers/iolog_client.c:1759 plugins/sudoers/iolog_client.c:1767
-#: plugins/sudoers/sudoreplay.c:513 plugins/sudoers/sudoreplay.c:560
-#: plugins/sudoers/sudoreplay.c:792 plugins/sudoers/sudoreplay.c:904
-#: plugins/sudoers/sudoreplay.c:994 plugins/sudoers/sudoreplay.c:1009
-#: plugins/sudoers/sudoreplay.c:1016 plugins/sudoers/sudoreplay.c:1023
-#: plugins/sudoers/sudoreplay.c:1030 plugins/sudoers/sudoreplay.c:1037
-#: plugins/sudoers/sudoreplay.c:1164
+#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823
+#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496
+#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956
+#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187
+#: 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:587 plugins/sudoers/log_client.c:594
+#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376
+#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425
+#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692
+#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015
+#: 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 "큐에 이벤트를 추가할 수 없습니다"
 
-#: logsrvd/logsrvd.c:1703 logsrvd/logsrvd.c:1937
+#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011
 msgid "unable setup listen socket"
 msgstr "감청 소켓을 설정할 수 없습니다"
 
-#: logsrvd/logsrvd.c:1843 logsrvd/sendlog.c:123
+#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124
 #, c-format
 msgid ""
 "%s - send sudo I/O log to remote server\n"
@@ -586,7 +644,7 @@ msgstr ""
 "%s - 원격 서버에 sudo 입출력 로그를 보냅니다\n"
 "\n"
 
-#: logsrvd/logsrvd.c:1846
+#: logsrvd/logsrvd.c:1920
 msgid ""
 "\n"
 "Options:\n"
@@ -604,78 +662,78 @@ msgstr ""
 "  -R, --random-drop        연결을 쳐낼 백분율\n"
 "  -V, --version            버전 정보를 나타낸 후 나갑니다\n"
 
-#: logsrvd/logsrvd.c:1898 logsrvd/sendlog.c:1700
+#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719
 msgid "Protobuf-C version 1.3 or higher required"
 msgstr "Protobuf-C 1.3 이상의 버전이 필요합니다"
 
-#: logsrvd/logsrvd.c:1916
+#: logsrvd/logsrvd.c:1990
 #, c-format
 msgid "invalid random drop value: %s"
 msgstr "잘못된 임의 드롭 값: %s"
 
-#: logsrvd/logsrvd.c:1920 logsrvd/sendlog.c:1750
-#: plugins/sudoers/cvtsudoers.c:229 plugins/sudoers/sudoreplay.c:300
-#: plugins/sudoers/visudo.c:178
+#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769
+#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299
+#: plugins/sudoers/visudo.c:177
 #, c-format
 msgid "%s version %s\n"
 msgstr "%s 버전 %s\n"
 
-#: logsrvd/logsrvd_conf.c:393
+#: logsrvd/logsrvd_conf.c:331
 msgid "TLS not supported"
 msgstr "TLS를 지원하지 않습니다"
 
-#: logsrvd/logsrvd_conf.c:405
+#: logsrvd/logsrvd_conf.c:343
 #, c-format
 msgid "%s:%s"
 msgstr "%s:%s"
 
-#: logsrvd/logsrvd_conf.c:471 logsrvd/logsrvd_conf.c:715
+#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653
 #, c-format
 msgid "%s: not a fully qualified path"
 msgstr "%s: 완전하지 않은 경로"
 
-#: logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:767
 #, c-format
 msgid "%s:%d unmatched '[': %s"
 msgstr "%s:%d 일치하지 않는 '[': %s"
 
-#: logsrvd/logsrvd_conf.c:840
+#: logsrvd/logsrvd_conf.c:778
 #, c-format
 msgid "%s:%d invalid config section: %s"
 msgstr "%s:%d 잘못된 설정 섹션: %s"
 
-#: logsrvd/logsrvd_conf.c:848
+#: logsrvd/logsrvd_conf.c:786
 #, c-format
 msgid "%s:%d invalid configuration line: %s"
 msgstr "%s:%d 잘못된 설정 행: %s"
 
-#: logsrvd/logsrvd_conf.c:854
+#: logsrvd/logsrvd_conf.c:792
 #, c-format
 msgid "%s:%d expected section name: %s"
 msgstr "%s:%d(에)서 섹션 이름이 나와야 합니다: %s"
 
-#: logsrvd/logsrvd_conf.c:868
+#: logsrvd/logsrvd_conf.c:806
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "잘못된 %s 값: %s"
 
-#: logsrvd/logsrvd_conf.c:876
+#: logsrvd/logsrvd_conf.c:814
 #, c-format
 msgid "%s:%d unknown key: %s"
 msgstr "%s:%d 알 수 없는 키: %s"
 
-#: logsrvd/logsrvd_conf.c:1032
+#: logsrvd/logsrvd_conf.c:1003
 #, c-format
 msgid "unknown syslog facility %s"
 msgstr "알 수 없는 syslog 수단 %s"
 
-#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1040
-#: logsrvd/logsrvd_conf.c:1044
+#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011
+#: logsrvd/logsrvd_conf.c:1015
 #, c-format
 msgid "unknown syslog priority %s"
 msgstr "알 수 없는 syslog 우선 순위 %s"
 
-#: logsrvd/sendlog.c:126
+#: logsrvd/sendlog.c:127
 msgid ""
 "\n"
 "Options:\n"
@@ -709,145 +767,148 @@ msgstr ""
 "  -t, --test               선택한 입출력 로그를 병렬로 n회 전송하여 감사 서버 테스트\n"
 "  -V, --version            버전 정보를 나타 후 나갑니다\n"
 
-#: logsrvd/sendlog.c:163 plugins/sudoers/iolog_client.c:433
+#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432
 #, c-format
 msgid "unable to look up %s:%s: %s"
 msgstr "%s:%s을(를) 찾을 수 없습니다: %s"
 
-#: logsrvd/sendlog.c:186
+#: logsrvd/sendlog.c:202
 msgid "unable to get server IP addr"
 msgstr "서버 IP 주소를 가져올 수 없습니다"
 
-#: logsrvd/sendlog.c:240 plugins/sudoers/sudoreplay.c:852
+#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851
 #, c-format
 msgid "unable to read %s/%s: %s"
 msgstr "%s/%s을(를) 읽을 수 없습니다: %s"
 
-#: logsrvd/sendlog.c:261 plugins/sudoers/iolog_client.c:684
+#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694
 #, c-format
 msgid "client message too large: %zu"
 msgstr "클라이언드 메시지가 너무 깁니다: %zu"
 
-#: logsrvd/sendlog.c:791
+#: logsrvd/sendlog.c:810
 #, c-format
 msgid "%s: write buffer already in use"
 msgstr "%s: 쓰기 버퍼를 이미 사용중입니다"
 
-#: logsrvd/sendlog.c:843 plugins/sudoers/iolog.c:845
-#: plugins/sudoers/iolog.c:914
+#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880
+#: plugins/sudoers/iolog.c:949
 #, c-format
 msgid "unexpected I/O event %d"
 msgstr "예기치 않은 입출력 이벤트 %d"
 
-#: logsrvd/sendlog.c:889 logsrvd/sendlog.c:906 logsrvd/sendlog.c:940
-#: plugins/sudoers/iolog_client.c:1155 plugins/sudoers/iolog_client.c:1225
-#: plugins/sudoers/iolog_client.c:1273
+#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386
+#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490
 #, c-format
 msgid "%s: unexpected state %d"
 msgstr "%s: 예기치 않은 상태 번호 %d"
 
-#: logsrvd/sendlog.c:912 plugins/sudoers/iolog_client.c:1231
+#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460
 msgid "invalid ServerHello"
 msgstr "잘못된 ServerHello"
 
-#: logsrvd/sendlog.c:976 plugins/sudoers/iolog_client.c:1317
+#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534
 #, c-format
 msgid "error message received from server: %s"
 msgstr "서버로부터 오류 메시지를 받았습니다: %s"
 
-#: logsrvd/sendlog.c:989 plugins/sudoers/iolog_client.c:1330
+#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547
 #, c-format
 msgid "abort message received from server: %s"
 msgstr "서버로부터 중단 메시지를 받았습니다: %s"
 
-#: logsrvd/sendlog.c:1008 plugins/sudoers/iolog_client.c:1349
+#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566
 msgid "unable to unpack ServerMessage"
 msgstr "ServerMessage를 언팩할 수 없습니다"
 
-#: logsrvd/sendlog.c:1048 plugins/sudoers/iolog_client.c:1382
+#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597
 #, c-format
 msgid "%s: unexpected type_case value %d"
 msgstr "%s: 예기지 않은 type_case 값 %d"
 
-#: logsrvd/sendlog.c:1077
+#: logsrvd/sendlog.c:1096
 msgid "timeout reading from server"
 msgstr "서버 데이터 읽기 시간 초과"
 
-#: logsrvd/sendlog.c:1155
+#: logsrvd/sendlog.c:1174
 msgid "premature EOF"
 msgstr "갑작스러운 EOF"
 
-#: logsrvd/sendlog.c:1168 plugins/sudoers/iolog_client.c:1536
+#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751
 #, c-format
 msgid "server message too large: %u"
 msgstr "서버 메시지가 너무 깁니다: %u"
 
-#: logsrvd/sendlog.c:1219
+#: logsrvd/sendlog.c:1238
 msgid "timeout writing to server"
 msgstr "서버 기록 시간 초과"
 
-#: logsrvd/sendlog.c:1438 plugins/sudoers/iolog_client.c:297
+#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296
 msgid "TLS handshake timeout occurred"
 msgstr "TLS 핸드셰이크 시간을 초과했습니다"
 
-#: logsrvd/sendlog.c:1457 logsrvd/sendlog.c:1472
-#: plugins/sudoers/iolog_client.c:319 plugins/sudoers/iolog_client.c:335
+#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491
+#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334
 msgid "unable to set event"
 msgstr "이벤트를 설정할 수 없습니다"
 
-#: logsrvd/sendlog.c:1482 logsrvd/sendlog.c:1486
+#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505
 #, c-format
 msgid "TLS connection failed: %s"
 msgstr "TLS 연결 실패: %s"
 
-#: logsrvd/sendlog.c:1519
+#: logsrvd/sendlog.c:1538
 #, c-format
 msgid "Unable to initialize ssl context: %s"
 msgstr "SSL 컨텍스트를 초기화할 수 없습니다: %s"
 
-#: logsrvd/sendlog.c:1524 plugins/sudoers/iolog_client.c:259
+#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258
 #, c-format
 msgid "Unable to allocate ssl object: %s"
 msgstr "SSL 객체를 할당할 수 없습니다: %s"
 
-#: logsrvd/sendlog.c:1529
+#: logsrvd/sendlog.c:1548
 #, c-format
 msgid "Unable to attach socket to the ssl object: %s"
 msgstr "SSL 객체에 소켓을 붙일 수 없습니다: %s"
 
-#: logsrvd/sendlog.c:1773
+#: logsrvd/sendlog.c:1792
 msgid "both restart point and iolog ID must be specified"
 msgstr "다시 시작 지점과 입출력 로그 ID를 반드시 지정해야합니다"
 
-#: logsrvd/sendlog.c:1777
+#: logsrvd/sendlog.c:1796
 msgid "a restart point may not be set when no I/O is sent"
 msgstr "입출력을 보내지 않을 때 다시 시작 지점을 지정하지 않습니다"
 
-#: logsrvd/sendlog.c:1852
+#: logsrvd/sendlog.c:1871
 #, c-format
 msgid "exited prematurely with state %d"
 msgstr "%d 상태로 갑자기 빠져나왔습니다"
 
-#: logsrvd/sendlog.c:1853
+#: logsrvd/sendlog.c:1872
 #, c-format
 msgid "elapsed time sent to server [%lld, %ld]"
 msgstr "경과 시간을 서버로 보냈습니다 [%lld, %ld]"
 
-#: logsrvd/sendlog.c:1855
+#: logsrvd/sendlog.c:1874
 #, c-format
 msgid "commit point received from server [%lld, %ld]"
 msgstr "제출 지점 정보를 서버로부터 받았습니다 [%lld, %ld]"
 
-#: plugins/sudoers/alias.c:144
+#: plugins/sudoers/alias.c:148
 #, c-format
 msgid "Alias \"%s\" already defined"
 msgstr "\"%s\" 별칭을 이미 정의했습니다"
 
-#: plugins/sudoers/auth/aix_auth.c:198 plugins/sudoers/logging.c:784
-msgid "unable to fork"
-msgstr "포킹할 수 없습니다"
+#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343
+#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002
+#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114
+msgid "unable to get time of day"
+msgstr "일시 정보를 가져올 수 없습니다"
 
-#: plugins/sudoers/auth/aix_auth.c:278
+#: plugins/sudoers/auth/aix_auth.c:277
 #, c-format
 msgid "unable to change password for %s"
 msgstr "%s의 암호를 바꿀 수 없습니다"
@@ -869,11 +930,11 @@ msgstr "잘못된 인증 형식입니다"
 msgid "unable to initialize BSD authentication"
 msgstr "BSD 인증을 초기화할 수 없습니다"
 
-#: plugins/sudoers/auth/bsdauth.c:180
+#: plugins/sudoers/auth/bsdauth.c:179
 msgid "your account has expired"
 msgstr "계정 유효 기간이 지났습니다"
 
-#: plugins/sudoers/auth/bsdauth.c:182
+#: plugins/sudoers/auth/bsdauth.c:181
 msgid "approval failed"
 msgstr "승인 실패"
 
@@ -980,7 +1041,7 @@ msgstr "계정 기한이 지났거나 PAM 설정에 sudo에서 확인할 \"accou
 msgid "PAM account management error: %s"
 msgstr "PAM 계정 관리 오류: %s"
 
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:242
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243
 #, c-format
 msgid "you do not exist in the %s database"
 msgstr "%s 데이터베이스에 없습니다"
@@ -1009,7 +1070,7 @@ msgstr "SecurID용 인증 핸들이 잘못되었습니다"
 msgid "SecurID communication failed"
 msgstr "SecurID 통신에 실패했습니다"
 
-#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:212
+#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210
 msgid "unknown SecurID error"
 msgstr "알 수 없는 SecurID 오류"
 
@@ -1017,7 +1078,7 @@ msgstr "알 수 없는 SecurID 오류"
 msgid "invalid passcode length for SecurID"
 msgstr "SecurID용 암호 길이가 잘못되었습니다"
 
-#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:124
+#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123
 msgid "unable to initialize SIA session"
 msgstr "SIA 세션을 초기화할 수 없습니다"
 
@@ -1041,7 +1102,7 @@ msgstr "sudo에 컴파일한 인증 방식이 없습니다!  인증 기능을 
 msgid "Unable to initialize authentication methods."
 msgstr "인증 방식을 초기화할 수 없습니다."
 
-#: plugins/sudoers/auth/sudo_auth.c:473
+#: plugins/sudoers/auth/sudo_auth.c:471
 msgid "Authentication methods:"
 msgstr "인증 방식:"
 
@@ -1074,117 +1135,117 @@ msgstr ""
 "\n"
 
 #: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311
-#: plugins/sudoers/sudoers.c:763 plugins/sudoers/sudoers.c:811
+#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858
 #: plugins/sudoers/tsdump.c:119
 #, c-format
 msgid "unknown uid: %u"
 msgstr "알 수 없는 uid: %u"
 
-#: plugins/sudoers/check.c:306 plugins/sudoers/iolog.c:117
-#: plugins/sudoers/policy.c:1037 plugins/sudoers/sudoers.c:387
-#: plugins/sudoers/sudoers.c:388 plugins/sudoers/sudoers.c:1240
-#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:392
+#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85
+#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088
+#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307
+#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386
 #, c-format
 msgid "unknown user: %s"
 msgstr "알 수 없는 사용자: %s"
 
-#: plugins/sudoers/cvtsudoers.c:195
+#: plugins/sudoers/cvtsudoers.c:194
 #, c-format
 msgid "order increment: %s: %s"
 msgstr "순서 증가: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:211
+#: plugins/sudoers/cvtsudoers.c:210
 #, c-format
 msgid "starting order: %s: %s"
 msgstr "순서 시작: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:221
+#: plugins/sudoers/cvtsudoers.c:220
 #, c-format
 msgid "order padding: %s: %s"
 msgstr "순서 패딩: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:231 plugins/sudoers/visudo.c:180
+#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179
 #, c-format
 msgid "%s grammar version %d\n"
 msgstr "%s 문법 버전 %d\n"
 
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/testsudoers.c:167
+#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167
 #, c-format
 msgid "unsupported input format %s"
 msgstr "지원하지 않는 %s 입력 형식"
 
-#: plugins/sudoers/cvtsudoers.c:263
+#: plugins/sudoers/cvtsudoers.c:262
 #, c-format
 msgid "unsupported output format %s"
 msgstr "지원하지 않는 %s 출력 형식"
 
-#: plugins/sudoers/cvtsudoers.c:315
+#: plugins/sudoers/cvtsudoers.c:314
 #, c-format
 msgid "%s: input and output files must be different"
 msgstr "%s: 입출력 파일은 달라야합니다"
 
-#: plugins/sudoers/cvtsudoers.c:331 plugins/sudoers/sudoers.c:181
-#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:248
-#: plugins/sudoers/visudo.c:604 plugins/sudoers/visudo.c:927
+#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178
+#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926
 msgid "unable to initialize sudoers default values"
 msgstr "sudoers 기본 값을 초기화할 수 없습니다"
 
-#: plugins/sudoers/cvtsudoers.c:417 plugins/sudoers/ldap_conf.c:431
+#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431
 #, c-format
 msgid "%s: %s: %s: %s"
 msgstr "%s: %s: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:476
+#: plugins/sudoers/cvtsudoers.c:475
 #, c-format
 msgid "%s: unknown key word: %s"
 msgstr "%s: 알 수 없는 키워드: %s"
 
-#: plugins/sudoers/cvtsudoers.c:522
+#: plugins/sudoers/cvtsudoers.c:521
 #, c-format
 msgid "invalid defaults type: %s"
 msgstr "잘못된 기본 형식: %s"
 
-#: plugins/sudoers/cvtsudoers.c:545
+#: plugins/sudoers/cvtsudoers.c:544
 #, c-format
 msgid "invalid suppression type: %s"
 msgstr "잘못된 생략 형식: %s"
 
-#: plugins/sudoers/cvtsudoers.c:585 plugins/sudoers/cvtsudoers.c:599
+#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598
 #, c-format
 msgid "invalid filter: %s"
 msgstr "잘못된 필터: %s"
 
-#: plugins/sudoers/cvtsudoers.c:618 plugins/sudoers/cvtsudoers.c:635
-#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:861
-#: plugins/sudoers/cvtsudoers_ldif.c:680 plugins/sudoers/sudoers.c:986
-#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/timestamp.c:441
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:923
+#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634
+#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872
+#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441
+#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922
 #, c-format
 msgid "unable to open %s"
 msgstr "%s을(를) 열 수 없습니다"
 
-#: plugins/sudoers/cvtsudoers.c:638 plugins/sudoers/visudo.c:932
+#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931
 #, c-format
 msgid "failed to parse %s file, unknown error"
 msgstr "%s 파일 해석에 실패했습니다. 알 수 없는 오류."
 
-#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/visudo.c:949
+#: plugins/sudoers/cvtsudoers.c:645
 #, c-format
 msgid "parse error in %s near line %d\n"
 msgstr "%s %d번째 줄 인근 해석 오류\n"
 
-#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:952
+#: plugins/sudoers/cvtsudoers.c:648
 #, c-format
 msgid "parse error in %s\n"
 msgstr "%s 해석 오류\n"
 
-#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/sudoreplay.c:1125
+#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124
 #: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328
 #, c-format
 msgid "unable to write to %s"
 msgstr "%s에 기록할 수 없습니다"
 
-#: plugins/sudoers/cvtsudoers.c:1315
+#: plugins/sudoers/cvtsudoers.c:1314
 #, c-format
 msgid ""
 "%s - convert between sudoers file formats\n"
@@ -1193,7 +1254,7 @@ msgstr ""
 "%s - sudoers 파일 형식을 변환합니다\n"
 "\n"
 
-#: plugins/sudoers/cvtsudoers.c:1317
+#: plugins/sudoers/cvtsudoers.c:1316
 msgid ""
 "\n"
 "Options:\n"
@@ -1234,675 +1295,700 @@ msgstr ""
 "  -V, --version              버전 정보를 표시하고 빠져나갑니다"
 
 #: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514
-#: plugins/sudoers/cvtsudoers_json.c:702
+#: plugins/sudoers/cvtsudoers_json.c:713
 #, c-format
 msgid "unknown defaults entry \"%s\""
 msgstr "알 수 없는 \"%s\" 기본 항목"
 
-#: plugins/sudoers/cvtsudoers_json.c:640 plugins/sudoers/cvtsudoers_json.c:653
-#: plugins/sudoers/cvtsudoers_ldif.c:345 plugins/sudoers/cvtsudoers_ldif.c:356
-#: plugins/sudoers/ldap.c:502
+#: 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
 msgid "unable to get GMT time"
 msgstr "GMT 시간을 가져올 수 없습니다"
 
-#: plugins/sudoers/cvtsudoers_json.c:643 plugins/sudoers/cvtsudoers_json.c:656
-#: plugins/sudoers/cvtsudoers_ldif.c:348 plugins/sudoers/cvtsudoers_ldif.c:359
-#: plugins/sudoers/ldap.c:508
+#: 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
 msgid "unable to format timestamp"
 msgstr "타임스탬프를 형식에 맞출 수 없습니다"
 
-#: plugins/sudoers/cvtsudoers_ldif.c:632
+#: plugins/sudoers/cvtsudoers_ldif.c:640
 #, c-format
 msgid "too many sudoers entries, maximum %u"
 msgstr "sudoers 항목이 너무 많습니다. 최대 갯수는 %u개 입니다"
 
-#: plugins/sudoers/cvtsudoers_ldif.c:675
+#: plugins/sudoers/cvtsudoers_ldif.c:683
 msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified."
 msgstr "SUDOERS_BASE 환경 변수를 설정하지 않았으며 -b 옵션을 지정하지 않았습니다."
 
-#: plugins/sudoers/def_data.c:42
+#: plugins/sudoers/def_data.c:50
 #, c-format
 msgid "Syslog facility if syslog is being used for logging: %s"
 msgstr "syslog를 기록 목적으로 활용할 때의 syslog 기능: %s"
 
-#: plugins/sudoers/def_data.c:46
+#: plugins/sudoers/def_data.c:54
 #, c-format
 msgid "Syslog priority to use when user authenticates successfully: %s"
 msgstr "사용자 인증에 성공했을 때 사용할 syslog 우선 순위: %s"
 
-#: plugins/sudoers/def_data.c:50
+#: plugins/sudoers/def_data.c:58
 #, c-format
 msgid "Syslog priority to use when user authenticates unsuccessfully: %s"
 msgstr "사용자 인증에 실패했을 때 사용할 syslog 우선 순위: %s"
 
-#: plugins/sudoers/def_data.c:54
+#: plugins/sudoers/def_data.c:62
 msgid "Put OTP prompt on its own line"
 msgstr "일회용 암호 입력 프롬프트를 자체 줄에 표시"
 
-#: plugins/sudoers/def_data.c:58
+#: plugins/sudoers/def_data.c:66
 msgid "Ignore '.' in $PATH"
 msgstr "$PATH의 '.'은 무시합니다"
 
-#: plugins/sudoers/def_data.c:62
+#: plugins/sudoers/def_data.c:70
 msgid "Always send mail when sudo is run"
 msgstr "sudo를 실행할 때 항상 메일을 보냄"
 
-#: plugins/sudoers/def_data.c:66
+#: plugins/sudoers/def_data.c:74
 msgid "Send mail if user authentication fails"
 msgstr "사용자가 인증에 실패했을 때 메일을 보냄"
 
-#: plugins/sudoers/def_data.c:70
+#: plugins/sudoers/def_data.c:78
 msgid "Send mail if the user is not in sudoers"
 msgstr "사용자가 sudoer가 아닐 때 메일을 보냄"
 
-#: plugins/sudoers/def_data.c:74
+#: plugins/sudoers/def_data.c:82
 msgid "Send mail if the user is not in sudoers for this host"
 msgstr "사용자가 이 호스트의 sudoer가 아닐 때 메일을 보냄"
 
-#: plugins/sudoers/def_data.c:78
+#: plugins/sudoers/def_data.c:86
 msgid "Send mail if the user is not allowed to run a command"
 msgstr "사용자가 명령을 실행하도록 허용하지 않았을 때 메일을 보냄"
 
-#: plugins/sudoers/def_data.c:82
+#: plugins/sudoers/def_data.c:90
 msgid "Send mail if the user tries to run a command"
 msgstr "사용자가 명령 실행을 시도했을 때 메일을 보냄"
 
-#: plugins/sudoers/def_data.c:86
+#: plugins/sudoers/def_data.c:94
 msgid "Use a separate timestamp for each user/tty combo"
 msgstr "각 사용자/tty에 타임스탬프를 따로 사용"
 
-#: plugins/sudoers/def_data.c:90
+#: plugins/sudoers/def_data.c:98
 msgid "Lecture user the first time they run sudo"
 msgstr "sudo를 처음 실행할 때 사용자에게 지침 안내"
 
-#: plugins/sudoers/def_data.c:94
+#: plugins/sudoers/def_data.c:102
 #, c-format
 msgid "File containing the sudo lecture: %s"
 msgstr "sudo 지침 안내가 들어있는 파일: %s"
 
-#: plugins/sudoers/def_data.c:98
+#: plugins/sudoers/def_data.c:106
 msgid "Require users to authenticate by default"
 msgstr "기본적으로 사용자 인증 필요"
 
-#: plugins/sudoers/def_data.c:102
+#: plugins/sudoers/def_data.c:110
 msgid "Root may run sudo"
 msgstr "루트 사용자의 sudo 실행"
 
-#: plugins/sudoers/def_data.c:106
+#: plugins/sudoers/def_data.c:114
 msgid "Log the hostname in the (non-syslog) log file"
 msgstr "로그(비 syslog) 파일에 호스트 이름 기록"
 
-#: plugins/sudoers/def_data.c:110
+#: plugins/sudoers/def_data.c:118
 msgid "Log the year in the (non-syslog) log file"
 msgstr "로그(비 syslog) 파일에 연도 기록"
 
-#: plugins/sudoers/def_data.c:114
+#: plugins/sudoers/def_data.c:122
 msgid "If sudo is invoked with no arguments, start a shell"
 msgstr "sudo에 인자를 넣어 실행하지 않으면 셸 시작"
 
-#: plugins/sudoers/def_data.c:118
+#: plugins/sudoers/def_data.c:126
 msgid "Set $HOME to the target user when starting a shell with -s"
 msgstr "-s 옵션으로 셸을 시작할 때 $HOME을 대상 사용자로 설정"
 
-#: plugins/sudoers/def_data.c:122
+#: plugins/sudoers/def_data.c:130
 msgid "Always set $HOME to the target user's home directory"
 msgstr "항상 $HOME을 대상 사용자의 내 폴더로 설정"
 
-#: plugins/sudoers/def_data.c:126
+#: plugins/sudoers/def_data.c:134
 msgid "Allow some information gathering to give useful error messages"
 msgstr "쓸만한 오류 메시지를 제공할 목적으로 일부 정보 수집 허용"
 
-#: plugins/sudoers/def_data.c:130
+#: plugins/sudoers/def_data.c:138
 msgid "Require fully-qualified hostnames in the sudoers file"
 msgstr "sudoers 파일에 완전한 형태를 갖춘 호스트 이름 필요"
 
-#: plugins/sudoers/def_data.c:134
+#: plugins/sudoers/def_data.c:142
 msgid "Insult the user when they enter an incorrect password"
 msgstr "올바르지 않은 암호를 입력했을 때 사용자 놀리기"
 
-#: plugins/sudoers/def_data.c:138
+#: plugins/sudoers/def_data.c:146
 msgid "Only allow the user to run sudo if they have a tty"
 msgstr "tty를 보유한 사용자만 sudo 실행 허용"
 
-#: plugins/sudoers/def_data.c:142
+#: plugins/sudoers/def_data.c:150
 msgid "Visudo will honor the EDITOR environment variable"
 msgstr "EDITOR 환경 변수 대신 visudo 사용"
 
-#: plugins/sudoers/def_data.c:146
+#: plugins/sudoers/def_data.c:154
 msgid "Prompt for root's password, not the users's"
 msgstr "사용자 암호가 아닌 루트 암호 요구"
 
-#: plugins/sudoers/def_data.c:150
+#: plugins/sudoers/def_data.c:158
 msgid "Prompt for the runas_default user's password, not the users's"
 msgstr "사용자 암호가 아닌 runas_default 사용자 암호 요구"
 
-#: plugins/sudoers/def_data.c:154
+#: plugins/sudoers/def_data.c:162
 msgid "Prompt for the target user's password, not the users's"
 msgstr "사용자 암호가 아닌 대상 사용자 암호 요구"
 
-#: plugins/sudoers/def_data.c:158
+#: plugins/sudoers/def_data.c:166
 msgid "Apply defaults in the target user's login class if there is one"
 msgstr "대상 사용자 로그인 클래스가 있다면 기본값 적용"
 
-#: plugins/sudoers/def_data.c:162
+#: plugins/sudoers/def_data.c:170
 msgid "Set the LOGNAME and USER environment variables"
 msgstr "LOGNAME 및 USER 환경 변수 설정"
 
-#: plugins/sudoers/def_data.c:166
+#: plugins/sudoers/def_data.c:174
 msgid "Only set the effective uid to the target user, not the real uid"
 msgstr "실제 uid가 아닌 대상 사용자에게 유효한 uid 설정"
 
-#: plugins/sudoers/def_data.c:170
+#: plugins/sudoers/def_data.c:178
 msgid "Don't initialize the group vector to that of the target user"
 msgstr "대상 사용자의 그룹 벡터 초기화 안함"
 
-#: plugins/sudoers/def_data.c:174
+#: plugins/sudoers/def_data.c:182
 #, c-format
 msgid "Length at which to wrap log file lines (0 for no wrap): %u"
 msgstr "로그 파일 줄을 바꿀 줄의 한계 길이(0 값은 줄 바꿈 안함): %u"
 
-#: plugins/sudoers/def_data.c:178
+#: plugins/sudoers/def_data.c:186
 #, c-format
 msgid "Authentication timestamp timeout: %.1f minutes"
 msgstr "인증 타임스탬프 제한 시간: %.1f분"
 
-#: plugins/sudoers/def_data.c:182
+#: plugins/sudoers/def_data.c:190
 #, c-format
 msgid "Password prompt timeout: %.1f minutes"
 msgstr "암호 요구 제한시간: %.1f분"
 
-#: plugins/sudoers/def_data.c:186
+#: plugins/sudoers/def_data.c:194
 #, c-format
 msgid "Number of tries to enter a password: %u"
 msgstr "암호 입력 시도 횟수: %u"
 
-#: plugins/sudoers/def_data.c:190
+#: plugins/sudoers/def_data.c:198
 #, c-format
 msgid "Umask to use or 0777 to use user's: 0%o"
 msgstr "사용자가 활용할 umask 또는 0777: 0%o"
 
-#: plugins/sudoers/def_data.c:194
+#: plugins/sudoers/def_data.c:202
 #, c-format
 msgid "Path to log file: %s"
 msgstr "로그 파일 경로: %s"
 
-#: plugins/sudoers/def_data.c:198
+#: plugins/sudoers/def_data.c:206
 #, c-format
 msgid "Path to mail program: %s"
 msgstr "메일 프로그램 경로: %s"
 
-#: plugins/sudoers/def_data.c:202
+#: plugins/sudoers/def_data.c:210
 #, c-format
 msgid "Flags for mail program: %s"
 msgstr "메일 프로그램 플래그: %s"
 
-#: plugins/sudoers/def_data.c:206
+#: plugins/sudoers/def_data.c:214
 #, c-format
 msgid "Address to send mail to: %s"
 msgstr "메일을 보낼 주소: %s"
 
-#: plugins/sudoers/def_data.c:210
+#: plugins/sudoers/def_data.c:218
 #, c-format
 msgid "Address to send mail from: %s"
 msgstr "메일을 보내려는 주소: %s"
 
-#: plugins/sudoers/def_data.c:214
+#: plugins/sudoers/def_data.c:222
 #, c-format
 msgid "Subject line for mail messages: %s"
 msgstr "메일 메시지 제목 줄: %s"
 
-#: plugins/sudoers/def_data.c:218
+#: plugins/sudoers/def_data.c:226
 #, c-format
 msgid "Incorrect password message: %s"
 msgstr "올바르지 않은 암호 메시지: %s"
 
-#: plugins/sudoers/def_data.c:222
+#: plugins/sudoers/def_data.c:230
 #, c-format
 msgid "Path to lecture status dir: %s"
 msgstr "지침 상태 디렉터리 경로: %s"
 
-#: plugins/sudoers/def_data.c:226
+#: plugins/sudoers/def_data.c:234
 #, c-format
 msgid "Path to authentication timestamp dir: %s"
 msgstr "인증 타임스탬프 디렉터리 경로: %s"
 
-#: plugins/sudoers/def_data.c:230
+#: plugins/sudoers/def_data.c:238
 #, c-format
 msgid "Owner of the authentication timestamp dir: %s"
 msgstr "인증 타임스탬프 디렉터리 소유자: %s"
 
-#: plugins/sudoers/def_data.c:234
+#: plugins/sudoers/def_data.c:242
 #, c-format
 msgid "Users in this group are exempt from password and PATH requirements: %s"
 msgstr "암호와 PATH 변수 요구를 하지 않을 이 그룹의 사용자: %s"
 
-#: plugins/sudoers/def_data.c:238
+#: plugins/sudoers/def_data.c:246
 #, c-format
 msgid "Default password prompt: %s"
 msgstr "기본 암호 프롬프트: %s"
 
-#: plugins/sudoers/def_data.c:242
+#: plugins/sudoers/def_data.c:250
 msgid "If set, passprompt will override system prompt in all cases."
 msgstr "설정하면 모든 경우의 시스템 프롬프트 대신 이 암호 프롬프트를 사용합니다."
 
-#: plugins/sudoers/def_data.c:246
+#: plugins/sudoers/def_data.c:254
 #, c-format
 msgid "Default user to run commands as: %s"
 msgstr "명령을 실행할 기본 사용자: %s"
 
-#: plugins/sudoers/def_data.c:250
+#: plugins/sudoers/def_data.c:258
 #, c-format
 msgid "Value to override user's $PATH with: %s"
 msgstr "사용자의 $PATH를 대신할 값: %s"
 
-#: plugins/sudoers/def_data.c:254
+#: plugins/sudoers/def_data.c:262
 #, c-format
 msgid "Path to the editor for use by visudo: %s"
 msgstr "visudo에서 사용할 편집기 경로: %s"
 
-#: plugins/sudoers/def_data.c:258
+#: plugins/sudoers/def_data.c:266
 #, c-format
 msgid "When to require a password for 'list' pseudocommand: %s"
 msgstr "'list' 유사 명령 실행시 암호가 필요할 때: %s"
 
-#: plugins/sudoers/def_data.c:262
+#: plugins/sudoers/def_data.c:270
 #, c-format
 msgid "When to require a password for 'verify' pseudocommand: %s"
 msgstr "'verify' 유사 명령 실행시 암호가 필요할 때: %s"
 
-#: plugins/sudoers/def_data.c:266
-msgid "Preload the dummy exec functions contained in the sudo_noexec library"
-msgstr "sudo_noexec 라이브러리에 있는 모조 exec 함수 미리 불러오기"
+#: plugins/sudoers/def_data.c:274
+msgid "Preload the sudo_noexec library which replaces the exec functions"
+msgstr "exec 함수를 대체하는 sudo_noexec 라이브러리를 미리 불러옵니다"
 
-#: plugins/sudoers/def_data.c:270
+#: plugins/sudoers/def_data.c:278
 msgid "If LDAP directory is up, do we ignore local sudoers file"
 msgstr "LDAP 디렉터리가 동작 중이라면 로컬 sudoers 파일을 무시합니다"
 
-#: plugins/sudoers/def_data.c:274
+#: plugins/sudoers/def_data.c:282
 #, c-format
 msgid "File descriptors >= %d will be closed before executing a command"
 msgstr "%d보다 큰 파일 서술자는 명령을 실행하기 전에 닫습니다"
 
-#: plugins/sudoers/def_data.c:278
+#: plugins/sudoers/def_data.c:286
 msgid "If set, users may override the value of \"closefrom\" with the -C option"
 msgstr "이 값을 설정하면 -C 옵션으로 \"closefrom\" 값을 대신 사용합니다"
 
-#: plugins/sudoers/def_data.c:282
+#: plugins/sudoers/def_data.c:290
 msgid "Allow users to set arbitrary environment variables"
 msgstr "사용자가 환경 변수 값을 임의대로 설정할 수 있게 합니다"
 
-#: plugins/sudoers/def_data.c:286
+#: plugins/sudoers/def_data.c:294
 msgid "Reset the environment to a default set of variables"
 msgstr "변수 기본 설정 값으로 환경 초기화"
 
-#: plugins/sudoers/def_data.c:290
-msgid "Environment variables to check for sanity:"
-msgstr "무결성 검사할 환경 변수:"
+#: plugins/sudoers/def_data.c:298
+msgid "Environment variables to check for safety:"
+msgstr "안전 검사 대상 환경 변수:"
 
-#: plugins/sudoers/def_data.c:294
+#: plugins/sudoers/def_data.c:302
 msgid "Environment variables to remove:"
 msgstr "제거할 환경 변수:"
 
-#: plugins/sudoers/def_data.c:298
+#: plugins/sudoers/def_data.c:306
 msgid "Environment variables to preserve:"
 msgstr "유지할 환경 변수:"
 
-#: plugins/sudoers/def_data.c:302
+#: plugins/sudoers/def_data.c:310
 #, c-format
 msgid "SELinux role to use in the new security context: %s"
 msgstr "새 보안 컨텍스트에 사용할 SELinux 역할: %s"
 
-#: plugins/sudoers/def_data.c:306
+#: plugins/sudoers/def_data.c:314
 #, c-format
 msgid "SELinux type to use in the new security context: %s"
 msgstr "새 보안 컨텍스트에 사용할 SELinux 형식: %s"
 
-#: plugins/sudoers/def_data.c:310
+#: plugins/sudoers/def_data.c:318
 #, c-format
 msgid "Path to the sudo-specific environment file: %s"
 msgstr "sudo용 환경 파일 경로: %s"
 
-#: plugins/sudoers/def_data.c:314
+#: plugins/sudoers/def_data.c:322
 #, c-format
 msgid "Path to the restricted sudo-specific environment file: %s"
 msgstr "sudo 전용 환경 파일 경로: %s"
 
-#: plugins/sudoers/def_data.c:318
+#: plugins/sudoers/def_data.c:326
 #, c-format
 msgid "Locale to use while parsing sudoers: %s"
 msgstr "sudoers 파일을 해석할 때 사용할 로캘: %s"
 
-#: plugins/sudoers/def_data.c:322
+#: plugins/sudoers/def_data.c:330
 msgid "Allow sudo to prompt for a password even if it would be visible"
 msgstr "암호가 나타나더라도 sudo에서 암호 입력 요구 허용"
 
-#: plugins/sudoers/def_data.c:326
+#: plugins/sudoers/def_data.c:334
 msgid "Provide visual feedback at the password prompt when there is user input"
 msgstr "사용자 입력이 있을 때 암호 프롬프트에서 시각 반응 처리"
 
-#: plugins/sudoers/def_data.c:330
+#: plugins/sudoers/def_data.c:338
 msgid "Use faster globbing that is less accurate but does not access the filesystem"
 msgstr "덜 정확하지만 파일 시스템에 접근하지 않는 빠른 비교 검사 사용"
 
-#: plugins/sudoers/def_data.c:334
+#: plugins/sudoers/def_data.c:342
 msgid "The umask specified in sudoers will override the user's, even if it is more permissive"
 msgstr "sudoers에 지정한 umask 값이 관대한 권한이라 하더라도 사용자의 umask 값으로 적용"
 
-#: plugins/sudoers/def_data.c:338
+#: plugins/sudoers/def_data.c:346
 msgid "Log user's input for the command being run"
 msgstr "실행 명령에 대한 사용자 입력 기록"
 
-#: plugins/sudoers/def_data.c:342
+#: plugins/sudoers/def_data.c:350
 msgid "Log the output of the command being run"
 msgstr "실행 명령에 대한 출력 기록"
 
-#: plugins/sudoers/def_data.c:346
+#: plugins/sudoers/def_data.c:354
 msgid "Compress I/O logs using zlib"
 msgstr "zlib로 입출력 로그 압축"
 
-#: plugins/sudoers/def_data.c:350
+#: plugins/sudoers/def_data.c:358
 msgid "Always run commands in a pseudo-tty"
 msgstr "항상 명령을 유사 tty에서 실행"
 
-#: plugins/sudoers/def_data.c:354
+#: plugins/sudoers/def_data.c:362
 #, c-format
 msgid "Plugin for non-Unix group support: %s"
 msgstr "비 유닉스 그룹을 지원하는 플러그인: %s"
 
-#: plugins/sudoers/def_data.c:358
+#: plugins/sudoers/def_data.c:366
 #, c-format
 msgid "Directory in which to store input/output logs: %s"
 msgstr "입출력 로그를 저장할 디렉터리: %s"
 
-#: plugins/sudoers/def_data.c:362
+#: plugins/sudoers/def_data.c:370
 #, c-format
 msgid "File in which to store the input/output log: %s"
 msgstr "입출력 로그를 저장할 파일: %s"
 
-#: plugins/sudoers/def_data.c:366
+#: plugins/sudoers/def_data.c:374
 msgid "Add an entry to the utmp/utmpx file when allocating a pty"
 msgstr "pty를 할당할 때 utmp/utmpx 파일에 항목 추가"
 
-#: plugins/sudoers/def_data.c:370
+#: plugins/sudoers/def_data.c:378
 msgid "Set the user in utmp to the runas user, not the invoking user"
 msgstr "utmp의 사용자를 실제 실행 사용자가 아닌 대리 실행 사용자로 설정"
 
-#: plugins/sudoers/def_data.c:374
+#: plugins/sudoers/def_data.c:382
 #, c-format
 msgid "Set of permitted privileges: %s"
 msgstr "권한 허용 설정: %s"
 
-#: plugins/sudoers/def_data.c:378
+#: plugins/sudoers/def_data.c:386
 #, c-format
 msgid "Set of limit privileges: %s"
 msgstr "권한 제한 설정: %s"
 
-#: plugins/sudoers/def_data.c:382
+#: plugins/sudoers/def_data.c:390
 msgid "Run commands on a pty in the background"
 msgstr "백그라운드의 pty에서 명령을 실행합니다"
 
-#: plugins/sudoers/def_data.c:386
+#: plugins/sudoers/def_data.c:394
 #, c-format
 msgid "PAM service name to use: %s"
 msgstr "사용할 PAM 서비스 이름: %s"
 
-#: plugins/sudoers/def_data.c:390
+#: plugins/sudoers/def_data.c:398
 #, c-format
 msgid "PAM service name to use for login shells: %s"
 msgstr "로그인 셸에서 사용할 PAM 서비스 이름: %s"
 
-#: plugins/sudoers/def_data.c:394
+#: plugins/sudoers/def_data.c:402
 msgid "Attempt to establish PAM credentials for the target user"
 msgstr "대상 사용자의 PAM 인증 처리 시도합니다"
 
-#: plugins/sudoers/def_data.c:398
+#: plugins/sudoers/def_data.c:406
 msgid "Create a new PAM session for the command to run in"
 msgstr "실행할 명령에 새 PAM 세션을 만듭니다"
 
-#: plugins/sudoers/def_data.c:402
+#: plugins/sudoers/def_data.c:410
 msgid "Perform PAM account validation management"
 msgstr "PAM 계정 검증 관리를 수행합니다"
 
-#: plugins/sudoers/def_data.c:406
+#: plugins/sudoers/def_data.c:414
 #, c-format
 msgid "Maximum I/O log sequence number: %s"
 msgstr "최대 입출력 로그 순차 번호: %s"
 
-#: plugins/sudoers/def_data.c:410
+#: plugins/sudoers/def_data.c:418
 msgid "Enable sudoers netgroup support"
 msgstr "sudoers에 네트워크 그룹 지원 활성화"
 
-#: plugins/sudoers/def_data.c:414
+#: plugins/sudoers/def_data.c:422
 msgid "Check parent directories for writability when editing files with sudoedit"
 msgstr "sudoedit로 파일을 편집할 때 상위 디렉터리 기록 가능 여부 확인"
 
-#: plugins/sudoers/def_data.c:418
+#: plugins/sudoers/def_data.c:426
 msgid "Follow symbolic links when editing files with sudoedit"
 msgstr "sudoedit로 파일을 편집할 때 심볼릭 링크 따라감"
 
-#: plugins/sudoers/def_data.c:422
+#: plugins/sudoers/def_data.c:430
 msgid "Query the group plugin for unknown system groups"
 msgstr "알 수 없는 시스템 그룹에 그룹 플러그인 요청"
 
-#: plugins/sudoers/def_data.c:426
+#: plugins/sudoers/def_data.c:434
 msgid "Match netgroups based on the entire tuple: user, host and domain"
 msgstr "user, host, domain 전체 튜플을 기반으로 네트워크 그룹 비교"
 
-#: plugins/sudoers/def_data.c:430
+#: plugins/sudoers/def_data.c:438
 msgid "Allow commands to be run even if sudo cannot write to the audit log"
 msgstr "sudo에서 감시 로그를 기록할 수 없을 경우에도 명령 실행 허용"
 
-#: plugins/sudoers/def_data.c:434
+#: plugins/sudoers/def_data.c:442
 msgid "Allow commands to be run even if sudo cannot write to the I/O log"
 msgstr "sudo에서 입출력 로그를 기록할 수 없을 경우에도 명령 실행 허용"
 
-#: plugins/sudoers/def_data.c:438
+#: plugins/sudoers/def_data.c:446
 msgid "Allow commands to be run even if sudo cannot write to the log file"
 msgstr "sudo에서 로그 파일에 기록할 수 없을 경우에도 명령 실행 허용"
 
-#: plugins/sudoers/def_data.c:442
+#: plugins/sudoers/def_data.c:450
 msgid "Resolve groups in sudoers and match on the group ID, not the name"
 msgstr "sudoers의 그룹을 해석하고 그룹 이름이 아닌 ID와 비교"
 
-#: plugins/sudoers/def_data.c:446
+#: plugins/sudoers/def_data.c:454
 #, c-format
 msgid "Log entries larger than this value will be split into multiple syslog messages: %u"
 msgstr "이 값보다 큰 로그 항목은 다수의 syslog 메시지로 나눕니다: %u"
 
-#: plugins/sudoers/def_data.c:450
+#: plugins/sudoers/def_data.c:458
 #, c-format
 msgid "User that will own the I/O log files: %s"
 msgstr "입출력 로그 파일을 소유할 사용자: %s"
 
-#: plugins/sudoers/def_data.c:454
+#: plugins/sudoers/def_data.c:462
 #, c-format
 msgid "Group that will own the I/O log files: %s"
 msgstr "입출력 로그 파일을 소유할 그룹: %s"
 
-#: plugins/sudoers/def_data.c:458
+#: plugins/sudoers/def_data.c:466
 #, c-format
 msgid "File mode to use for the I/O log files: 0%o"
 msgstr "입출력 로그 파일에 사용할 파일 모드: 0%o"
 
-#: plugins/sudoers/def_data.c:462
+#: plugins/sudoers/def_data.c:470
 #, c-format
 msgid "Execute commands by file descriptor instead of by path: %s"
 msgstr "경로가 아닌 파일 서술자로 명령어 실행: %s"
 
-#: plugins/sudoers/def_data.c:466
+#: plugins/sudoers/def_data.c:474
 msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
 msgstr "경고를 출력하는 대신 sudoers에서 알 수 없는 기본 항목을 무시"
 
-#: plugins/sudoers/def_data.c:470
+#: plugins/sudoers/def_data.c:478
 #, c-format
 msgid "Time in seconds after which the command will be terminated: %u"
 msgstr "명령 처리가 끝난 후의 초 단위 시간: %u"
 
-#: plugins/sudoers/def_data.c:474
+#: plugins/sudoers/def_data.c:482
 msgid "Allow the user to specify a timeout on the command line"
 msgstr "사용자가 명령행에서 제한 시간을 지정하도록 허용"
 
-#: plugins/sudoers/def_data.c:478
+#: plugins/sudoers/def_data.c:486
 msgid "Flush I/O log data to disk immediately instead of buffering it"
 msgstr "입출력 로그 데이터를 버퍼링하는 대신 즉시 디스크로 플러싱"
 
-#: plugins/sudoers/def_data.c:482
+#: plugins/sudoers/def_data.c:490
 msgid "Include the process ID when logging via syslog"
 msgstr "syslog로 로깅할 때 프로세스 ID 포함"
 
-#: plugins/sudoers/def_data.c:486
+#: plugins/sudoers/def_data.c:494
 #, c-format
 msgid "Type of authentication timestamp record: %s"
 msgstr "인증 타임스탬프 레코드 형식: %s"
 
-#: plugins/sudoers/def_data.c:490
+#: plugins/sudoers/def_data.c:498
 #, c-format
 msgid "Authentication failure message: %s"
 msgstr "인증 실패 메시지: %s"
 
-#: plugins/sudoers/def_data.c:494
+#: plugins/sudoers/def_data.c:502
 msgid "Ignore case when matching user names"
 msgstr "사용자 이름 비교시 대소문자 무시"
 
-#: plugins/sudoers/def_data.c:498
+#: plugins/sudoers/def_data.c:506
 msgid "Ignore case when matching group names"
 msgstr "그룹 이름 비교시 대소문자 무시"
 
-#: plugins/sudoers/def_data.c:502
+#: plugins/sudoers/def_data.c:510
 msgid "Log when a command is allowed by sudoers"
 msgstr "sudoers에서 명령을 허용할 때 기록"
 
-#: plugins/sudoers/def_data.c:506
+#: plugins/sudoers/def_data.c:514
 msgid "Log when a command is denied by sudoers"
 msgstr "sudoers에서 명령을 거절할 때 기록"
 
-#: plugins/sudoers/def_data.c:510
+#: plugins/sudoers/def_data.c:518
 msgid "Sudo log server(s) to connect to with optional port"
 msgstr "개별 포트 정보를 추가하여 연결할 sudo 로그 서버"
 
-#: plugins/sudoers/def_data.c:514
+#: plugins/sudoers/def_data.c:522
 #, c-format
 msgid "Sudo log server timeout in seconds: %u"
 msgstr "초 단위 sudo 로그 서버 제한 시간: %u"
 
-#: plugins/sudoers/def_data.c:518
+#: plugins/sudoers/def_data.c:526
 msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
 msgstr "연결한 로그 서버 소켓에 SO_KEEPALIVE 소켓 옵션 활성화"
 
-#: plugins/sudoers/def_data.c:522
+#: plugins/sudoers/def_data.c:530
 #, c-format
 msgid "Path to the audit server's CA bundle file: %s"
 msgstr "감사 서버의 CA 번들 파일 경로: %s"
 
-#: plugins/sudoers/def_data.c:526
+#: plugins/sudoers/def_data.c:534
 #, c-format
 msgid "Path to the sudoers certificate file: %s"
 msgstr "sudoers 인증 파일 경로: %s"
 
-#: plugins/sudoers/def_data.c:530
+#: plugins/sudoers/def_data.c:538
 #, c-format
 msgid "Path to the sudoers private key file: %s"
 msgstr "sudoers 개인 키 파일 경로: %s"
 
-#: plugins/sudoers/def_data.c:534
+#: plugins/sudoers/def_data.c:542
 msgid "Verify that the log server's certificate is valid"
 msgstr "로그 서버 인증서 유효성 검증"
 
-#: plugins/sudoers/def_data.c:538
+#: plugins/sudoers/def_data.c:546
 msgid "Allow the use of unknown runas user and/or group ID"
 msgstr "사용자/그룹 ID로의 알 수 없는 실행 허용"
 
-#: plugins/sudoers/def_data.c:542
+#: plugins/sudoers/def_data.c:550
 msgid "Only permit running commands as a user with a valid shell"
 msgstr "유효한 셸에서 사용자가 명령을 실행할 경우만 허용"
 
-#: plugins/sudoers/def_data.c:546
+#: plugins/sudoers/def_data.c:554
 msgid "Set the pam remote user to the user running sudo"
 msgstr "sudo를 실행하는 사용자를 PAM 원격 사용자로 설정"
 
-#: plugins/sudoers/def_data.c:550
+#: plugins/sudoers/def_data.c:558
 msgid "Set the pam remote host to the local host name"
 msgstr "로컬 호스트 이름에 PAM 원격 사용자 설정"
 
-#: plugins/sudoers/defaults.c:183
+#: plugins/sudoers/def_data.c:562
 #, c-format
-msgid "%s:%d unknown defaults entry \"%s\""
-msgstr "%s:%d 알 수 없는 \"%s\" 기본 항목"
+msgid "Working directory to change to before executing the command: %s"
+msgstr "명령 실행 전 바꿀 작업 디렉터리: %s"
 
-#: plugins/sudoers/defaults.c:186
+#: plugins/sudoers/def_data.c:566
 #, c-format
-msgid "%s: unknown defaults entry \"%s\""
-msgstr "%s: 알 수 없는 \"%s\" 기본 항목"
+msgid "Root directory to change to before executing the command: %s"
+msgstr "명령 실행 전 바꿀 루트 디렉터리: %s"
 
-#: plugins/sudoers/defaults.c:229
+#: plugins/sudoers/def_data.c:570
 #, c-format
-msgid "%s:%d no value specified for \"%s\""
-msgstr "%s:%d \"%s\"에 지정한 값이 없습니다"
+msgid "The format of logs to produce: %s"
+msgstr "로그 기록 형식: %s"
 
-#: plugins/sudoers/defaults.c:232
+#: plugins/sudoers/defaults.c:185
 #, c-format
-msgid "%s: no value specified for \"%s\""
-msgstr "%s: \"%s\"에 지정한 값이 없습니다"
+msgid "%s:%d:%d: unknown defaults entry \"%s\""
+msgstr "%s:%d:%d: 알 수 없는 \"%s\" 기본 항목"
 
-#: plugins/sudoers/defaults.c:252
+#: plugins/sudoers/defaults.c:188
 #, c-format
-msgid "%s:%d values for \"%s\" must start with a '/'"
-msgstr "%s:%d \"%s\" 값은 '/' 문자로 시작해야합니다"
+msgid "%s: unknown defaults entry \"%s\""
+msgstr "%s: 알 수 없는 \"%s\" 기본 항목"
 
-#: plugins/sudoers/defaults.c:255
+#: plugins/sudoers/defaults.c:234
 #, c-format
-msgid "%s: values for \"%s\" must start with a '/'"
-msgstr "%s: \"%s\" 값은 '/' 문자로 시작해야합니다"
+msgid "%s:%d:%d: no value specified for \"%s\""
+msgstr "%s:%d:%d \"%s\"에 지정한 값이 없습니다"
+
+#: plugins/sudoers/defaults.c:237
+#, c-format
+msgid "%s: no value specified for \"%s\""
+msgstr "%s: \"%s\"에 지정한 값이 없습니다"
 
-#: plugins/sudoers/defaults.c:277
+#: plugins/sudoers/defaults.c:275
 #, c-format
-msgid "%s:%d option \"%s\" does not take a value"
-msgstr "%s:%d \"%s\" 옵션에 값이 없습니다"
+msgid "%s:%d:%d: option \"%s\" does not take a value"
+msgstr "%s:%d:%d: \"%s\" 옵션에 값이 없습니다"
 
-#: plugins/sudoers/defaults.c:280
+#: plugins/sudoers/defaults.c:278
 #, c-format
 msgid "%s: option \"%s\" does not take a value"
 msgstr "%s: \"%s\" 옵션에 값이 없습니다"
 
-#: plugins/sudoers/defaults.c:305
+#: plugins/sudoers/defaults.c:303
 #, c-format
-msgid "%s:%d invalid Defaults type 0x%x for option \"%s\""
-msgstr "%1$s:%2$d \"%4$s\" 옵션의 잘못된 기본 형식 0x%3$x"
+msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
+msgstr "%1$s:%2$d:%3$d \"%5$s\" 옵션의 잘못된 기본 형식 0x%4$x"
 
-#: plugins/sudoers/defaults.c:308
+#: plugins/sudoers/defaults.c:306
 #, c-format
 msgid "%s: invalid Defaults type 0x%x for option \"%s\""
 msgstr "%1$s: \"%3$s\" 옵션의 잘못된 기본 형식 0x%2$x"
 
-#: plugins/sudoers/defaults.c:318
+#: plugins/sudoers/defaults.c:316
 #, c-format
-msgid "%s:%d value \"%s\" is invalid for option \"%s\""
-msgstr "%s:%d \"%s\" 값은 \"%s\" 옵션에 맞지 않습니다"
+msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
+msgstr "%s:%d:%d: \"%s\" 값은 \"%s\" 옵션에 맞지 않습니다"
 
-#: plugins/sudoers/defaults.c:321
+#: plugins/sudoers/defaults.c:319
 #, c-format
 msgid "%s: value \"%s\" is invalid for option \"%s\""
 msgstr "%s: \"%s\" 값은 \"%s\" 옵션에 맞지 않습니다"
 
-#: plugins/sudoers/env.c:404
+#: plugins/sudoers/defaults.c:1030
+#, c-format
+msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "%s:%d:%d: \"%s\" 값은 '/'; '~'; '*' 문자로 시작해야합니다"
+
+#: plugins/sudoers/defaults.c:1034
+#, c-format
+msgid "%s: values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "%s: \"%s\" 값은 '/'; '~'; '*' 문자로 시작해야합니다"
+
+#: plugins/sudoers/defaults.c:1045
+#, c-format
+msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
+msgstr "%s:%d:%d: \"%s\" 값은 '/' 문자로 시작해야합니다"
+
+#: plugins/sudoers/defaults.c:1049
+#, c-format
+msgid "%s: values for \"%s\" must start with a '/'"
+msgstr "%s: \"%s\" 값은 '/' 문자로 시작해야합니다"
+
+#: plugins/sudoers/env.c:405
 msgid "sudo_putenv: corrupted envp, length mismatch"
 msgstr "sudo_putenv: envp가 깨졌습니다. 길이가 일치하지 않습니다"
 
-#: plugins/sudoers/env.c:1131
+#: plugins/sudoers/env.c:1133
 msgid "unable to rebuild the environment"
 msgstr "환경 구성을 다시 갖출 수 없습니다"
 
-#: plugins/sudoers/env.c:1205
+#: plugins/sudoers/env.c:1207
 #, c-format
 msgid "sorry, you are not allowed to set the following environment variables: %s"
 msgstr "죄송하지만 다음 환경 변수를 설정하도록 허가받지 않았습니다: %s"
 
-#: plugins/sudoers/file.c:104
+#: plugins/sudoers/file.c:107
 #, c-format
 msgid "parse error in %s near line %d"
 msgstr "%s %d번째 줄에서 해석 오류"
 
-#: plugins/sudoers/file.c:107
+#: plugins/sudoers/file.c:110
 #, c-format
 msgid "parse error in %s"
 msgstr "%s 해석 오류"
@@ -1927,7 +2013,7 @@ msgstr "%s은(는) %d uid가 소유해야 합니다"
 msgid "%s must only be writable by owner"
 msgstr "%s은(는) 소유자만 쓸 수 있습니다"
 
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:571
+#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569
 #, c-format
 msgid "unable to load %s: %s"
 msgstr "%s을(를) 불러올 수 없습니다: %s"
@@ -1956,122 +2042,78 @@ msgstr "\"%s\" 네트워크 마스크 주소를 해석할 수 없습니다"
 msgid "Local IP address and netmask pairs:\n"
 msgstr "로컬 IP 주소 및 넷마스크 쌍:\n"
 
-#: plugins/sudoers/iolog.c:142 plugins/sudoers/sudoers.c:393
-#: plugins/sudoers/sudoers.c:394 plugins/sudoers/sudoers.c:1274
-#: plugins/sudoers/testsudoers.c:416
+#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445
+#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410
 #, c-format
 msgid "unknown group: %s"
 msgstr "잘못된 그룹: %s"
 
-#: plugins/sudoers/iolog.c:517 plugins/sudoers/iolog.c:807
-#: plugins/sudoers/iolog.c:959 plugins/sudoers/iolog.c:966
-#: plugins/sudoers/iolog.c:1087 plugins/sudoers/iolog.c:1094
-#: plugins/sudoers/iolog.c:1193 plugins/sudoers/iolog.c:1200
+#: plugins/sudoers/iolog.c:622
+msgid "unable to update sequence file"
+msgstr "시퀀스 파일을 업데이트할 수 없습니다"
+
+#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841
+#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001
+#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129
+#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235
 #, c-format
 msgid "unable to write to I/O log file: %s"
 msgstr "입출력 로그에 기록할 수 없습니다: %s"
 
-#: plugins/sudoers/iolog.c:566
-msgid "unable to update sequence file"
-msgstr "시퀀스 파일을 업데이트할 수 없습니다"
-
-#: plugins/sudoers/iolog.c:605
+#: plugins/sudoers/iolog.c:661
 #, c-format
 msgid "unable to create %s/%s"
 msgstr "%s/%s을(를) 만들 수 없습니다"
 
-#: plugins/sudoers/iolog.c:631
-msgid "unable to connect to log server"
-msgstr "로그 서버에 연결할 수 없습니다"
-
-#: plugins/sudoers/iolog.c:851
+#: plugins/sudoers/iolog.c:886
 #, c-format
 msgid "%s: internal error, I/O log file for event %d not open"
 msgstr "%s: 내부 오류. 이벤트 %d 번의 입출력 로그 파일을 열지 않았습니다"
 
-#: plugins/sudoers/iolog.c:944 plugins/sudoers/iolog.c:1072
-#: plugins/sudoers/iolog.c:1177 plugins/sudoers/timestamp.c:855
-#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:498
+#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107
+#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855
+#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493
+#: plugins/sudoers/visudo.c:499
 msgid "unable to read the clock"
 msgstr "클록을 읽을 수 없습니다"
 
-#: plugins/sudoers/iolog.c:1169 plugins/sudoers/iolog_client.c:977
+#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193
 #, c-format
 msgid "%s: internal error, invalid signal %d"
 msgstr "%s: 내부 오류. 잘못된 시그널 %d번"
 
-#: plugins/sudoers/iolog_client.c:113 plugins/sudoers/iolog_client.c:392
-#: plugins/sudoers/iolog_client.c:1200 plugins/sudoers/iolog_client.c:1775
-msgid "error in event loop"
-msgstr "이벤트 루프 오류"
-
-#: plugins/sudoers/iolog_client.c:194
-#, c-format
-msgid "Creation of new SSL_CTX object failed: %s"
-msgstr "SSL_CTX 객체 만들기 실패: %s"
-
-#: plugins/sudoers/iolog_client.c:346 plugins/sudoers/iolog_client.c:351
-#, c-format
-msgid "TLS connection to %s:%s failed: %s"
-msgstr "%s:%s로의 TLS 연결 실패: %s"
-
-#: plugins/sudoers/iolog_client.c:496
-msgid "TLS initialization was unsuccessful"
-msgstr "TLS 초기화에 실패했습니다"
-
-#: plugins/sudoers/iolog_client.c:505
-msgid "TLS handshake was unsuccessful"
-msgstr "TLS 핸드셰이킹에 실패했습니다"
-
-#: plugins/sudoers/iolog_client.c:767 plugins/sudoers/iolog_client.c:959
-msgid "unable to get time of day"
-msgstr "일시 정보를 가져올 수 없습니다"
-
-#: plugins/sudoers/iolog_client.c:986
-#, c-format
-msgid "%s: internal error, invalid exit status %d"
-msgstr "%s: 내부 오류. 잘못된 시그널 %d"
-
-#: plugins/sudoers/iolog_client.c:1523
-msgid "lost connection to log server"
-msgstr "로그 서버의 연결이 끊어졌습니다"
-
-#: plugins/sudoers/iolog_client.c:1600
-msgid "missing write buffer"
-msgstr "기록 버퍼 빠짐"
-
-#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
 msgid "starttls not supported when using ldaps"
 msgstr "ldaps를 사용할 때 starttls를 지원하지 않습니다"
 
-#: plugins/sudoers/ldap.c:247
+#: plugins/sudoers/ldap.c:248
 #, c-format
 msgid "unable to initialize SSL cert and key db: %s"
 msgstr "SSL 인증서 및 키 DB를 초기화할 수 없습니다: %s"
 
-#: plugins/sudoers/ldap.c:250
+#: plugins/sudoers/ldap.c:251
 #, c-format
 msgid "you must set TLS_CERT in %s to use SSL"
 msgstr "SSL을 사용하려면 %s에서 TLS_CERT를 설정해야 합니다"
 
-#: plugins/sudoers/ldap.c:1658
+#: plugins/sudoers/ldap.c:1660
 #, c-format
 msgid "unable to initialize LDAP: %s"
 msgstr "LDAP를 초기화할 수 없습니다: %s"
 
-#: plugins/sudoers/ldap.c:1694
+#: plugins/sudoers/ldap.c:1697
 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:1831 plugins/sudoers/parse_ldif.c:744
+#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744
 #, c-format
 msgid "invalid sudoOrder attribute: %s"
 msgstr "잘못된 sudoOrder 속성: %s"
 
 #: plugins/sudoers/ldap_conf.c:200
-msgid "sudo_ldap_conf_add_ports: port too large"
-msgstr "sudo_ldap_conf_add_ports: 포트 값이 너무 큽니다"
+#, c-format
+msgid "%s: port too large"
+msgstr "%s: 포트 번호가 너무 큽니다"
 
 #: plugins/sudoers/ldap_conf.c:260
 #, c-format
@@ -2082,7 +2124,7 @@ msgstr "지원하지 않는 LDAP URI 형식: %s"
 msgid "unable to mix ldap and ldaps URIs"
 msgstr "ldap 및 ldaps URI를 함께 사용할 수 없습니다"
 
-#: plugins/sudoers/ldap_util.c:548 plugins/sudoers/ldap_util.c:550
+#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555
 #, c-format
 msgid "unable to convert sudoOption: %s%s%s"
 msgstr "sudoOption을 변환할 수 없습니다: %s%s%s"
@@ -2091,66 +2133,91 @@ msgstr "sudoOption을 변환할 수 없습니다: %s%s%s"
 msgid "unable to open audit system"
 msgstr "감시 시스템을 열 수 없습니다"
 
-#: plugins/sudoers/linux_audit.c:100
+#: plugins/sudoers/linux_audit.c:101
 msgid "unable to send audit message"
 msgstr "감시 메시지를 보낼 수 없습니다"
 
-#: plugins/sudoers/logging.c:167
+#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391
+#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023
+msgid "error in event loop"
+msgstr "이벤트 루프 오류"
+
+#: plugins/sudoers/log_client.c:193
 #, c-format
-msgid "unable to open log file: %s"
-msgstr "로그 파일을 열 수 없습니다: %s"
+msgid "Creation of new SSL_CTX object failed: %s"
+msgstr "SSL_CTX 객체 만들기 실패: %s"
 
-#: plugins/sudoers/logging.c:175
+#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350
 #, c-format
-msgid "unable to lock log file: %s"
-msgstr "로그 파일을 잠글 수 없습니다: %s"
+msgid "TLS connection to %s:%s failed: %s"
+msgstr "%s:%s로의 TLS 연결 실패: %s"
 
-#: plugins/sudoers/logging.c:208
+#: plugins/sudoers/log_client.c:519
+msgid "TLS initialization was unsuccessful"
+msgstr "TLS 초기화에 실패했습니다"
+
+#: plugins/sudoers/log_client.c:528
+msgid "TLS handshake was unsuccessful"
+msgstr "TLS 핸드셰이킹에 실패했습니다"
+
+#: plugins/sudoers/log_client.c:1202
 #, c-format
-msgid "unable to write log file: %s"
-msgstr "로그 파일에 기록할 수 없습니다: %s"
+msgid "%s: internal error, invalid exit status %d"
+msgstr "%s: 내부 오류. 잘못된 시그널 %d"
+
+#: plugins/sudoers/log_client.c:1738
+msgid "lost connection to log server"
+msgstr "로그 서버의 연결이 끊어졌습니다"
+
+#: plugins/sudoers/log_client.c:1815
+msgid "missing write buffer"
+msgstr "기록 버퍼 빠짐"
+
+#: plugins/sudoers/log_client.c:1964
+msgid "unable to connect to log server"
+msgstr "로그 서버에 연결할 수 없습니다"
 
-#: plugins/sudoers/logging.c:241
+#: plugins/sudoers/logging.c:244
 msgid "user NOT in sudoers"
 msgstr "사용자가 sudoers에 없습니다"
 
-#: plugins/sudoers/logging.c:243
+#: plugins/sudoers/logging.c:246
 msgid "user NOT authorized on host"
 msgstr "사용자가 호스트에서 인증하지 않았습니다"
 
-#: plugins/sudoers/logging.c:245
+#: plugins/sudoers/logging.c:248
 msgid "command not allowed"
 msgstr "명령을 허용하지 않았습니다"
 
-#: plugins/sudoers/logging.c:288
+#: plugins/sudoers/logging.c:269
 #, c-format
 msgid "%s is not in the sudoers file.  This incident will be reported.\n"
 msgstr "%s은(는) sudoers 설정 파일에 없습니다.  이 시도를 보고합니다.\n"
 
-#: plugins/sudoers/logging.c:291
+#: plugins/sudoers/logging.c:272
 #, c-format
 msgid "%s is not allowed to run sudo on %s.  This incident will be reported.\n"
 msgstr "%s은(는) %s에서 sudo를 실행하도록 허가받지 않았습니다.  이 시도를 보고합니다.\n"
 
-#: plugins/sudoers/logging.c:295
+#: plugins/sudoers/logging.c:276
 #, c-format
 msgid "Sorry, user %s may not run sudo on %s.\n"
 msgstr "죄송하지만, %s 사용자는 %s에서 sudo를 실행하면 안됩니다.\n"
 
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:279
 #, 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:335 plugins/sudoers/sudoers.c:512
-#: plugins/sudoers/sudoers.c:514 plugins/sudoers/sudoers.c:516
-#: plugins/sudoers/sudoers.c:518 plugins/sudoers/sudoers.c:665
-#: plugins/sudoers/sudoers.c:667
+#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583
+#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587
+#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739
+#: plugins/sudoers/sudoers.c:741
 #, c-format
 msgid "%s: command not found"
 msgstr "%s: 명령이 없습니다"
 
-#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:508
+#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579
 #, c-format
 msgid ""
 "ignoring \"%s\" found in '.'\n"
@@ -2159,46 +2226,36 @@ msgstr ""
 "'.'에 무시 중인 \"%1$s\" 요소가 있습니다.\n"
 "\"%3$s\" 명령을 실행하려면, \"sudo ./%2$s\" 명령을 사용하십시오."
 
-#: plugins/sudoers/logging.c:354
-msgid "authentication failure"
-msgstr "인증 실패"
-
-#: plugins/sudoers/logging.c:380
-msgid "a password is required"
-msgstr "암호가 필요합니다"
-
-#: plugins/sudoers/logging.c:450
+#: plugins/sudoers/logging.c:337
 #, c-format
 msgid "%u incorrect password attempt"
 msgid_plural "%u incorrect password attempts"
 msgstr[0] "잘못된 암호 입력 시도 %u번"
 
-#: plugins/sudoers/logging.c:714
-#, c-format
-msgid "unable to dup stdin: %m"
-msgstr "표준 입력을 복제할 수 없습니다: %m"
+#: plugins/sudoers/logging.c:393
+msgid "authentication failure"
+msgstr "인증 실패"
 
-#: plugins/sudoers/logging.c:751
-#, c-format
-msgid "unable to execute %s: %m"
-msgstr "%s을(를) 실행할 수 없습니다: %m"
+#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453
+msgid "a password is required"
+msgstr "암호가 필요합니다"
 
-#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:848
+#: plugins/sudoers/logging.c:729
 #, c-format
-msgid "unable to fork: %m"
-msgstr "포킹할 수 없습니다: %m"
+msgid "unable to open log file: %s"
+msgstr "로그 파일을 열 수 없습니다: %s"
 
-#: plugins/sudoers/logging.c:838
+#: plugins/sudoers/logging.c:762
 #, c-format
-msgid "unable to open pipe: %m"
-msgstr "파이프를 열 수 없습니다: %m"
+msgid "unable to write log file: %s"
+msgstr "로그 파일에 기록할 수 없습니다: %s"
 
-#: plugins/sudoers/match_digest.c:116
+#: plugins/sudoers/match_digest.c:129
 #, c-format
 msgid "digest for %s (%s) is not in %s form"
 msgstr "%s 다이제스트(%s)는 %s 형식이 아닙니다"
 
-#: plugins/sudoers/parse.c:442
+#: plugins/sudoers/parse.c:518
 #, c-format
 msgid ""
 "\n"
@@ -2207,8 +2264,7 @@ msgstr ""
 "\n"
 "LDAP 역할: %s\n"
 
-#: plugins/sudoers/parse.c:445
-#, c-format
+#: plugins/sudoers/parse.c:521
 msgid ""
 "\n"
 "Sudoers entry:\n"
@@ -2216,42 +2272,38 @@ msgstr ""
 "\n"
 "Sudoers 항목:\n"
 
-#: plugins/sudoers/parse.c:447
-#, c-format
+#: plugins/sudoers/parse.c:523
 msgid "    RunAsUsers: "
 msgstr "    실행 사용자: "
 
-#: plugins/sudoers/parse.c:462
-#, c-format
+#: plugins/sudoers/parse.c:538
 msgid "    RunAsGroups: "
 msgstr "    실행 그룹: "
 
-#: plugins/sudoers/parse.c:472
-#, c-format
+#: plugins/sudoers/parse.c:548
 msgid "    Options: "
 msgstr "    옵션: "
 
-#: plugins/sudoers/parse.c:522
-#, c-format
+#: plugins/sudoers/parse.c:602
 msgid "    Commands:\n"
 msgstr "    명령:\n"
 
-#: plugins/sudoers/parse.c:713
+#: plugins/sudoers/parse.c:793
 #, c-format
 msgid "Matching Defaults entries for %s on %s:\n"
 msgstr "%2$s에서 %1$s에 일치하는 기본 항목:\n"
 
-#: plugins/sudoers/parse.c:731
+#: plugins/sudoers/parse.c:811
 #, c-format
 msgid "Runas and Command-specific defaults for %s:\n"
 msgstr "%s의 실행 권한 및 명령별 기본 값:\n"
 
-#: plugins/sudoers/parse.c:749
+#: plugins/sudoers/parse.c:829
 #, c-format
 msgid "User %s may run the following commands on %s:\n"
 msgstr "%s 사용자는  %s에서 다음 명령을 실행해야 합니다:\n"
 
-#: plugins/sudoers/parse.c:764
+#: plugins/sudoers/parse.c:844
 #, c-format
 msgid "User %s is not allowed to run sudo on %s.\n"
 msgstr "%s 사용자는 %s에서 sudo를 실행하도록 허가받지 않았습니다.\n"
@@ -2266,48 +2318,58 @@ msgstr "미완결 sudoRole 무시: cn: %s"
 msgid "invalid LDIF attribute: %s"
 msgstr "잘못된 LDIF 속성: %s"
 
-#: plugins/sudoers/policy.c:77 plugins/sudoers/policy.c:102
+#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102
 #, c-format
 msgid "invalid %.*s set by sudo front-end"
 msgstr "sudo 프론트엔드의 %.*s 설정이 잘못되었습니다"
 
-#: plugins/sudoers/policy.c:281 plugins/sudoers/testsudoers.c:272
+#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272
 msgid "unable to parse network address list"
 msgstr "네트워크 주소 목록을 해석할 수 없습니다"
 
-#: plugins/sudoers/policy.c:426
+#: plugins/sudoers/policy.c:455
 msgid "user name not set by sudo front-end"
 msgstr "sudo 프론트엔드에서 사용자 이름을 설정하지 않았습니다"
 
-#: plugins/sudoers/policy.c:430
+#: plugins/sudoers/policy.c:459
 msgid "user-ID not set by sudo front-end"
 msgstr "sudo 프론트엔드에서 사용자 ID를 설정하지 않았습니다"
 
-#: plugins/sudoers/policy.c:434
+#: plugins/sudoers/policy.c:463
 msgid "group-ID not set by sudo front-end"
 msgstr "sudo 프론트엔드에서 그룹 ID를 지정하지 않았습니다"
 
-#: plugins/sudoers/policy.c:438
+#: plugins/sudoers/policy.c:467
 msgid "host name not set by sudo front-end"
 msgstr "sudo 프론트엔드에서 호스트 이름을 설정하지 않았습니다"
 
-#: plugins/sudoers/policy.c:896 plugins/sudoers/visudo.c:230
-#: plugins/sudoers/visudo.c:861
+#: plugins/sudoers/policy.c:643
+#, c-format
+msgid "invalid working directory: %s"
+msgstr "잘못된 작업 디렉터리: %s"
+
+#: plugins/sudoers/policy.c:811
+#, c-format
+msgid "invalid chroot directory: %s"
+msgstr "잘못된 루트 변경 디렉터리: %s"
+
+#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231
+#: plugins/sudoers/visudo.c:860
 #, c-format
 msgid "unable to execute %s"
 msgstr "%s을(를) 실행할 수 없습니다"
 
-#: plugins/sudoers/policy.c:1060
+#: plugins/sudoers/policy.c:1111
 #, c-format
 msgid "Sudoers policy plugin version %s\n"
 msgstr "Sudoers 정책 플러그인 버전 %s\n"
 
-#: plugins/sudoers/policy.c:1062
+#: plugins/sudoers/policy.c:1113
 #, c-format
 msgid "Sudoers file grammar version %d\n"
 msgstr "Sudoers 파일 문법 버전 %d\n"
 
-#: plugins/sudoers/policy.c:1066
+#: plugins/sudoers/policy.c:1117
 #, c-format
 msgid ""
 "\n"
@@ -2316,86 +2378,86 @@ msgstr ""
 "\n"
 "Sudoers 경로: %s\n"
 
-#: plugins/sudoers/policy.c:1069
+#: plugins/sudoers/policy.c:1120
 #, c-format
 msgid "nsswitch path: %s\n"
 msgstr "nsswitch 경로: %s\n"
 
-#: plugins/sudoers/policy.c:1071
+#: plugins/sudoers/policy.c:1122
 #, c-format
 msgid "ldap.conf path: %s\n"
 msgstr "ldap.conf 경로: %s\n"
 
-#: plugins/sudoers/policy.c:1072
+#: plugins/sudoers/policy.c:1123
 #, c-format
 msgid "ldap.secret path: %s\n"
 msgstr "ldap.secret 경로: %s\n"
 
-#: plugins/sudoers/policy.c:1105
+#: plugins/sudoers/policy.c:1156
 #, c-format
 msgid "unable to register hook of type %d (version %d.%d)"
 msgstr "%d 형식의 후크를 등록할 수 없습니다(버전 %d.%d)"
 
-#: plugins/sudoers/pwutil.c:214 plugins/sudoers/pwutil.c:232
+#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235
 #, c-format
 msgid "unable to cache uid %u"
 msgstr "%u uid를 캐시에 적재할 수 없습니다"
 
-#: plugins/sudoers/pwutil.c:226
+#: plugins/sudoers/pwutil.c:229
 #, c-format
 msgid "unable to cache uid %u, already exists"
 msgstr "%u uid를 캐시에 적재할 수 없습니다. 이미 존재합니다."
 
-#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:304
-#: plugins/sudoers/pwutil.c:367 plugins/sudoers/pwutil.c:412
+#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307
+#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415
 #, c-format
 msgid "unable to cache user %s"
 msgstr "%s 사용자를 캐시에 적재할 수 없습니다"
 
-#: plugins/sudoers/pwutil.c:299
+#: plugins/sudoers/pwutil.c:302
 #, c-format
 msgid "unable to cache user %s, already exists"
 msgstr "%s 사용자를 캐시에 적재할 수 없습니다. 이미 존재합니다."
 
-#: plugins/sudoers/pwutil.c:531 plugins/sudoers/pwutil.c:549
+#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552
 #, c-format
 msgid "unable to cache gid %u"
 msgstr "%u GID를 캐시에 적재할 수 없습니다"
 
-#: plugins/sudoers/pwutil.c:543
+#: plugins/sudoers/pwutil.c:546
 #, c-format
 msgid "unable to cache gid %u, already exists"
 msgstr "%u gid를 캐시에 적재할 수 없습니다. 이미 존재합니다."
 
-#: plugins/sudoers/pwutil.c:596 plugins/sudoers/pwutil.c:614
-#: plugins/sudoers/pwutil.c:662 plugins/sudoers/pwutil.c:704
+#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617
+#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707
 #, c-format
 msgid "unable to cache group %s"
 msgstr "%s 그룹을 캐시에 적재할 수 없습니다"
 
-#: plugins/sudoers/pwutil.c:609
+#: plugins/sudoers/pwutil.c:612
 #, c-format
 msgid "unable to cache group %s, already exists"
 msgstr "%s 그룹을 캐시에 적재할 수 없습니다. 이미 존재합니다."
 
-#: plugins/sudoers/pwutil.c:831 plugins/sudoers/pwutil.c:883
-#: plugins/sudoers/pwutil.c:933 plugins/sudoers/pwutil.c:986
+#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885
+#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987
 #, c-format
 msgid "unable to cache group list for %s, already exists"
 msgstr "%s 그룹 목록을 캐시에 적재할 수 없습니다. 이미 존재합니다."
 
-#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:888
-#: plugins/sudoers/pwutil.c:939 plugins/sudoers/pwutil.c:991
+#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890
+#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992
 #, c-format
 msgid "unable to cache group list for %s"
 msgstr "%s 그룹 목록을 캐시에 적재할 수 없습니다"
 
-#: plugins/sudoers/pwutil.c:877
+#: plugins/sudoers/pwutil.c:879
 #, c-format
 msgid "unable to parse groups for %s"
 msgstr "%s 그룹을 해석할 수 없습니다"
 
-#: plugins/sudoers/pwutil.c:980
+#: plugins/sudoers/pwutil.c:981
 #, c-format
 msgid "unable to parse gids for %s"
 msgstr "%s 그룹 ID를 해석할 수 없습니다"
@@ -2459,239 +2521,259 @@ msgstr "user_cmnd 감사 경로가 잘렸습니다: %s"
 msgid "truncated audit path argv[0]: %s"
 msgstr "argv[0] 감사 경로가 잘렸습니다: %s"
 
-#: plugins/sudoers/sssd.c:573
+#: plugins/sudoers/sssd.c:572
 msgid "unable to initialize SSS source. Is SSSD installed on your machine?"
 msgstr "SSS 소스를 초기화할 수 없습니다. 머신에 SSSD를 설치했습니까?"
 
-#: plugins/sudoers/sssd.c:581 plugins/sudoers/sssd.c:590
-#: plugins/sudoers/sssd.c:599 plugins/sudoers/sssd.c:608
-#: plugins/sudoers/sssd.c:617
+#: 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
 #, c-format
 msgid "unable to find symbol \"%s\" in %s"
 msgstr "%2$s에서 \"%1$s\" 심볼을 찾을 수 없습니다"
 
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/sudoers.c:943
+#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010
 msgid "problem with defaults entries"
 msgstr "기본 항목에 문제 발생"
 
-#: plugins/sudoers/sudoers.c:221
+#: plugins/sudoers/sudoers.c:218
 msgid "no valid sudoers sources found, quitting"
 msgstr "올바른 sudoers 설정 원본이 없습니다. 나갑니다."
 
-#: plugins/sudoers/sudoers.c:297
+#: plugins/sudoers/sudoers.c:292
+#, c-format
+msgid "user not allowed to change root directory to %s"
+msgstr "%s 를 루트 디렉터리로 변환하도록 허용하지 않습니다"
+
+#: plugins/sudoers/sudoers.c:294
+#, c-format
+msgid "you are not permitted to use the -R option with %s"
+msgstr "-R 옵션과 %s 옵션의 병행 사용을 허가받지 않았습니다"
+
+#: plugins/sudoers/sudoers.c:319
+#, c-format
+msgid "user not allowed to change directory to %s"
+msgstr "%s 디렉터리로의 변경을 허용하지 않습니다"
+
+#: plugins/sudoers/sudoers.c:320
+#, c-format
+msgid "you are not permitted to use the -D option with %s"
+msgstr "-D 옵션과 %s 옵션의 병행 사용을 허가받지 않았습니다"
+
+#: plugins/sudoers/sudoers.c:351
 msgid "sudoers specifies that root is not allowed to sudo"
 msgstr "sudoers에서 root가 sudo를 실행하지 못하게 지정했습니다"
 
-#: plugins/sudoers/sudoers.c:357
+#: plugins/sudoers/sudoers.c:411
 msgid "user not allowed to override closefrom limit"
 msgstr "사용자가 closefrom 제한 값을 따로 적용하도록 허용하지 않았습니다"
 
-#: plugins/sudoers/sudoers.c:358
+#: plugins/sudoers/sudoers.c:412
 msgid "you are not permitted to use the -C option"
 msgstr "-C 옵션 사용을 허가받지 않았습니다"
 
-#: plugins/sudoers/sudoers.c:420
+#: plugins/sudoers/sudoers.c:472
 #, c-format
 msgid "timestamp owner (%s): No such user"
 msgstr "타임스탬프 소유자(%s): 사용자 없음"
 
-#: plugins/sudoers/sudoers.c:435
+#: plugins/sudoers/sudoers.c:487
 msgid "no tty"
 msgstr "tty 없음"
 
-#: plugins/sudoers/sudoers.c:436
+#: plugins/sudoers/sudoers.c:488
 msgid "sorry, you must have a tty to run sudo"
 msgstr "죄송하지만 sudo를 실행하려면 tty를 확보해야합니다"
 
-#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444
+#: plugins/sudoers/sudoers.c:495
 #, c-format
 msgid "invalid shell for user %s: %s"
 msgstr "%s 사용자에게 잘못된 셸 제공: %s"
 
-#: plugins/sudoers/sudoers.c:507
+#: plugins/sudoers/sudoers.c:578
 msgid "command in current directory"
 msgstr "현재 디렉터리의 명령"
 
-#: plugins/sudoers/sudoers.c:525
+#: plugins/sudoers/sudoers.c:597
 msgid "user not allowed to set a command timeout"
 msgstr "사용자가 명령 처리 제한 시간을 설정하도록 허용하지 않았습니다"
 
-#: plugins/sudoers/sudoers.c:526
+#: plugins/sudoers/sudoers.c:599
 msgid "sorry, you are not allowed set a command timeout"
 msgstr "죄송하지만, 명령 처리 제한 시간을 설정할 수 없습니다"
 
-#: plugins/sudoers/sudoers.c:534
+#: plugins/sudoers/sudoers.c:607
 msgid "user not allowed to preserve the environment"
 msgstr "사용자가 환경 설정 값을 유지하도록 허용하지 않았습니다"
 
-#: plugins/sudoers/sudoers.c:535
+#: plugins/sudoers/sudoers.c:609
 msgid "sorry, you are not allowed to preserve the environment"
 msgstr "죄송하지만 이 환경 상태를 유지하도록 허가받지 않았습니다"
 
-#: plugins/sudoers/sudoers.c:878
+#: plugins/sudoers/sudoers.c:945
 msgid "command too long"
 msgstr "명령이 너무 깁니다"
 
-#: plugins/sudoers/sudoers.c:936
+#: plugins/sudoers/sudoers.c:1003
 msgid "sudoedit doesn't need to be run via sudo"
 msgstr "sudoedit는 sudo로 실행할 필요가 없습니다"
 
-#: plugins/sudoers/sudoers.c:990 plugins/sudoers/sudoreplay.c:1548
+#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547
 #: plugins/sudoers/tsdump.c:138
 #, c-format
 msgid "unable to read %s"
 msgstr "%s을(를) 읽을 수 없습니다"
 
-#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/visudo.c:431
-#: plugins/sudoers/visudo.c:727
+#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432
+#: plugins/sudoers/visudo.c:726
 #, c-format
 msgid "unable to stat %s"
 msgstr "%s의 상태를 가져올 수 없습니다"
 
-#: plugins/sudoers/sudoers.c:1019 plugins/sudoers/visudo.c:1037
+#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018
 #, c-format
 msgid "%s is not a regular file"
 msgstr "%s은(는) 일반 파일이 아닙니다"
 
-#: plugins/sudoers/sudoers.c:1023 plugins/sudoers/timestamp.c:252 toke.l:1060
+#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112
 #, c-format
 msgid "%s is owned by uid %u, should be %u"
 msgstr "%s은(는) %u uid가 소유했지만, %u uid가 소유해야합니다"
 
-#: plugins/sudoers/sudoers.c:1027 toke.l:1065
+#: plugins/sudoers/sudoers.c:1094 toke.l:1117
 #, c-format
 msgid "%s is world writable"
 msgstr "%s에 모두가 기록할 수 있습니다"
 
-#: plugins/sudoers/sudoers.c:1031 toke.l:1068
+#: plugins/sudoers/sudoers.c:1098 toke.l:1120
 #, c-format
 msgid "%s is owned by gid %u, should be %u"
 msgstr "%s은(는) %u gid가 소유했지만, %u gid가 소유해야합니다"
 
-#: plugins/sudoers/sudoers.c:1064
+#: plugins/sudoers/sudoers.c:1131
 #, c-format
 msgid "only root can use \"-c %s\""
 msgstr "루트만 \"-c %s\" 옵션을 사용할 수 있습니다"
 
-#: plugins/sudoers/sudoers.c:1083
+#: plugins/sudoers/sudoers.c:1150
 #, c-format
 msgid "unknown login class: %s"
 msgstr "알 수 없는 로그인 클래스: %s"
 
-#: plugins/sudoers/sudoers.c:1168 plugins/sudoers/sudoers.c:1183
+#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250
 #, c-format
 msgid "unable to resolve host %s"
 msgstr "%s 호스트를 해석할 수 없습니다"
 
-#: plugins/sudoers/sudoreplay.c:258
+#: plugins/sudoers/sudoreplay.c:257
 #, c-format
 msgid "invalid filter option: %s"
 msgstr "잘못된 필터 옵션: %s"
 
-#: plugins/sudoers/sudoreplay.c:274
+#: plugins/sudoers/sudoreplay.c:273
 #, c-format
 msgid "invalid max wait: %s"
 msgstr "잘못된 최대 대기 시간 값: %s"
 
-#: plugins/sudoers/sudoreplay.c:297
+#: plugins/sudoers/sudoreplay.c:296
 #, c-format
 msgid "invalid speed factor: %s"
 msgstr "잘못된 속도 인수: %s"
 
-#: plugins/sudoers/sudoreplay.c:333
+#: plugins/sudoers/sudoreplay.c:332
 #, c-format
 msgid "%s/%.2s/%.2s/%.2s: %s"
 msgstr "%s/%.2s/%.2s/%.2s: %s"
 
-#: plugins/sudoers/sudoreplay.c:338
+#: plugins/sudoers/sudoreplay.c:337
 #, c-format
 msgid "%s/timing: %s"
 msgstr "%s/timing: %s"
 
-#: plugins/sudoers/sudoreplay.c:342
+#: plugins/sudoers/sudoreplay.c:341
 #, c-format
 msgid "%s/%s: %s"
 msgstr "%s/%s: %s"
 
-#: plugins/sudoers/sudoreplay.c:366
+#: plugins/sudoers/sudoreplay.c:365
 #, c-format
 msgid "Replaying sudo session: %s"
 msgstr "sudo 세션 재현 중: %s"
 
-#: plugins/sudoers/sudoreplay.c:628
+#: plugins/sudoers/sudoreplay.c:627
 msgid "unable to set tty to raw mode"
 msgstr "RAW 모드로 tty를 설정할 수 없습니다"
 
-#: plugins/sudoers/sudoreplay.c:679
+#: plugins/sudoers/sudoreplay.c:678
 msgid "Warning: your terminal is too small to properly replay the log.\n"
 msgstr "경고: 터미널 화면이 로그를 올바르게 나타내기에 너무 작습니다.\n"
 
-#: plugins/sudoers/sudoreplay.c:680
+#: plugins/sudoers/sudoreplay.c:679
 #, c-format
 msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d."
 msgstr "로그 화면 크기는 %d x %d 이지만, 터미널 화면 크기는 %d x %d 입니다."
 
-#: plugins/sudoers/sudoreplay.c:708
+#: plugins/sudoers/sudoreplay.c:707
 msgid "Replay finished, press any key to restore the terminal."
 msgstr "재현에 끝났습니다. 터미널을 복원하려면 아무 키나 누르십시오."
 
-#: plugins/sudoers/sudoreplay.c:1198 plugins/sudoers/sudoreplay.c:1228
+#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227
 #, c-format
 msgid "ambiguous expression \"%s\""
 msgstr "모호한 식 \"%s\""
 
-#: plugins/sudoers/sudoreplay.c:1250
+#: plugins/sudoers/sudoreplay.c:1249
 msgid "unmatched ')' in expression"
 msgstr "수식에 일치하지 않는 ')'"
 
-#: plugins/sudoers/sudoreplay.c:1254
+#: plugins/sudoers/sudoreplay.c:1253
 #, c-format
 msgid "unknown search term \"%s\""
 msgstr "알 수 없는 검색어 \"%s\""
 
-#: plugins/sudoers/sudoreplay.c:1269
+#: plugins/sudoers/sudoreplay.c:1268
 #, c-format
 msgid "%s requires an argument"
 msgstr "%s에 인자가 필요합니다"
 
-#: plugins/sudoers/sudoreplay.c:1272 plugins/sudoers/sudoreplay.c:1524
+#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523
 #, c-format
 msgid "invalid regular expression: %s"
 msgstr "잘못된 정규 표현식: %s"
 
-#: plugins/sudoers/sudoreplay.c:1277
+#: plugins/sudoers/sudoreplay.c:1276
 #, c-format
 msgid "could not parse date \"%s\""
 msgstr "\"%s\" 날짜를 해석할 수 없습니다"
 
-#: plugins/sudoers/sudoreplay.c:1286
+#: plugins/sudoers/sudoreplay.c:1285
 msgid "unmatched '(' in expression"
 msgstr "수식에 일치하지 않는 '('"
 
-#: plugins/sudoers/sudoreplay.c:1288
+#: plugins/sudoers/sudoreplay.c:1287
 msgid "illegal trailing \"or\""
 msgstr "잘못된 후위 연산자 \"or\""
 
-#: plugins/sudoers/sudoreplay.c:1290
+#: plugins/sudoers/sudoreplay.c:1289
 msgid "illegal trailing \"!\""
 msgstr "잘못된 후위 문자 \"!\""
 
-#: plugins/sudoers/sudoreplay.c:1348
+#: plugins/sudoers/sudoreplay.c:1347
 #, c-format
 msgid "unknown search type %d"
 msgstr "알 수 없는 검색 형식 %d"
 
-#: plugins/sudoers/sudoreplay.c:1615
+#: plugins/sudoers/sudoreplay.c:1614
 #, 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:1618
+#: plugins/sudoers/sudoreplay.c:1617
 #, c-format
 msgid "usage: %s [-h] [-d dir] -l [search expression]\n"
 msgstr "사용법: %s [-h] [-d <디렉터리>] -l [<검색식>]\n"
 
-#: plugins/sudoers/sudoreplay.c:1627
+#: plugins/sudoers/sudoreplay.c:1626
 #, c-format
 msgid ""
 "%s - replay sudo session logs\n"
@@ -2700,7 +2782,7 @@ msgstr ""
 "%s - sudo 세션 로그를 보여줍니다\n"
 "\n"
 
-#: plugins/sudoers/sudoreplay.c:1629
+#: plugins/sudoers/sudoreplay.c:1628
 msgid ""
 "\n"
 "Options:\n"
@@ -2728,11 +2810,11 @@ msgstr ""
 "  -s, --speed=<숫자>      출력 속도를 올리거나 내립니다\n"
 "  -V, --version        버전 정보를 나타낸 후 빠져나갑니다"
 
-#: plugins/sudoers/testsudoers.c:354
+#: plugins/sudoers/testsudoers.c:348
 msgid "\thost  unmatched"
 msgstr "\t호스트가  일치하지 않습니다"
 
-#: plugins/sudoers/testsudoers.c:357
+#: plugins/sudoers/testsudoers.c:351
 msgid ""
 "\n"
 "Command allowed"
@@ -2740,7 +2822,7 @@ msgstr ""
 "\n"
 "명령 허용함"
 
-#: plugins/sudoers/testsudoers.c:358
+#: plugins/sudoers/testsudoers.c:352
 msgid ""
 "\n"
 "Command denied"
@@ -2748,7 +2830,7 @@ msgstr ""
 "\n"
 "명령 거부함"
 
-#: plugins/sudoers/testsudoers.c:358
+#: plugins/sudoers/testsudoers.c:352
 msgid ""
 "\n"
 "Command unmatched"
@@ -2793,89 +2875,89 @@ msgstr "sudoedit에 경로를 지정하면 안됩니다"
 msgid "the -x option will be removed in a future release"
 msgstr "-x 옵션은 추후 릴리스에서 제거 예정입니다"
 
-#: plugins/sudoers/visudo.c:227
+#: plugins/sudoers/visudo.c:228
 msgid "please consider using the cvtsudoers utility instead"
 msgstr "cvtsudoers 유틸리티를 대신 사용해보십시오"
 
-#: plugins/sudoers/visudo.c:278 plugins/sudoers/visudo.c:660
+#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659
 #, c-format
 msgid "press return to edit %s: "
 msgstr "%s을(를) 편집하려면 return 키를 누르십시오:"
 
-#: plugins/sudoers/visudo.c:339
+#: plugins/sudoers/visudo.c:340
 #, c-format
 msgid "specified editor (%s) doesn't exist"
 msgstr "지정 편집기(%s)가 없습니다"
 
-#: plugins/sudoers/visudo.c:341
+#: plugins/sudoers/visudo.c:342
 #, c-format
 msgid "no editor found (editor path = %s)"
 msgstr "편집기가 없습니다(편집기 경로 = %s)"
 
-#: plugins/sudoers/visudo.c:451 plugins/sudoers/visudo.c:459
+#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460
 msgid "write error"
 msgstr "쓰기 오류"
 
-#: plugins/sudoers/visudo.c:505
+#: plugins/sudoers/visudo.c:506
 #, c-format
 msgid "unable to stat temporary file (%s), %s unchanged"
 msgstr "임시 파일 상태를 가져올 수 없습니다(%s). %s을(를) 바꾸지 않았습니다"
 
-#: plugins/sudoers/visudo.c:512
+#: plugins/sudoers/visudo.c:513
 #, c-format
 msgid "zero length temporary file (%s), %s unchanged"
 msgstr "임시 파일 길이가 0입니다(%s). %s을(를) 바꾸지 않았습니다"
 
-#: plugins/sudoers/visudo.c:518
+#: plugins/sudoers/visudo.c:519
 #, c-format
 msgid "editor (%s) failed, %s unchanged"
 msgstr "편집기(%s) 실패. %s을(를) 바꾸지 않았습니다"
 
-#: plugins/sudoers/visudo.c:540
+#: plugins/sudoers/visudo.c:541
 #, c-format
 msgid "%s unchanged"
 msgstr "%s 바꾸지 않음"
 
-#: plugins/sudoers/visudo.c:599
+#: plugins/sudoers/visudo.c:598
 #, c-format
 msgid "unable to re-open temporary file (%s), %s unchanged."
 msgstr "임시 파일(%s)을 다시 열 수 없습니다. %s을(를) 바꾸지 않았습니다."
 
-#: plugins/sudoers/visudo.c:611
+#: plugins/sudoers/visudo.c:610
 #, c-format
 msgid "unable to parse temporary file (%s), unknown error"
 msgstr "임시 파일(%s)을 해석할 수 없습니다. 알 수 없는 오류"
 
-#: plugins/sudoers/visudo.c:649
+#: plugins/sudoers/visudo.c:648
 #, c-format
 msgid "internal error, unable to find %s in list!"
 msgstr "내부 오류. %s을(를) 목록에서 찾을 수 없습니다!"
 
-#: plugins/sudoers/visudo.c:729 plugins/sudoers/visudo.c:738
+#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737
 #, c-format
 msgid "unable to set (uid, gid) of %s to (%u, %u)"
 msgstr "%s의 uid/gid를 %u/%u 값으로 설정할 수 없습니다"
 
-#: plugins/sudoers/visudo.c:761
+#: plugins/sudoers/visudo.c:760
 #, c-format
 msgid "%s and %s not on the same file system, using mv to rename"
 msgstr "%s 및 %s은(는) 동일한 파일 시스템에 없습니다. mv 명령으로 이름을 바꿉니다"
 
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:774
 #, c-format
 msgid "command failed: '%s %s %s', %s unchanged"
 msgstr "명령 실행 실패: '%s %s %s', %s을(를) 바꾸지 않았습니다"
 
-#: plugins/sudoers/visudo.c:785
+#: plugins/sudoers/visudo.c:784
 #, c-format
 msgid "error renaming %s, %s unchanged"
 msgstr "%s 이름 바꾸기 오류. %s을(를) 바꾸지 않았습니다"
 
-#: plugins/sudoers/visudo.c:806
+#: plugins/sudoers/visudo.c:805
 msgid "What now? "
 msgstr "어떻게 하시겠습니까? "
 
-#: plugins/sudoers/visudo.c:820
+#: plugins/sudoers/visudo.c:819
 msgid ""
 "Options are:\n"
 "  (e)dit sudoers file again\n"
@@ -2887,66 +2969,66 @@ msgstr ""
 "  sudoers 파일을 바꾼 상태에서 저장하지 않고 나갑니다(X)\n"
 "  sudoers 파일을 바꾼 상태에서 저장하고 끝냅니다(Q)\n"
 
-#: plugins/sudoers/visudo.c:866
+#: plugins/sudoers/visudo.c:865
 #, c-format
 msgid "unable to run %s"
 msgstr "%s을(를) 실행할 수 없음"
 
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/visudo.c:895
 #, c-format
 msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
 msgstr "%s: 잘못된 소유자 uid/gid를 %u/%u 값으로 설정해야 합니다\n"
 
-#: plugins/sudoers/visudo.c:903
+#: plugins/sudoers/visudo.c:902
 #, c-format
 msgid "%s: bad permissions, should be mode 0%o\n"
 msgstr "%s: 잘못된 권한입니다. 0%o 모드 값을 설정해야 합니다\n"
 
-#: plugins/sudoers/visudo.c:960 plugins/sudoers/visudo.c:967
+#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958
 #, c-format
 msgid "%s: parsed OK\n"
 msgstr "%s: 해석 성공\n"
 
-#: plugins/sudoers/visudo.c:986
+#: plugins/sudoers/visudo.c:977
 #, c-format
 msgid "%s busy, try again later"
 msgstr "%s을(를) 사용중입니다. 나중에 다시 시도하십시오"
 
-#: plugins/sudoers/visudo.c:989
+#: plugins/sudoers/visudo.c:980
 #, c-format
 msgid "unable to lock %s"
 msgstr "%s을(를) 잠글 수 없습니다"
 
-#: plugins/sudoers/visudo.c:990
+#: plugins/sudoers/visudo.c:981
 msgid "Edit anyway? [y/N]"
 msgstr "그래도 편집하시겠습니까? [y/N]"
 
-#: plugins/sudoers/visudo.c:1083
+#: plugins/sudoers/visudo.c:1091
 #, c-format
-msgid "Error: %s:%d cycle in %s \"%s\""
-msgstr "오류: %3$s \"%4$s\"의 %1$s:%2$d사이클"
+msgid "Error: %s:%d:%d: cycle in %s \"%s\""
+msgstr "오류: %4$s \"%5$s\"의 %1$s:%2$d:%3$d: 사이클"
 
-#: plugins/sudoers/visudo.c:1084
+#: plugins/sudoers/visudo.c:1092
 #, c-format
-msgid "Warning: %s:%d cycle in %s \"%s\""
-msgstr "경고: %3$s \"%4$s\"의 %1$s:%2$d사이클"
+msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
+msgstr "경고: %4$s \"%5$s\"의 %1$s:%2$d:%3$d: 사이클"
 
-#: plugins/sudoers/visudo.c:1088
+#: plugins/sudoers/visudo.c:1096
 #, c-format
-msgid "Error: %s:%d %s \"%s\" referenced but not defined"
-msgstr "오류: %s: %d %s \"%s\"을(를) 참조했지만 정의하지 않았습니다"
+msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
+msgstr "오류: %s:%d:%d: %s \"%s\"을(를) 참조했지만 정의하지 않았습니다"
 
-#: plugins/sudoers/visudo.c:1089
+#: plugins/sudoers/visudo.c:1097
 #, c-format
-msgid "Warning: %s:%d %s \"%s\" referenced but not defined"
-msgstr "경고: %s: %d %s \"%s\"을(를) 참조했지만 정의하지 않았습니다"
+msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
+msgstr "경고: %s:%d:%d: %s \"%s\"을(를) 참조했지만 정의하지 않았습니다"
 
-#: plugins/sudoers/visudo.c:1180
+#: plugins/sudoers/visudo.c:1188
 #, c-format
-msgid "Warning: %s:%d unused %s \"%s\""
-msgstr "경고: %s:%d 사용하지 않는 %s \"%s\"이(가) 있습니다"
+msgid "Warning: %s:%d:%d: unused %s \"%s\""
+msgstr "경고: %s:%d:%d 사용하지 않는 %s \"%s\"이(가) 있습니다"
 
-#: plugins/sudoers/visudo.c:1295
+#: plugins/sudoers/visudo.c:1303
 #, c-format
 msgid ""
 "%s - safely edit the sudoers file\n"
@@ -2955,7 +3037,7 @@ msgstr ""
 "%s - sudoers 파일을 안전하게 편집합니다\n"
 "\n"
 
-#: plugins/sudoers/visudo.c:1297
+#: plugins/sudoers/visudo.c:1305
 msgid ""
 "\n"
 "Options:\n"
@@ -2975,10 +3057,43 @@ msgstr ""
 "  -s, --strict             엄격한 문법 검사 시행\n"
 "  -V, --version            버전 정보를 나타낸 후 빠져나갑니다\n"
 
-#: toke.l:1032
+#: toke.l:179
+msgid "empty string"
+msgstr "빈 문자열"
+
+#: toke.l:189 toke.l:491
+msgid "empty group"
+msgstr "빈 그룹"
+
+#: toke.l:197 toke.l:489
+msgid "empty netgroup"
+msgstr "빈 네트워크 그룹"
+
+#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392
+msgid "invalid line continuation"
+msgstr "잘못된 행 연속 문자"
+
+#: toke.l:528 toke.l:540
+msgid "invalid IPv6 address"
+msgstr "잘못된 IPv6 주소"
+
+#: toke.l:764
+msgid "unexpected line break in string"
+msgstr "예기치 않은 개행 문자 발견"
+
+#: toke.l:1084
 msgid "too many levels of includes"
 msgstr "포함 레벨이 너무 많습니다"
 
+#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library"
+#~ msgstr "sudo_noexec 라이브러리에 있는 모조 exec 함수 미리 불러오기"
+
+#~ msgid "sudo_ldap_conf_add_ports: port too large"
+#~ msgstr "sudo_ldap_conf_add_ports: 포트 값이 너무 큽니다"
+
+#~ msgid "unable to lock log file: %s"
+#~ msgstr "로그 파일을 잠글 수 없습니다: %s"
+
 #~ msgid "No user or host"
 #~ msgstr "사용자 또는 호스트 없음"
 
index 38e4ac3..a9252ed 100644 (file)
Binary files a/plugins/sudoers/po/sr.mo and b/plugins/sudoers/po/sr.mo differ
index dc8edff..5701644 100644 (file)
@@ -3,10 +3,10 @@
 # Мирослав Николић <miroslavnikolic@rocketmail.com>, 2014—2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: sudoers-1.9.2rc1\n"
+"Project-Id-Version: sudoers-1.9.4b1\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-06-24 05:35-0600\n"
-"PO-Revision-Date: 2020-08-04 12:24+0200\n"
+"POT-Creation-Date: 2020-11-14 06:24-0700\n"
+"PO-Revision-Date: 2020-12-11 08:03+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <(nothing)>\n"
 "Language: sr\n"
@@ -14,10 +14,9 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Virtaal 0.7.1\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: confstr.sh:1
+#: confstr.sh:1 gram.y:1077
 msgid "syntax error"
 msgstr "грешка синтаксе"
 
@@ -41,70 +40,73 @@ msgstr "*** информације БЕЗБЕДНОСТИ за %h ***"
 msgid "Sorry, try again."
 msgstr "Извините, покушајте поново."
 
-#: gram.y:203 gram.y:251 gram.y:258 gram.y:265 gram.y:272 gram.y:279
-#: gram.y:295 gram.y:319 gram.y:326 gram.y:333 gram.y:340 gram.y:347
-#: gram.y:410 gram.y:419 gram.y:430 gram.y:463 gram.y:470 gram.y:477
-#: gram.y:484 gram.y:511 gram.y:583 gram.y:590 gram.y:599 gram.y:608
-#: gram.y:625 gram.y:737 gram.y:744 gram.y:752 gram.y:758 gram.y:858
-#: gram.y:865 gram.y:872 gram.y:879 gram.y:886 gram.y:912 gram.y:919
-#: gram.y:926 gram.y:1068 gram.y:1347 lib/iolog/iolog_fileio.c:1101
-#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:283
-#: lib/iolog/iolog_json.c:313 lib/iolog/iolog_json.c:435
-#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115
-#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133
-#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196
-#: logsrvd/eventlog.c:223 logsrvd/sendlog.c:443 plugins/sudoers/alias.c:125
-#: plugins/sudoers/alias.c:132 plugins/sudoers/alias.c:148
-#: plugins/sudoers/audit.c:108 plugins/sudoers/audit.c:212
-#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118
-#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/cvtsudoers.c:120 plugins/sudoers/cvtsudoers.c:161
-#: plugins/sudoers/cvtsudoers.c:178 plugins/sudoers/cvtsudoers.c:189
-#: plugins/sudoers/cvtsudoers.c:301 plugins/sudoers/cvtsudoers.c:429
-#: plugins/sudoers/cvtsudoers.c:562 plugins/sudoers/cvtsudoers.c:579
-#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/cvtsudoers.c:757
-#: plugins/sudoers/cvtsudoers.c:765 plugins/sudoers/cvtsudoers.c:1179
-#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285
-#: 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:426 plugins/sudoers/cvtsudoers_ldif.c:434
-#: plugins/sudoers/cvtsudoers_ldif.c:451 plugins/sudoers/cvtsudoers_ldif.c:460
-#: plugins/sudoers/cvtsudoers_ldif.c:607 plugins/sudoers/defaults.c:626
-#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84
-#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261
+#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314
+#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386
+#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524
+#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679
+#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971
+#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032
+#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280
+#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062
+#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120
+#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335
+#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480
+#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134
+#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143
+#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144
+#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 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:641
+#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764
+#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182
+#: plugins/sudoers/cvtsudoers.c:1284 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:630 plugins/sudoers/defaults.c:923
+#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181
+#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92
 #: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
 #: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483
-#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:382
-#: plugins/sudoers/iolog_client.c:559 plugins/sudoers/iolog_client.c:678
-#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176
-#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723
-#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183
-#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431
-#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743
-#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279
-#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743
-#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959
-#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076
+#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596
+#: plugins/sudoers/iolog.c:613 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:598 plugins/sudoers/linux_audit.c:83
-#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545
-#: plugins/sudoers/logging.c:586 plugins/sudoers/logging.c:723
-#: plugins/sudoers/logging.c:1083 plugins/sudoers/match_command.c:243
-#: plugins/sudoers/match_command.c:391 plugins/sudoers/match_command.c:438
-#: plugins/sudoers/match_command.c:509 plugins/sudoers/match_digest.c:80
-#: plugins/sudoers/parse.c:193 plugins/sudoers/parse.c:205
-#: plugins/sudoers/parse.c:220 plugins/sudoers/parse.c:232
+#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84
+#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381
+#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:281
+#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499
+#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93
+#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213
+#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244
+#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275
 #: 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
@@ -114,115 +116,138 @@ msgstr "Извините, покушајте поново."
 #: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624
 #: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707
 #: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752
-#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:491
-#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262
-#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514
-#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649
-#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967
-#: plugins/sudoers/sssd.c:146 plugins/sudoers/sssd.c:409
-#: plugins/sudoers/sssd.c:472 plugins/sudoers/sssd.c:516
-#: plugins/sudoers/sssd.c:563 plugins/sudoers/sssd.c:755
-#: plugins/sudoers/stubs.c:96 plugins/sudoers/stubs.c:104
-#: plugins/sudoers/sudoers.c:316 plugins/sudoers/sudoers.c:327
-#: plugins/sudoers/sudoers.c:337 plugins/sudoers/sudoers.c:380
-#: plugins/sudoers/sudoers.c:720 plugins/sudoers/sudoers.c:849
-#: plugins/sudoers/sudoers.c:894 plugins/sudoers/sudoers.c:1198
-#: plugins/sudoers/sudoreplay.c:553 plugins/sudoers/sudoreplay.c:556
-#: plugins/sudoers/sudoreplay.c:1260 plugins/sudoers/sudoreplay.c:1470
-#: plugins/sudoers/sudoreplay.c:1474 plugins/sudoers/testsudoers.c:128
+#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
+#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
+#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
+#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
+#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
+#: 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/stubs.c:110 plugins/sudoers/stubs.c:118
+#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326
+#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381
+#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433
+#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927
+#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265
+#: 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:128
 #: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/testsudoers.c:581 plugins/sudoers/timestamp.c:432
+#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432
 #: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986
 #: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104
 #: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:146
-#: plugins/sudoers/visudo.c:322 plugins/sudoers/visudo.c:328
-#: plugins/sudoers/visudo.c:438 plugins/sudoers/visudo.c:616
-#: plugins/sudoers/visudo.c:936 plugins/sudoers/visudo.c:1024
-#: plugins/sudoers/visudo.c:1121 toke.l:864 toke.l:981 toke.l:1039
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
+#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329
+#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615
+#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008
+#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091
 msgid "unable to allocate memory"
 msgstr "не могу да доделим меморију"
 
-#: gram.y:505
+#: gram.y:552
 msgid "a digest requires a path name"
 msgstr "зборник захтева назив путање"
 
-#: gram.y:638
+#: gram.y:581
+msgid "values for \"CWD\" must start with a '/', '~', or '*'"
+msgstr "вредност за „CWD“ мора почети са /, ~, или *"
+
+#: gram.y:593
+msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
+msgstr "вредност за „CHROOT“ мора почети са /, ~, или *"
+
+#: gram.y:715
+#, c-format
+msgid "syntax error, reserved word %s used as an alias name"
+msgstr "грешка синтаксе, резервисана реч „%s“ је коришћена као назив алијаса"
+
+#: gram.y:735
 msgid "invalid notbefore value"
 msgstr "неисправна вредност не-пре"
 
-#: gram.y:646
+#: gram.y:743
 msgid "invalid notafter value"
 msgstr "неисправна вредност не-после"
 
-#: gram.y:655 plugins/sudoers/policy.c:306
+#: gram.y:752 plugins/sudoers/policy.c:335
 msgid "timeout value too large"
 msgstr "вредност временског истека је превелика"
 
-#: gram.y:657 plugins/sudoers/policy.c:308
+#: gram.y:754 plugins/sudoers/policy.c:337
 msgid "invalid timeout value"
 msgstr "неисправна вредност временског ограничења"
 
-#: gram.y:1347 lib/iolog/iolog_fileio.c:1101 lib/iolog/iolog_json.c:120
-#: lib/iolog/iolog_json.c:282 lib/iolog/iolog_json.c:313
-#: lib/iolog/iolog_json.c:435 lib/iolog/iolog_json.c:713
-#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115
-#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133
-#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196
-#: logsrvd/eventlog.c:223 logsrvd/logsrvd.c:1208 logsrvd/logsrvd.c:1221
-#: logsrvd/logsrvd.c:1266 logsrvd/sendlog.c:443 logsrvd/sendlog.c:1302
-#: logsrvd/sendlog.c:1309 logsrvd/sendlog.c:1727 plugins/sudoers/audit.c:108
-#: plugins/sudoers/audit.c:212 plugins/sudoers/auth/pam.c:482
+#: gram.y:1079
+#, c-format
+msgid "%s:%d:%d: %s\n"
+msgstr "%s:%d:%d: %s\n"
+
+#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816
+#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998
+#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304
+#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457
+#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321
+#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482
 #: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
-#: plugins/sudoers/cvtsudoers.c:120 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:642 plugins/sudoers/cvtsudoers.c:757
-#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1179
-#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285
+#: 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:641 plugins/sudoers/cvtsudoers.c:756
+#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178
+#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284
 #: 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:425 plugins/sudoers/cvtsudoers_ldif.c:433
-#: plugins/sudoers/cvtsudoers_ldif.c:450 plugins/sudoers/cvtsudoers_ldif.c:459
-#: plugins/sudoers/cvtsudoers_ldif.c:606 plugins/sudoers/defaults.c:626
-#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84
-#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261
-#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:132
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483
-#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:215
-#: plugins/sudoers/iolog_client.c:236 plugins/sudoers/iolog_client.c:249
-#: plugins/sudoers/iolog_client.c:382 plugins/sudoers/iolog_client.c:678
-#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176
-#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723
-#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183
-#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431
-#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743
-#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279
-#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743
-#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959
-#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076
-#: 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:598 plugins/sudoers/linux_audit.c:83
-#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545
-#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1083
-#: plugins/sudoers/match_command.c:242 plugins/sudoers/match_command.c:390
-#: plugins/sudoers/match_command.c:437 plugins/sudoers/match_command.c:509
-#: plugins/sudoers/match_digest.c:80 plugins/sudoers/parse.c:192
-#: plugins/sudoers/parse.c:204 plugins/sudoers/parse.c:219
-#: plugins/sudoers/parse.c:231 plugins/sudoers/parse_ldif.c:152
+#: 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:630
+#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098
+#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261
+#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
+#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56
+#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72
+#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613
+#: 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:603
+#: plugins/sudoers/linux_audit.c:84 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:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:280 plugins/sudoers/match_command.c:448
+#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198
+#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:274 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
@@ -232,60 +257,112 @@ msgstr "неисправна вредност временског ограни
 #: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648
 #: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723
 #: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758
-#: plugins/sudoers/policy.c:120 plugins/sudoers/policy.c:129
-#: plugins/sudoers/policy.c:138 plugins/sudoers/policy.c:164
-#: plugins/sudoers/policy.c:291 plugins/sudoers/policy.c:306
-#: plugins/sudoers/policy.c:308 plugins/sudoers/policy.c:337
-#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:389
-#: plugins/sudoers/policy.c:399 plugins/sudoers/policy.c:408
-#: plugins/sudoers/policy.c:417 plugins/sudoers/policy.c:491
-#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262
-#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514
-#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649
-#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967
+#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148
+#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183
+#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335
+#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366
+#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418
+#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437
+#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
+#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
+#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
+#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
+#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
 #: 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:145
-#: plugins/sudoers/sssd.c:409 plugins/sudoers/sssd.c:472
-#: plugins/sudoers/sssd.c:516 plugins/sudoers/sssd.c:563
-#: plugins/sudoers/sssd.c:755 plugins/sudoers/stubs.c:96
-#: plugins/sudoers/stubs.c:104 plugins/sudoers/sudoers.c:316
-#: plugins/sudoers/sudoers.c:327 plugins/sudoers/sudoers.c:337
-#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:720
-#: plugins/sudoers/sudoers.c:849 plugins/sudoers/sudoers.c:894
-#: plugins/sudoers/sudoers.c:1198 plugins/sudoers/sudoreplay.c:553
-#: plugins/sudoers/sudoreplay.c:556 plugins/sudoers/sudoreplay.c:1260
-#: plugins/sudoers/sudoreplay.c:1470 plugins/sudoers/sudoreplay.c:1474
+#: 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/stubs.c:110
+#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300
+#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370
+#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391
+#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794
+#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961
+#: plugins/sudoers/sudoers.c:1265 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:128 plugins/sudoers/testsudoers.c:228
-#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:581
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587
 #: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476
 #: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51
 #: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128
 #: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:146 plugins/sudoers/visudo.c:322
-#: plugins/sudoers/visudo.c:328 plugins/sudoers/visudo.c:438
-#: plugins/sudoers/visudo.c:616 plugins/sudoers/visudo.c:936
-#: plugins/sudoers/visudo.c:1024 plugins/sudoers/visudo.c:1121 toke.l:864
-#: toke.l:981 toke.l:1039
+#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323
+#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439
+#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935
+#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913
+#: toke.l:1033 toke.l:1091
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: lib/iolog/iolog_fileio.c:157
+#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463
+#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468
+#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244
+#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571
+#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
+#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618
+#: 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:90
+#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711
+#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161
+#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249
+#: plugins/sudoers/toke_util.c:169
+#, c-format
+msgid "internal error, %s overflow"
+msgstr "унутрашња грешка, прекорачење „%s“"
+
+#: lib/eventlog/eventlog.c:343
+#, c-format
+msgid "unable to dup stdin: %m"
+msgstr "не могу да удвостручим стандардни улаз: %m"
+
+#: lib/eventlog/eventlog.c:388
+#, c-format
+msgid "unable to execute %s: %m"
+msgstr "не могу да извршим „%s“: %m"
+
+#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198
+msgid "unable to fork"
+msgstr "не могу да исцепим"
+
+#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490
+#, c-format
+msgid "unable to fork: %m"
+msgstr "не могу да исцепим: %m"
+
+#: lib/eventlog/eventlog.c:480
+#, c-format
+msgid "unable to open pipe: %m"
+msgstr "не могу да отворим спојку: %m"
+
+#: lib/eventlog/eventlog.c:894
+#, c-format
+msgid "%8s : %s"
+msgstr "%8s : %s"
+
+#: lib/eventlog/eventlog.c:923
+#, c-format
+msgid "%8s : (command continued) %s"
+msgstr "%8s : (наредба је настављена) %s"
+
+#: lib/iolog/iolog_fileio.c:155
 #, c-format
 msgid "%s exists but is not a directory (0%o)"
 msgstr "%s постоји али није директоријум (0%o)"
 
-#: lib/iolog/iolog_fileio.c:187 lib/iolog/iolog_fileio.c:233
+#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231
 #: plugins/sudoers/timestamp.c:205
 #, c-format
 msgid "unable to mkdir %s"
 msgstr "не могу да направим директоријум „%s“"
 
-#: lib/iolog/iolog_fileio.c:237 plugins/sudoers/visudo.c:733
-#: plugins/sudoers/visudo.c:744
+#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732
+#: plugins/sudoers/visudo.c:743
 #, c-format
 msgid "unable to change mode of %s to 0%o"
 msgstr "не могу да променим режим „%s“ на 0%o"
@@ -295,63 +372,45 @@ msgstr "не могу да променим режим „%s“ на 0%o"
 msgid "expected JSON_STRING, got %d"
 msgstr "очекивах „JSON_STRING“, добих „%d“"
 
-#: lib/iolog/iolog_json.c:305
+#: lib/iolog/iolog_json.c:327
 msgid "missing double quote in name"
 msgstr "недостају наводници у називу"
 
-#: lib/iolog/iolog_json.c:392
+#: lib/iolog/iolog_json.c:414
 #, c-format
 msgid "expected JSON_OBJECT, got %d"
 msgstr "очекивах „JSON_OBJECT“, добих „%d“"
 
-#: lib/iolog/iolog_json.c:441 lib/iolog/iolog_json.c:444
-#: lib/iolog/iolog_json.c:446 lib/iolog/iolog_json.c:538
-#: logsrvd/eventlog.c:228 plugins/sudoers/cvtsudoers_ldif.c:244
-#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:563
-#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
-#: plugins/sudoers/env.c:435 plugins/sudoers/iolog.c:561
-#: plugins/sudoers/iolog.c:577 plugins/sudoers/ldap.c:516
-#: plugins/sudoers/ldap.c:747 plugins/sudoers/ldap.c:1080
-#: plugins/sudoers/ldap_conf.c:222 plugins/sudoers/ldap_conf.c:312
-#: plugins/sudoers/linux_audit.c:89 plugins/sudoers/logging.c:1088
-#: plugins/sudoers/policy.c:521 plugins/sudoers/policy.c:668
-#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:161
-#: plugins/sudoers/sudoers.c:916 plugins/sudoers/testsudoers.c:249
-#: plugins/sudoers/toke_util.c:169
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "унутрашња грешка, прекорачење „%s“"
-
-#: lib/iolog/iolog_json.c:607 lib/iolog/iolog_json.c:731
+#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753
 msgid "unmatched close brace"
 msgstr "непоклопљена затворена велика заграда"
 
-#: lib/iolog/iolog_json.c:616
+#: lib/iolog/iolog_json.c:638
 msgid "unexpected array"
 msgstr "неочекиван низ"
 
-#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:733
+#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755
 msgid "unmatched close bracket"
 msgstr "непоклопљена затворена средња заграда"
 
-#: lib/iolog/iolog_json.c:637
+#: lib/iolog/iolog_json.c:659
 msgid "unexpected string"
 msgstr "неочекивана ниска"
 
-#: lib/iolog/iolog_json.c:647
+#: lib/iolog/iolog_json.c:669
 msgid "missing colon after name"
 msgstr "недостају две тачке након имена"
 
-#: lib/iolog/iolog_json.c:658 lib/iolog/iolog_json.c:673
-#: lib/iolog/iolog_json.c:688
+#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695
+#: lib/iolog/iolog_json.c:710
 msgid "unexpected boolean"
 msgstr "неочекивана логичка вредност"
 
-#: lib/iolog/iolog_json.c:704
+#: lib/iolog/iolog_json.c:726
 msgid "unexpected number"
 msgstr "неочекивани број"
 
-#: lib/iolog/iolog_json.c:741
+#: lib/iolog/iolog_json.c:763
 #, c-format
 msgid "%s:%u unable to parse \"%s\""
 msgstr "„%s:%u“ не могу да обрадим „%s“"
@@ -396,186 +455,184 @@ msgstr "грешка читања датотеке временисања: %s"
 msgid "invalid timing file line: %s"
 msgstr "неисправан ред датотеке временисања: %s"
 
-#: logsrvd/eventlog.c:430 plugins/sudoers/logging.c:112
-#, c-format
-msgid "%8s : %s"
-msgstr "%8s : %s"
-
-#: logsrvd/eventlog.c:459 plugins/sudoers/logging.c:136
-#, c-format
-msgid "%8s : (command continued) %s"
-msgstr "%8s : (наредба је настављена) %s"
-
-#: logsrvd/iolog_writer.c:936
+#: logsrvd/iolog_writer.c:919
 msgid "log is already complete, cannot be restarted"
 msgstr "дневик је већ довршен, не може бити поново покренут"
 
-#: logsrvd/iolog_writer.c:967
+#: logsrvd/iolog_writer.c:950
 msgid "unable to restart log"
 msgstr "не могу поново да покренем дневник"
 
-#: logsrvd/logsrv_util.c:98 logsrvd/logsrv_util.c:105
-#: plugins/sudoers/sudoreplay.c:353 plugins/sudoers/sudoreplay.c:359
+#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106
+#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358
 #, c-format
 msgid "unable to open %s/%s"
 msgstr "не могу да отворим „%s/%s“"
 
-#: logsrvd/logsrv_util.c:132
+#: logsrvd/logsrv_util.c:133
 #, c-format
 msgid "missing I/O log file %s/%s"
 msgstr "недостаје У/И датотека дневника „%s/%s“"
 
-#: logsrvd/logsrv_util.c:139
+#: logsrvd/logsrv_util.c:140
 #, c-format
 msgid "%s/%s: unable to seek forward %zu"
 msgstr "%s/%s: не могу да премотам унапред „%zu“"
 
-#: logsrvd/logsrv_util.c:149
+#: logsrvd/logsrv_util.c:150
 #, c-format
 msgid "unable to find resume point [%lld, %ld] in %s/%s"
 msgstr "не могу да нађем тачку наставка [%lld, %ld] у „%s/%s“"
 
-#: logsrvd/logsrvd.c:230 logsrvd/logsrvd.c:299 logsrvd/logsrvd.c:343
-#: logsrvd/logsrvd.c:398 logsrvd/logsrvd.c:445 logsrvd/logsrvd.c:496
-#: logsrvd/logsrvd.c:528 logsrvd/logsrvd.c:560
+#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394
+#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568
+#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632
 msgid "state machine error"
 msgstr "грешка машине стања"
 
-#: logsrvd/logsrvd.c:239
+#: logsrvd/logsrvd.c:299
 msgid "invalid AcceptMessage"
 msgstr "неисправна „Порука прихвата“"
 
-#: logsrvd/logsrvd.c:250
+#: logsrvd/logsrvd.c:307
 msgid "error parsing AcceptMessage"
 msgstr "грешка обраде „Поруке прихвата“"
 
-#: logsrvd/logsrvd.c:257
+#: logsrvd/logsrvd.c:314
 msgid "error creating I/O log"
 msgstr "грешка стварања У/И дневника"
 
-#: logsrvd/logsrvd.c:265
+#: logsrvd/logsrvd.c:321
 msgid "error logging accept event"
 msgstr "грешка прибележавања догађаја прихвата"
 
-#: logsrvd/logsrvd.c:308
+#: logsrvd/logsrvd.c:362
 msgid "invalid RejectMessage"
 msgstr "неисправна „Порука одбијања“"
 
-#: logsrvd/logsrvd.c:319
+#: logsrvd/logsrvd.c:370
 msgid "error parsing RejectMessage"
 msgstr "грешка обраде „Поруке одбијања“"
 
-#: logsrvd/logsrvd.c:325
+#: logsrvd/logsrvd.c:376
 msgid "error logging reject event"
 msgstr "грешка прибележавања догађаја одбијања"
 
-#: logsrvd/logsrvd.c:430
+#: logsrvd/logsrvd.c:486
+msgid "invalid AlertMessage"
+msgstr "неисправна „Порука узбуне“"
+
+#: logsrvd/logsrvd.c:494
+msgid "error parsing AlertMessage"
+msgstr "грешка обраде „Поруке узбуне“"
+
+#: logsrvd/logsrvd.c:502
 msgid "error logging alert event"
 msgstr "грешка прибележавања догађаја упозорења"
 
-#: logsrvd/logsrvd.c:451 logsrvd/logsrvd.c:502 logsrvd/logsrvd.c:534
+#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606
 msgid "protocol error"
 msgstr "грешка протокола"
 
-#: logsrvd/logsrvd.c:461
+#: logsrvd/logsrvd.c:533
 msgid "error writing IoBuffer"
 msgstr "Грешка писања „Уи_Међумеморије“"
 
-#: logsrvd/logsrvd.c:513
+#: logsrvd/logsrvd.c:585
 msgid "error writing ChangeWindowSize"
 msgstr "грешка писања „Промени_величину_прозора“"
 
-#: logsrvd/logsrvd.c:545
+#: logsrvd/logsrvd.c:617
 msgid "error writing CommandSuspend"
 msgstr "грешка писања „Обуставе_наредбе“"
 
-#: logsrvd/logsrvd.c:630
+#: logsrvd/logsrvd.c:702
 msgid "unrecognized ClientMessage type"
 msgstr "непозната врста „Поруке_клијента“"
 
-#: logsrvd/logsrvd.c:895
+#: logsrvd/logsrvd.c:967
 msgid "client message too large"
 msgstr "порука клијента је превелика"
 
-#: logsrvd/logsrvd.c:1125 logsrvd/logsrvd.c:1133
+#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205
 #, c-format
 msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
 msgstr "не могу да подесим шифрарник ТЛС-а 1.2 на „%s“: %s"
 
-#: logsrvd/logsrvd.c:1153 logsrvd/logsrvd.c:1161
+#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233
 #, c-format
 msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
 msgstr "не могу да подесим шифрарник ТЛС-а 1.3 на „%s“: %s"
 
-#: logsrvd/logsrvd.c:1197
+#: logsrvd/logsrvd.c:1269
 #, c-format
 msgid "unable to get TLS server method: %s"
 msgstr "не могу да добавим метод ТЛС сервера: %s"
 
-#: logsrvd/logsrvd.c:1202
+#: logsrvd/logsrvd.c:1274
 #, c-format
 msgid "unable to create TLS context: %s"
 msgstr "Не могу да створим ТЛС контекст: %s"
 
-#: logsrvd/logsrvd.c:1209 plugins/sudoers/iolog_client.c:237
+#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236
 #, c-format
 msgid "unable to load certificate %s"
 msgstr "не могу да учитам уверење „%s“"
 
-#: logsrvd/logsrvd.c:1222 plugins/sudoers/iolog_client.c:217
+#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216
 #, c-format
 msgid "unable to load certificate authority bundle %s"
 msgstr "не могу да учитам комплет ауторитета уверења „%s“"
 
-#: logsrvd/logsrvd.c:1267 plugins/sudoers/iolog_client.c:250
+#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249
 #, c-format
 msgid "unable to load private key %s"
 msgstr "не могу да учитам лични кључ „%s“"
 
-#: logsrvd/logsrvd.c:1284 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365
 #, c-format
 msgid "unable to set diffie-hellman parameters: %s"
 msgstr "не могу да подесим „diffie-hellman“ параметре: %s"
 
-#: logsrvd/logsrvd.c:1306
+#: logsrvd/logsrvd.c:1378
 #, c-format
 msgid "unable to set minimum protocol version to TLS 1.2: %s"
 msgstr "не могу да подесим најмање издање протокола на „TLS 1.2“: %s"
 
-#: logsrvd/logsrvd.c:1491
+#: logsrvd/logsrvd.c:1563
 msgid "unable to get remote IP addr"
 msgstr "не могу да добавим удаљену ИП адресу"
 
-#: logsrvd/logsrvd.c:1519 plugins/sudoers/iolog_client.c:264
+#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263
 #, c-format
 msgid "Unable to attach user data to the ssl object: %s"
 msgstr "Не могу да прикачим податке корисника ссл објекту: %s"
 
-#: logsrvd/logsrvd.c:1527 logsrvd/logsrvd.c:1649 logsrvd/logsrvd.c:1749
-#: logsrvd/sendlog.c:1106 logsrvd/sendlog.c:1462 logsrvd/sendlog.c:1477
-#: logsrvd/sendlog.c:1535 plugins/sudoers/iolog.c:921
-#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1152
-#: plugins/sudoers/iolog_client.c:109 plugins/sudoers/iolog_client.c:325
-#: plugins/sudoers/iolog_client.c:341 plugins/sudoers/iolog_client.c:387
-#: plugins/sudoers/iolog_client.c:567 plugins/sudoers/iolog_client.c:574
-#: plugins/sudoers/iolog_client.c:1150 plugins/sudoers/iolog_client.c:1186
-#: plugins/sudoers/iolog_client.c:1194 plugins/sudoers/iolog_client.c:1254
-#: plugins/sudoers/iolog_client.c:1361 plugins/sudoers/iolog_client.c:1477
-#: plugins/sudoers/iolog_client.c:1759 plugins/sudoers/iolog_client.c:1767
-#: plugins/sudoers/sudoreplay.c:513 plugins/sudoers/sudoreplay.c:560
-#: plugins/sudoers/sudoreplay.c:792 plugins/sudoers/sudoreplay.c:904
-#: plugins/sudoers/sudoreplay.c:994 plugins/sudoers/sudoreplay.c:1009
-#: plugins/sudoers/sudoreplay.c:1016 plugins/sudoers/sudoreplay.c:1023
-#: plugins/sudoers/sudoreplay.c:1030 plugins/sudoers/sudoreplay.c:1037
-#: plugins/sudoers/sudoreplay.c:1164
+#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823
+#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496
+#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956
+#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187
+#: 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:587 plugins/sudoers/log_client.c:594
+#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376
+#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425
+#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692
+#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015
+#: 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 "не могу да додам догађај у ред"
 
-#: logsrvd/logsrvd.c:1703 logsrvd/logsrvd.c:1937
+#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011
 msgid "unable setup listen socket"
 msgstr "не могу да подесим прикључницу ослушкивања"
 
-#: logsrvd/logsrvd.c:1843 logsrvd/sendlog.c:123
+#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124
 #, c-format
 msgid ""
 "%s - send sudo I/O log to remote server\n"
@@ -584,7 +641,7 @@ msgstr ""
 "%s – шаље У/И дневник судоа удаљеном серверу\n"
 "\n"
 
-#: logsrvd/logsrvd.c:1846
+#: logsrvd/logsrvd.c:1920
 msgid ""
 "\n"
 "Options:\n"
@@ -602,78 +659,78 @@ msgstr ""
 "  -R, --random-drop        процентуалне шансе везе ће одбацити\n"
 "  -V, --version            приказује податке о издању и излази\n"
 
-#: logsrvd/logsrvd.c:1898 logsrvd/sendlog.c:1700
+#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719
 msgid "Protobuf-C version 1.3 or higher required"
 msgstr "Потребно је „Protobuf-C“ издање 1.3 или новије"
 
-#: logsrvd/logsrvd.c:1916
+#: logsrvd/logsrvd.c:1990
 #, c-format
 msgid "invalid random drop value: %s"
 msgstr "неисправна вредност одбацивања насумичности: %s"
 
-#: logsrvd/logsrvd.c:1920 logsrvd/sendlog.c:1750
-#: plugins/sudoers/cvtsudoers.c:229 plugins/sudoers/sudoreplay.c:300
-#: plugins/sudoers/visudo.c:178
+#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769
+#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299
+#: plugins/sudoers/visudo.c:177
 #, c-format
 msgid "%s version %s\n"
 msgstr "%s издање %s\n"
 
-#: logsrvd/logsrvd_conf.c:393
+#: logsrvd/logsrvd_conf.c:331
 msgid "TLS not supported"
 msgstr "ТЛС није подржано"
 
-#: logsrvd/logsrvd_conf.c:405
+#: logsrvd/logsrvd_conf.c:343
 #, c-format
 msgid "%s:%s"
 msgstr "%s:%s"
 
-#: logsrvd/logsrvd_conf.c:471 logsrvd/logsrvd_conf.c:715
+#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653
 #, c-format
 msgid "%s: not a fully qualified path"
 msgstr "%s: није потпуно квалификована путања"
 
-#: logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:767
 #, c-format
 msgid "%s:%d unmatched '[': %s"
 msgstr "„%s:%d“ непоклопљена [: %s"
 
-#: logsrvd/logsrvd_conf.c:840
+#: logsrvd/logsrvd_conf.c:778
 #, c-format
 msgid "%s:%d invalid config section: %s"
 msgstr "„%s:%d“ неисправан одељак подешавања: %s"
 
-#: logsrvd/logsrvd_conf.c:848
+#: logsrvd/logsrvd_conf.c:786
 #, c-format
 msgid "%s:%d invalid configuration line: %s"
 msgstr "„%s:%d“ неисправан ред подешавања: %s"
 
-#: logsrvd/logsrvd_conf.c:854
+#: logsrvd/logsrvd_conf.c:792
 #, c-format
 msgid "%s:%d expected section name: %s"
 msgstr "„%s:%d“ очекиван је назив одељка: %s"
 
-#: logsrvd/logsrvd_conf.c:868
+#: logsrvd/logsrvd_conf.c:806
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "неисправна вредност за „%s“: %s"
 
-#: logsrvd/logsrvd_conf.c:876
+#: logsrvd/logsrvd_conf.c:814
 #, c-format
 msgid "%s:%d unknown key: %s"
 msgstr "„%s:%d“ непознат кључ: %s"
 
-#: logsrvd/logsrvd_conf.c:1032
+#: logsrvd/logsrvd_conf.c:1003
 #, c-format
 msgid "unknown syslog facility %s"
 msgstr "непознато постројење системског дневика „%s“"
 
-#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1040
-#: logsrvd/logsrvd_conf.c:1044
+#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011
+#: logsrvd/logsrvd_conf.c:1015
 #, c-format
 msgid "unknown syslog priority %s"
 msgstr "непознат приоритет системског дневика „%s“"
 
-#: logsrvd/sendlog.c:126
+#: logsrvd/sendlog.c:127
 msgid ""
 "\n"
 "Options:\n"
@@ -707,145 +764,148 @@ msgstr ""
 "  -t, --test               проверава сервер испитивања шаљући изабрани У/И дневник n пута у паралели\n"
 "  -V, --version            приказује податке о издању и излази\n"
 
-#: logsrvd/sendlog.c:163 plugins/sudoers/iolog_client.c:433
+#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432
 #, c-format
 msgid "unable to look up %s:%s: %s"
 msgstr "не могу да потражим „%s:%s“: %s"
 
-#: logsrvd/sendlog.c:186
+#: logsrvd/sendlog.c:202
 msgid "unable to get server IP addr"
 msgstr "не могу да добавим ИП адресу сервера"
 
-#: logsrvd/sendlog.c:240 plugins/sudoers/sudoreplay.c:852
+#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851
 #, c-format
 msgid "unable to read %s/%s: %s"
 msgstr "не могу да прочитам „%s/%s“: %s"
 
-#: logsrvd/sendlog.c:261 plugins/sudoers/iolog_client.c:684
+#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694
 #, c-format
 msgid "client message too large: %zu"
 msgstr "порука клијента је превелика: %zu"
 
-#: logsrvd/sendlog.c:791
+#: logsrvd/sendlog.c:810
 #, c-format
 msgid "%s: write buffer already in use"
 msgstr "%s: међумеморија писања је већ у употреби"
 
-#: logsrvd/sendlog.c:843 plugins/sudoers/iolog.c:845
-#: plugins/sudoers/iolog.c:914
+#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880
+#: plugins/sudoers/iolog.c:949
 #, c-format
 msgid "unexpected I/O event %d"
 msgstr "неочекивани У/И догађај „%d“"
 
-#: logsrvd/sendlog.c:889 logsrvd/sendlog.c:906 logsrvd/sendlog.c:940
-#: plugins/sudoers/iolog_client.c:1155 plugins/sudoers/iolog_client.c:1225
-#: plugins/sudoers/iolog_client.c:1273
+#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386
+#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490
 #, c-format
 msgid "%s: unexpected state %d"
 msgstr "%s: неочекивано стање „%d“"
 
-#: logsrvd/sendlog.c:912 plugins/sudoers/iolog_client.c:1231
+#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460
 msgid "invalid ServerHello"
 msgstr "неисправан „Поздрав_сервера“"
 
-#: logsrvd/sendlog.c:976 plugins/sudoers/iolog_client.c:1317
+#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534
 #, c-format
 msgid "error message received from server: %s"
 msgstr "порука грешке је примљена са сервера: %s"
 
-#: logsrvd/sendlog.c:989 plugins/sudoers/iolog_client.c:1330
+#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547
 #, c-format
 msgid "abort message received from server: %s"
 msgstr "порука прекида је примљена са сервера: %s"
 
-#: logsrvd/sendlog.c:1008 plugins/sudoers/iolog_client.c:1349
+#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566
 msgid "unable to unpack ServerMessage"
 msgstr "не могу да отпакујем „Поруку_сервера“"
 
-#: logsrvd/sendlog.c:1048 plugins/sudoers/iolog_client.c:1382
+#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597
 #, c-format
 msgid "%s: unexpected type_case value %d"
 msgstr "%s: неочекивана вредност врсте_слова „%d“"
 
-#: logsrvd/sendlog.c:1077
+#: logsrvd/sendlog.c:1096
 msgid "timeout reading from server"
 msgstr "истекло је време читања са сервера"
 
-#: logsrvd/sendlog.c:1155
+#: logsrvd/sendlog.c:1174
 msgid "premature EOF"
 msgstr "прерани крај датотеке"
 
-#: logsrvd/sendlog.c:1168 plugins/sudoers/iolog_client.c:1536
+#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751
 #, c-format
 msgid "server message too large: %u"
 msgstr "порука сервера је превелика: %u"
 
-#: logsrvd/sendlog.c:1219
+#: logsrvd/sendlog.c:1238
 msgid "timeout writing to server"
 msgstr "истекло је време писања на сервер"
 
-#: logsrvd/sendlog.c:1438 plugins/sudoers/iolog_client.c:297
+#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296
 msgid "TLS handshake timeout occurred"
 msgstr "дошло је до временског истека ТЛС руковања"
 
-#: logsrvd/sendlog.c:1457 logsrvd/sendlog.c:1472
-#: plugins/sudoers/iolog_client.c:319 plugins/sudoers/iolog_client.c:335
+#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491
+#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334
 msgid "unable to set event"
 msgstr "не могу да подесим догађај"
 
-#: logsrvd/sendlog.c:1482 logsrvd/sendlog.c:1486
+#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505
 #, c-format
 msgid "TLS connection failed: %s"
 msgstr "ТЛС веза није успела: %s"
 
-#: logsrvd/sendlog.c:1519
+#: logsrvd/sendlog.c:1538
 #, c-format
 msgid "Unable to initialize ssl context: %s"
 msgstr "Не могу да покренем ссл контекст: %s"
 
-#: logsrvd/sendlog.c:1524 plugins/sudoers/iolog_client.c:259
+#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258
 #, c-format
 msgid "Unable to allocate ssl object: %s"
 msgstr "Не могу да доделим ссл објекат: %s"
 
-#: logsrvd/sendlog.c:1529
+#: logsrvd/sendlog.c:1548
 #, c-format
 msgid "Unable to attach socket to the ssl object: %s"
 msgstr "Не могу да прикачим прикључницу ссл објекту: %s"
 
-#: logsrvd/sendlog.c:1773
+#: logsrvd/sendlog.c:1792
 msgid "both restart point and iolog ID must be specified"
 msgstr "мора бити наведена и тачка поновног покретања и ИБ уи_дневника"
 
-#: logsrvd/sendlog.c:1777
+#: logsrvd/sendlog.c:1796
 msgid "a restart point may not be set when no I/O is sent"
 msgstr "тачка поновног покретања се не може подесити када није послат У/И"
 
-#: logsrvd/sendlog.c:1852
+#: logsrvd/sendlog.c:1871
 #, c-format
 msgid "exited prematurely with state %d"
 msgstr "изађох прерано са стањем „%d“"
 
-#: logsrvd/sendlog.c:1853
+#: logsrvd/sendlog.c:1872
 #, c-format
 msgid "elapsed time sent to server [%lld, %ld]"
 msgstr "протекло време послато серверу [%lld, %ld]"
 
-#: logsrvd/sendlog.c:1855
+#: logsrvd/sendlog.c:1874
 #, c-format
 msgid "commit point received from server [%lld, %ld]"
 msgstr "тачка слања примљена са сервера [%lld, %ld]"
 
-#: plugins/sudoers/alias.c:144
+#: plugins/sudoers/alias.c:148
 #, c-format
 msgid "Alias \"%s\" already defined"
 msgstr "Псеудоним „%s“ је већ одређен"
 
-#: plugins/sudoers/auth/aix_auth.c:198 plugins/sudoers/logging.c:784
-msgid "unable to fork"
-msgstr "не могу да исцепим"
+#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343
+#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002
+#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114
+msgid "unable to get time of day"
+msgstr "не могу да добавим време дана"
 
-#: plugins/sudoers/auth/aix_auth.c:278
+#: plugins/sudoers/auth/aix_auth.c:277
 #, c-format
 msgid "unable to change password for %s"
 msgstr "не могу да изменим лозинку за „%s“"
@@ -867,11 +927,11 @@ msgstr "неисправна врста потврђивање идентите
 msgid "unable to initialize BSD authentication"
 msgstr "не могу да покренем БСД потврђивање идентитета"
 
-#: plugins/sudoers/auth/bsdauth.c:180
+#: plugins/sudoers/auth/bsdauth.c:179
 msgid "your account has expired"
 msgstr "ваш налог је истекао"
 
-#: plugins/sudoers/auth/bsdauth.c:182
+#: plugins/sudoers/auth/bsdauth.c:181
 msgid "approval failed"
 msgstr "доказивање није успело"
 
@@ -978,7 +1038,7 @@ msgstr "Налог је истекао или ПАМ подешавањима н
 msgid "PAM account management error: %s"
 msgstr "грешка управљања ПАМ налогом: %s"
 
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:242
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243
 #, c-format
 msgid "you do not exist in the %s database"
 msgstr "ви не постојите у бази подтака „%s“"
@@ -1007,7 +1067,7 @@ msgstr "неисправна ручка потврђивања идентите
 msgid "SecurID communication failed"
 msgstr "Није успело комуницирање безбедног ИБ-а"
 
-#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:212
+#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210
 msgid "unknown SecurID error"
 msgstr "непозната грешка безбедног ИБ-а"
 
@@ -1015,7 +1075,7 @@ msgstr "непозната грешка безбедног ИБ-а"
 msgid "invalid passcode length for SecurID"
 msgstr "неисправна дужина пропусне шифре за безбедни ИБ"
 
-#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:124
+#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123
 msgid "unable to initialize SIA session"
 msgstr "не могу да покренем СИА сесију"
 
@@ -1039,7 +1099,7 @@ msgstr "Нема начина потврђивања идентитета пре
 msgid "Unable to initialize authentication methods."
 msgstr "Не могу да покренем методе потврђивања идентитета."
 
-#: plugins/sudoers/auth/sudo_auth.c:473
+#: plugins/sudoers/auth/sudo_auth.c:471
 msgid "Authentication methods:"
 msgstr "Начини потврђивања идентитета:"
 
@@ -1072,117 +1132,117 @@ msgstr ""
 "\n"
 
 #: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311
-#: plugins/sudoers/sudoers.c:763 plugins/sudoers/sudoers.c:811
+#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858
 #: plugins/sudoers/tsdump.c:119
 #, c-format
 msgid "unknown uid: %u"
 msgstr "непознат јиб: %u"
 
-#: plugins/sudoers/check.c:306 plugins/sudoers/iolog.c:117
-#: plugins/sudoers/policy.c:1037 plugins/sudoers/sudoers.c:387
-#: plugins/sudoers/sudoers.c:388 plugins/sudoers/sudoers.c:1240
-#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:392
+#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85
+#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088
+#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307
+#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386
 #, c-format
 msgid "unknown user: %s"
 msgstr "непознат корисник: %s"
 
-#: plugins/sudoers/cvtsudoers.c:195
+#: plugins/sudoers/cvtsudoers.c:194
 #, c-format
 msgid "order increment: %s: %s"
 msgstr "повећање поретка: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:211
+#: plugins/sudoers/cvtsudoers.c:210
 #, c-format
 msgid "starting order: %s: %s"
 msgstr "поредак почетка: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:221
+#: plugins/sudoers/cvtsudoers.c:220
 #, c-format
 msgid "order padding: %s: %s"
 msgstr "попуњавање поретка: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:231 plugins/sudoers/visudo.c:180
+#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179
 #, c-format
 msgid "%s grammar version %d\n"
 msgstr "%s граматика издање %d\n"
 
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/testsudoers.c:167
+#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167
 #, c-format
 msgid "unsupported input format %s"
 msgstr "неподржан запис улаза „%s“"
 
-#: plugins/sudoers/cvtsudoers.c:263
+#: plugins/sudoers/cvtsudoers.c:262
 #, c-format
 msgid "unsupported output format %s"
 msgstr "неподржан запис излаза „%s“"
 
-#: plugins/sudoers/cvtsudoers.c:315
+#: plugins/sudoers/cvtsudoers.c:314
 #, c-format
 msgid "%s: input and output files must be different"
 msgstr "%s: улазна датотека треба да се разликује од излазне"
 
-#: plugins/sudoers/cvtsudoers.c:331 plugins/sudoers/sudoers.c:181
-#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:248
-#: plugins/sudoers/visudo.c:604 plugins/sudoers/visudo.c:927
+#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178
+#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926
 msgid "unable to initialize sudoers default values"
 msgstr "не могу да покренем основне вредности судоерса"
 
-#: plugins/sudoers/cvtsudoers.c:417 plugins/sudoers/ldap_conf.c:431
+#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431
 #, c-format
 msgid "%s: %s: %s: %s"
 msgstr "%s: %s: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:476
+#: plugins/sudoers/cvtsudoers.c:475
 #, c-format
 msgid "%s: unknown key word: %s"
 msgstr "%s: непозната реч кључа: %s"
 
-#: plugins/sudoers/cvtsudoers.c:522
+#: plugins/sudoers/cvtsudoers.c:521
 #, c-format
 msgid "invalid defaults type: %s"
 msgstr "неисправна врста основности: %s"
 
-#: plugins/sudoers/cvtsudoers.c:545
+#: plugins/sudoers/cvtsudoers.c:544
 #, c-format
 msgid "invalid suppression type: %s"
 msgstr "неисправна врста потискивања: %s"
 
-#: plugins/sudoers/cvtsudoers.c:585 plugins/sudoers/cvtsudoers.c:599
+#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598
 #, c-format
 msgid "invalid filter: %s"
 msgstr "неисправан филтер: %s"
 
-#: plugins/sudoers/cvtsudoers.c:618 plugins/sudoers/cvtsudoers.c:635
-#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:861
-#: plugins/sudoers/cvtsudoers_ldif.c:680 plugins/sudoers/sudoers.c:986
-#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/timestamp.c:441
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:923
+#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634
+#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872
+#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441
+#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922
 #, c-format
 msgid "unable to open %s"
 msgstr "не могу да отворим „%s“"
 
-#: plugins/sudoers/cvtsudoers.c:638 plugins/sudoers/visudo.c:932
+#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931
 #, c-format
 msgid "failed to parse %s file, unknown error"
 msgstr "нисам успео да обрадим %s датотеку, непозната грешка"
 
-#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/visudo.c:949
+#: plugins/sudoers/cvtsudoers.c:645
 #, c-format
 msgid "parse error in %s near line %d\n"
 msgstr "грешка обраде у %s близу реда %d\n"
 
-#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:952
+#: plugins/sudoers/cvtsudoers.c:648
 #, c-format
 msgid "parse error in %s\n"
 msgstr "грешка обраде у %s\n"
 
-#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/sudoreplay.c:1125
+#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124
 #: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328
 #, c-format
 msgid "unable to write to %s"
 msgstr "не могу да пишем у „%s“"
 
-#: plugins/sudoers/cvtsudoers.c:1315
+#: plugins/sudoers/cvtsudoers.c:1314
 #, c-format
 msgid ""
 "%s - convert between sudoers file formats\n"
@@ -1191,7 +1251,7 @@ msgstr ""
 "%s – претвара међусобно записе датотеке судоерса\n"
 "\n"
 
-#: plugins/sudoers/cvtsudoers.c:1317
+#: plugins/sudoers/cvtsudoers.c:1316
 msgid ""
 "\n"
 "Options:\n"
@@ -1232,675 +1292,700 @@ msgstr ""
 "  -V, --version              приказује податке о издању и излази"
 
 #: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514
-#: plugins/sudoers/cvtsudoers_json.c:702
+#: plugins/sudoers/cvtsudoers_json.c:713
 #, c-format
 msgid "unknown defaults entry \"%s\""
 msgstr "непознат унос основности „%s“"
 
-#: plugins/sudoers/cvtsudoers_json.c:640 plugins/sudoers/cvtsudoers_json.c:653
-#: plugins/sudoers/cvtsudoers_ldif.c:345 plugins/sudoers/cvtsudoers_ldif.c:356
-#: plugins/sudoers/ldap.c:502
+#: 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
 msgid "unable to get GMT time"
 msgstr "не могу да добавим ГМТ време"
 
-#: plugins/sudoers/cvtsudoers_json.c:643 plugins/sudoers/cvtsudoers_json.c:656
-#: plugins/sudoers/cvtsudoers_ldif.c:348 plugins/sudoers/cvtsudoers_ldif.c:359
-#: plugins/sudoers/ldap.c:508
+#: 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
 msgid "unable to format timestamp"
 msgstr "не могу да обликујем временску ознаку"
 
-#: plugins/sudoers/cvtsudoers_ldif.c:632
+#: plugins/sudoers/cvtsudoers_ldif.c:640
 #, c-format
 msgid "too many sudoers entries, maximum %u"
 msgstr "превише уноса судоерса, највише %u"
 
-#: plugins/sudoers/cvtsudoers_ldif.c:675
+#: plugins/sudoers/cvtsudoers_ldif.c:683
 msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified."
 msgstr "променљива „SUDOERS_BASE“ окружења није постављена и „-b“ опција није наведена."
 
-#: plugins/sudoers/def_data.c:42
+#: plugins/sudoers/def_data.c:50
 #, c-format
 msgid "Syslog facility if syslog is being used for logging: %s"
 msgstr "Помоћник сисдневника ако је сисдневник коришћен за пријављивање: %s"
 
-#: plugins/sudoers/def_data.c:46
+#: plugins/sudoers/def_data.c:54
 #, c-format
 msgid "Syslog priority to use when user authenticates successfully: %s"
 msgstr "Приоритет системског дневника за коришћење када корисник успешно потврди идентитет: %s"
 
-#: plugins/sudoers/def_data.c:50
+#: plugins/sudoers/def_data.c:58
 #, c-format
 msgid "Syslog priority to use when user authenticates unsuccessfully: %s"
 msgstr "Приоритет системског дневника за коришћење када корисник неуспешно потврди идентитет: %s"
 
-#: plugins/sudoers/def_data.c:54
+#: plugins/sudoers/def_data.c:62
 msgid "Put OTP prompt on its own line"
 msgstr "Поставља ОТП упит на свом реду"
 
-#: plugins/sudoers/def_data.c:58
+#: plugins/sudoers/def_data.c:66
 msgid "Ignore '.' in $PATH"
 msgstr "Занемарује . у $ПУТАЊИ"
 
-#: plugins/sudoers/def_data.c:62
+#: plugins/sudoers/def_data.c:70
 msgid "Always send mail when sudo is run"
 msgstr "Увек шаље пошту када је судо покренут"
 
-#: plugins/sudoers/def_data.c:66
+#: plugins/sudoers/def_data.c:74
 msgid "Send mail if user authentication fails"
 msgstr "Пошаљи поруку ако потврђивање идентитета корисника не успе"
 
-#: plugins/sudoers/def_data.c:70
+#: plugins/sudoers/def_data.c:78
 msgid "Send mail if the user is not in sudoers"
 msgstr "Пошаљи поруку ако корисник није у судоерсу"
 
-#: plugins/sudoers/def_data.c:74
+#: plugins/sudoers/def_data.c:82
 msgid "Send mail if the user is not in sudoers for this host"
 msgstr "Пошаљи поруку ако корисник није у судоерсу за овог домаћина"
 
-#: plugins/sudoers/def_data.c:78
+#: plugins/sudoers/def_data.c:86
 msgid "Send mail if the user is not allowed to run a command"
 msgstr "Пошаљи поруку ако кориснику није дозвољено да покрене наредбу"
 
-#: plugins/sudoers/def_data.c:82
+#: plugins/sudoers/def_data.c:90
 msgid "Send mail if the user tries to run a command"
 msgstr "Пошаљи поруку ако корисник покуша да покрене наредбу"
 
-#: plugins/sudoers/def_data.c:86
+#: plugins/sudoers/def_data.c:94
 msgid "Use a separate timestamp for each user/tty combo"
 msgstr "Користи одвојене временске ознаке за сваку комбинацију корисник/конзола"
 
-#: plugins/sudoers/def_data.c:90
+#: plugins/sudoers/def_data.c:98
 msgid "Lecture user the first time they run sudo"
 msgstr "Подучава корисника када први пут покрену судо"
 
-#: plugins/sudoers/def_data.c:94
+#: plugins/sudoers/def_data.c:102
 #, c-format
 msgid "File containing the sudo lecture: %s"
 msgstr "Датотека садржи судо обучавања: %s"
 
-#: plugins/sudoers/def_data.c:98
+#: plugins/sudoers/def_data.c:106
 msgid "Require users to authenticate by default"
 msgstr "Захтева да корисници потврде идентитет по основи"
 
-#: plugins/sudoers/def_data.c:102
+#: plugins/sudoers/def_data.c:110
 msgid "Root may run sudo"
 msgstr "Администратор може да покрене судо"
 
-#: plugins/sudoers/def_data.c:106
+#: plugins/sudoers/def_data.c:114
 msgid "Log the hostname in the (non-syslog) log file"
 msgstr "Бележи назив домаћина у (не-сисдневник) датотеци дневника"
 
-#: plugins/sudoers/def_data.c:110
+#: plugins/sudoers/def_data.c:118
 msgid "Log the year in the (non-syslog) log file"
 msgstr "Бележи годину у (не-сисдневник) датотеци дневника"
 
-#: plugins/sudoers/def_data.c:114
+#: plugins/sudoers/def_data.c:122
 msgid "If sudo is invoked with no arguments, start a shell"
 msgstr "Ако је судо призван без аргумената, покреће шкољку"
 
-#: plugins/sudoers/def_data.c:118
+#: plugins/sudoers/def_data.c:126
 msgid "Set $HOME to the target user when starting a shell with -s"
 msgstr "Подешава $HOME на крајњег корисника када покреће шкољку са „-s“"
 
-#: plugins/sudoers/def_data.c:122
+#: plugins/sudoers/def_data.c:130
 msgid "Always set $HOME to the target user's home directory"
 msgstr "Увек подешава $HOME на циљни лични директоријум корисника"
 
-#: plugins/sudoers/def_data.c:126
+#: plugins/sudoers/def_data.c:134
 msgid "Allow some information gathering to give useful error messages"
 msgstr "Дозвољава прикупљање неких података да би дао корисне поруке грешака"
 
-#: plugins/sudoers/def_data.c:130
+#: plugins/sudoers/def_data.c:138
 msgid "Require fully-qualified hostnames in the sudoers file"
 msgstr "Захтева потпуно одређене називе домаћина у датотеци судоерса"
 
-#: plugins/sudoers/def_data.c:134
+#: plugins/sudoers/def_data.c:142
 msgid "Insult the user when they enter an incorrect password"
 msgstr "Вређа корисника када унесе нетачну лозинку"
 
-#: plugins/sudoers/def_data.c:138
+#: plugins/sudoers/def_data.c:146
 msgid "Only allow the user to run sudo if they have a tty"
 msgstr "Дозвољава кориснику да покрене судо само ако има конзолу"
 
-#: plugins/sudoers/def_data.c:142
+#: plugins/sudoers/def_data.c:150
 msgid "Visudo will honor the EDITOR environment variable"
 msgstr "Висудо ће поштовати променљиву окружења УРЕЂИВАЧА"
 
-#: plugins/sudoers/def_data.c:146
+#: plugins/sudoers/def_data.c:154
 msgid "Prompt for root's password, not the users's"
 msgstr "Тражи администраторову лозинку, а не корисника"
 
-#: plugins/sudoers/def_data.c:150
+#: plugins/sudoers/def_data.c:158
 msgid "Prompt for the runas_default user's password, not the users's"
 msgstr "Тражи корисникову лозинку покреникао_основни, а не корисника"
 
-#: plugins/sudoers/def_data.c:154
+#: plugins/sudoers/def_data.c:162
 msgid "Prompt for the target user's password, not the users's"
 msgstr "Тражи корисникову лозинку мете, а не корисника"
 
-#: plugins/sudoers/def_data.c:158
+#: plugins/sudoers/def_data.c:166
 msgid "Apply defaults in the target user's login class if there is one"
 msgstr "Примењује основности у циљни кориснички разред пријављивања ако постоји"
 
-#: plugins/sudoers/def_data.c:162
+#: plugins/sudoers/def_data.c:170
 msgid "Set the LOGNAME and USER environment variables"
 msgstr "Подешава променљиве окружења НАЗИВДНЕВНИКА и КОРИСНИК"
 
-#: plugins/sudoers/def_data.c:166
+#: plugins/sudoers/def_data.c:174
 msgid "Only set the effective uid to the target user, not the real uid"
 msgstr "Подешава само ефективни јиб на крајњег корисника, а не стваран јиб"
 
-#: plugins/sudoers/def_data.c:170
+#: plugins/sudoers/def_data.c:178
 msgid "Don't initialize the group vector to that of the target user"
 msgstr "Не покреће вектор групе ка оном крајњег корисника"
 
-#: plugins/sudoers/def_data.c:174
+#: plugins/sudoers/def_data.c:182
 #, c-format
 msgid "Length at which to wrap log file lines (0 for no wrap): %u"
 msgstr "Дужина за преламање редова у датотеци дневника (0 — без преламања): %u"
 
-#: plugins/sudoers/def_data.c:178
+#: plugins/sudoers/def_data.c:186
 #, c-format
 msgid "Authentication timestamp timeout: %.1f minutes"
 msgstr "Време истека временске ознаке потврђивања идентитета: %.1f минута"
 
-#: plugins/sudoers/def_data.c:182
+#: plugins/sudoers/def_data.c:190
 #, c-format
 msgid "Password prompt timeout: %.1f minutes"
 msgstr "Време истека упита лозинке: %.1f минута"
 
-#: plugins/sudoers/def_data.c:186
+#: plugins/sudoers/def_data.c:194
 #, c-format
 msgid "Number of tries to enter a password: %u"
 msgstr "Број покушаја за уношење лозинке: %u"
 
-#: plugins/sudoers/def_data.c:190
+#: plugins/sudoers/def_data.c:198
 #, c-format
 msgid "Umask to use or 0777 to use user's: 0%o"
 msgstr "Умаска за коришћење или 0777 за коришћење корисника: 0%o"
 
-#: plugins/sudoers/def_data.c:194
+#: plugins/sudoers/def_data.c:202
 #, c-format
 msgid "Path to log file: %s"
 msgstr "Путања до датотеке дневника: %s"
 
-#: plugins/sudoers/def_data.c:198
+#: plugins/sudoers/def_data.c:206
 #, c-format
 msgid "Path to mail program: %s"
 msgstr "Путања до програма поште: %s"
 
-#: plugins/sudoers/def_data.c:202
+#: plugins/sudoers/def_data.c:210
 #, c-format
 msgid "Flags for mail program: %s"
 msgstr "Опције за програм поште: %s"
 
-#: plugins/sudoers/def_data.c:206
+#: plugins/sudoers/def_data.c:214
 #, c-format
 msgid "Address to send mail to: %s"
 msgstr "Адреса на коју послати поруку: %s"
 
-#: plugins/sudoers/def_data.c:210
+#: plugins/sudoers/def_data.c:218
 #, c-format
 msgid "Address to send mail from: %s"
 msgstr "Адреса са које послати поруку: %s"
 
-#: plugins/sudoers/def_data.c:214
+#: plugins/sudoers/def_data.c:222
 #, c-format
 msgid "Subject line for mail messages: %s"
 msgstr "Ред теме за поруке поште: %s"
 
-#: plugins/sudoers/def_data.c:218
+#: plugins/sudoers/def_data.c:226
 #, c-format
 msgid "Incorrect password message: %s"
 msgstr "Порука нетачне лозинке: %s"
 
-#: plugins/sudoers/def_data.c:222
+#: plugins/sudoers/def_data.c:230
 #, c-format
 msgid "Path to lecture status dir: %s"
 msgstr "Путања до директоријума стања обучавања: %s"
 
-#: plugins/sudoers/def_data.c:226
+#: plugins/sudoers/def_data.c:234
 #, c-format
 msgid "Path to authentication timestamp dir: %s"
 msgstr "Путања до директоријума временске ознаке потврђивања идентитета: %s"
 
-#: plugins/sudoers/def_data.c:230
+#: plugins/sudoers/def_data.c:238
 #, c-format
 msgid "Owner of the authentication timestamp dir: %s"
 msgstr "Власник директоријума временске ознаке потврђивања идентитета: %s"
 
-#: plugins/sudoers/def_data.c:234
+#: plugins/sudoers/def_data.c:242
 #, c-format
 msgid "Users in this group are exempt from password and PATH requirements: %s"
 msgstr "Корисницима у овој групи се не захтева лозинка и ПУТАЊА: %s"
 
-#: plugins/sudoers/def_data.c:238
+#: plugins/sudoers/def_data.c:246
 #, c-format
 msgid "Default password prompt: %s"
 msgstr "Основни упит лозинке: %s"
 
-#: plugins/sudoers/def_data.c:242
+#: plugins/sudoers/def_data.c:250
 msgid "If set, passprompt will override system prompt in all cases."
 msgstr "Ако је подешено, упит лозинке ће преписати системски упит у свим случајевима."
 
-#: plugins/sudoers/def_data.c:246
+#: plugins/sudoers/def_data.c:254
 #, c-format
 msgid "Default user to run commands as: %s"
 msgstr "Основни корисник за покретање наредби као: %s"
 
-#: plugins/sudoers/def_data.c:250
+#: plugins/sudoers/def_data.c:258
 #, c-format
 msgid "Value to override user's $PATH with: %s"
 msgstr "Вредност за преписивање корисничке $ПУТАЊЕ са: %s"
 
-#: plugins/sudoers/def_data.c:254
+#: plugins/sudoers/def_data.c:262
 #, c-format
 msgid "Path to the editor for use by visudo: %s"
 msgstr "Путања до уређивача кога ће да користи висудо: %s"
 
-#: plugins/sudoers/def_data.c:258
+#: plugins/sudoers/def_data.c:266
 #, c-format
 msgid "When to require a password for 'list' pseudocommand: %s"
 msgstr "Када да затражи лозинку за псеудонаредбу „list“: %s"
 
-#: plugins/sudoers/def_data.c:262
+#: plugins/sudoers/def_data.c:270
 #, c-format
 msgid "When to require a password for 'verify' pseudocommand: %s"
 msgstr "Када да затражи лозинку за псеудонаредбу „verify“: %s"
 
-#: plugins/sudoers/def_data.c:266
-msgid "Preload the dummy exec functions contained in the sudo_noexec library"
-msgstr "Унапред учитава лажне функције извршавања које се налазе у библиотеци „sudo_noexec“"
+#: plugins/sudoers/def_data.c:274
+msgid "Preload the sudo_noexec library which replaces the exec functions"
+msgstr "Унапред учитава „sudo_noexec“ библиотеку која мења функцију извршавања"
 
-#: plugins/sudoers/def_data.c:270
+#: plugins/sudoers/def_data.c:278
 msgid "If LDAP directory is up, do we ignore local sudoers file"
 msgstr "Ако је ЛДАП директоријум изнет, да ли занемарујемо месну датотеку судоерса"
 
-#: plugins/sudoers/def_data.c:274
+#: plugins/sudoers/def_data.c:282
 #, c-format
 msgid "File descriptors >= %d will be closed before executing a command"
 msgstr "Описници датотека >= %d ће бити затворени пре извршавања наредбе"
 
-#: plugins/sudoers/def_data.c:278
+#: plugins/sudoers/def_data.c:286
 msgid "If set, users may override the value of \"closefrom\" with the -C option"
 msgstr "Ако је подешено, корисници могу да препишу вредност „closefrom“ са опцијом „-C“"
 
-#: plugins/sudoers/def_data.c:282
+#: plugins/sudoers/def_data.c:290
 msgid "Allow users to set arbitrary environment variables"
 msgstr "Дозвољава корисницима да подесе произвољне променљиве окружења"
 
-#: plugins/sudoers/def_data.c:286
+#: plugins/sudoers/def_data.c:294
 msgid "Reset the environment to a default set of variables"
 msgstr "Враћа окружење на основни скуп променљивих"
 
-#: plugins/sudoers/def_data.c:290
-msgid "Environment variables to check for sanity:"
+#: plugins/sudoers/def_data.c:298
+msgid "Environment variables to check for safety:"
 msgstr "Променљиве окружења за проверу исправности:"
 
-#: plugins/sudoers/def_data.c:294
+#: plugins/sudoers/def_data.c:302
 msgid "Environment variables to remove:"
 msgstr "Променљиве окружења за уклањање:"
 
-#: plugins/sudoers/def_data.c:298
+#: plugins/sudoers/def_data.c:306
 msgid "Environment variables to preserve:"
 msgstr "Променљиве окружења за очување:"
 
-#: plugins/sudoers/def_data.c:302
+#: plugins/sudoers/def_data.c:310
 #, c-format
 msgid "SELinux role to use in the new security context: %s"
 msgstr "СЕЛинукс улога за употребу у новом контексту безбедности: %s"
 
-#: plugins/sudoers/def_data.c:306
+#: plugins/sudoers/def_data.c:314
 #, c-format
 msgid "SELinux type to use in the new security context: %s"
 msgstr "СЕЛинукс врста за употребу у новом контексту безбедности: %s"
 
-#: plugins/sudoers/def_data.c:310
+#: plugins/sudoers/def_data.c:318
 #, c-format
 msgid "Path to the sudo-specific environment file: %s"
 msgstr "Путања до судо-посебне датотеке окружења: %s"
 
-#: plugins/sudoers/def_data.c:314
+#: plugins/sudoers/def_data.c:322
 #, c-format
 msgid "Path to the restricted sudo-specific environment file: %s"
 msgstr "Путања до ограничене судо-посебне датотеке окружења: %s"
 
-#: plugins/sudoers/def_data.c:318
+#: plugins/sudoers/def_data.c:326
 #, c-format
 msgid "Locale to use while parsing sudoers: %s"
 msgstr "Језк за коришћење при обради судоерса: %s"
 
-#: plugins/sudoers/def_data.c:322
+#: plugins/sudoers/def_data.c:330
 msgid "Allow sudo to prompt for a password even if it would be visible"
 msgstr "Дозвољава да судо тражи лозинку чак и ако би била видљива"
 
-#: plugins/sudoers/def_data.c:326
+#: plugins/sudoers/def_data.c:334
 msgid "Provide visual feedback at the password prompt when there is user input"
 msgstr "Обезбеђује видну повратну поруку при тражењу лозинке када постоји унос корисника"
 
-#: plugins/sudoers/def_data.c:330
+#: plugins/sudoers/def_data.c:338
 msgid "Use faster globbing that is less accurate but does not access the filesystem"
 msgstr "Користи брже упоређивање које је мање тачно али не приступа систему датотека"
 
-#: plugins/sudoers/def_data.c:334
+#: plugins/sudoers/def_data.c:342
 msgid "The umask specified in sudoers will override the user's, even if it is more permissive"
 msgstr "Умаска наведена у судоерсима ће преписати корисникову, чак и ако има већа овлашћења"
 
-#: plugins/sudoers/def_data.c:338
+#: plugins/sudoers/def_data.c:346
 msgid "Log user's input for the command being run"
 msgstr "Бележи корисников улаз за покренуту наредбу"
 
-#: plugins/sudoers/def_data.c:342
+#: plugins/sudoers/def_data.c:350
 msgid "Log the output of the command being run"
 msgstr "Бележи излаз покренуте наредбе"
 
-#: plugins/sudoers/def_data.c:346
+#: plugins/sudoers/def_data.c:354
 msgid "Compress I/O logs using zlib"
 msgstr "Пакује У/И дневнике користећи злиб"
 
-#: plugins/sudoers/def_data.c:350
+#: plugins/sudoers/def_data.c:358
 msgid "Always run commands in a pseudo-tty"
 msgstr "Увек покреће наредбе у привидној конзоли"
 
-#: plugins/sudoers/def_data.c:354
+#: plugins/sudoers/def_data.c:362
 #, c-format
 msgid "Plugin for non-Unix group support: %s"
 msgstr "Прикључак за подршку не-Јуникс групе: %s"
 
-#: plugins/sudoers/def_data.c:358
+#: plugins/sudoers/def_data.c:366
 #, c-format
 msgid "Directory in which to store input/output logs: %s"
 msgstr "Директоријум за смештај улазних/излазних дневника: %s"
 
-#: plugins/sudoers/def_data.c:362
+#: plugins/sudoers/def_data.c:370
 #, c-format
 msgid "File in which to store the input/output log: %s"
 msgstr "Датотека за смештај улазно/излазног дневника: %s"
 
-#: plugins/sudoers/def_data.c:366
+#: plugins/sudoers/def_data.c:374
 msgid "Add an entry to the utmp/utmpx file when allocating a pty"
 msgstr "Додаје унос у датотеку „utmp/utmpx“ када додељује „pty“"
 
-#: plugins/sudoers/def_data.c:370
+#: plugins/sudoers/def_data.c:378
 msgid "Set the user in utmp to the runas user, not the invoking user"
 msgstr "Подешава корисника у „utmp“-у на корисника покрени-као, не призивајући корисника"
 
-#: plugins/sudoers/def_data.c:374
+#: plugins/sudoers/def_data.c:382
 #, c-format
 msgid "Set of permitted privileges: %s"
 msgstr "Скуп допуштених повластица: %s"
 
-#: plugins/sudoers/def_data.c:378
+#: plugins/sudoers/def_data.c:386
 #, c-format
 msgid "Set of limit privileges: %s"
 msgstr "Скуп повластица ограничења: %s"
 
-#: plugins/sudoers/def_data.c:382
+#: plugins/sudoers/def_data.c:390
 msgid "Run commands on a pty in the background"
 msgstr "Покреће наредбе у позадини на назовитерминалу"
 
-#: plugins/sudoers/def_data.c:386
+#: plugins/sudoers/def_data.c:394
 #, c-format
 msgid "PAM service name to use: %s"
 msgstr "Назив ПАМ услуге за коришћење: %s"
 
-#: plugins/sudoers/def_data.c:390
+#: plugins/sudoers/def_data.c:398
 #, c-format
 msgid "PAM service name to use for login shells: %s"
 msgstr "Назив ПАМ услуге за шкољке пријављивања: %s"
 
-#: plugins/sudoers/def_data.c:394
+#: plugins/sudoers/def_data.c:402
 msgid "Attempt to establish PAM credentials for the target user"
 msgstr "Покушава да успостави ПАМ пуномоћства за циљног корисника"
 
-#: plugins/sudoers/def_data.c:398
+#: plugins/sudoers/def_data.c:406
 msgid "Create a new PAM session for the command to run in"
 msgstr "Прави нову ПАМ сесију за покретање наредбе"
 
-#: plugins/sudoers/def_data.c:402
+#: plugins/sudoers/def_data.c:410
 msgid "Perform PAM account validation management"
 msgstr "Обавља управљање провером ПАМ налога"
 
-#: plugins/sudoers/def_data.c:406
+#: plugins/sudoers/def_data.c:414
 #, c-format
 msgid "Maximum I/O log sequence number: %s"
 msgstr "Највећи број низа У/И дневника: %s"
 
-#: plugins/sudoers/def_data.c:410
+#: plugins/sudoers/def_data.c:418
 msgid "Enable sudoers netgroup support"
 msgstr "Укључује подршку нетгрупе судоерса"
 
-#: plugins/sudoers/def_data.c:414
+#: plugins/sudoers/def_data.c:422
 msgid "Check parent directories for writability when editing files with sudoedit"
 msgstr "Проверава родитељски директоријум за уписивошћу када уређује датотеке са „sudoedit“"
 
-#: plugins/sudoers/def_data.c:418
+#: plugins/sudoers/def_data.c:426
 msgid "Follow symbolic links when editing files with sudoedit"
 msgstr "Прати симболичке везе када уређује датотеке са „sudoedit“"
 
-#: plugins/sudoers/def_data.c:422
+#: plugins/sudoers/def_data.c:430
 msgid "Query the group plugin for unknown system groups"
 msgstr "Пропитује прикључак групе за непознатим групама система"
 
-#: plugins/sudoers/def_data.c:426
+#: plugins/sudoers/def_data.c:434
 msgid "Match netgroups based on the entire tuple: user, host and domain"
 msgstr "Упоређује мрежне групе на основу читавог слога: корисник, домаћин и домен"
 
-#: plugins/sudoers/def_data.c:430
+#: plugins/sudoers/def_data.c:438
 msgid "Allow commands to be run even if sudo cannot write to the audit log"
 msgstr "Допушта покретање наредби чак и ако судо не може да пише у дневник прегледа"
 
-#: plugins/sudoers/def_data.c:434
+#: plugins/sudoers/def_data.c:442
 msgid "Allow commands to be run even if sudo cannot write to the I/O log"
 msgstr "Допушта покретање наредби чак и ако судо не може да пише у дневник У/И"
 
-#: plugins/sudoers/def_data.c:438
+#: plugins/sudoers/def_data.c:446
 msgid "Allow commands to be run even if sudo cannot write to the log file"
 msgstr "Допушта покретање наредби чак и ако судо не може да пише у датотеку дневника"
 
-#: plugins/sudoers/def_data.c:442
+#: plugins/sudoers/def_data.c:450
 msgid "Resolve groups in sudoers and match on the group ID, not the name"
 msgstr "Решава групе у судоерсима и упоређује ИД групе, а не назив"
 
-#: plugins/sudoers/def_data.c:446
+#: plugins/sudoers/def_data.c:454
 #, c-format
 msgid "Log entries larger than this value will be split into multiple syslog messages: %u"
 msgstr "Уноси дневника већи од ове вредности биће подељени на више порука системског дневника: %u"
 
-#: plugins/sudoers/def_data.c:450
+#: plugins/sudoers/def_data.c:458
 #, c-format
 msgid "User that will own the I/O log files: %s"
 msgstr "Корисник који ће поседовати датотеке дневника У/И: %s"
 
-#: plugins/sudoers/def_data.c:454
+#: plugins/sudoers/def_data.c:462
 #, c-format
 msgid "Group that will own the I/O log files: %s"
 msgstr "Група која ће поседовати датотеке дневника У/И: %s"
 
-#: plugins/sudoers/def_data.c:458
+#: plugins/sudoers/def_data.c:466
 #, c-format
 msgid "File mode to use for the I/O log files: 0%o"
 msgstr "Режим датотеке за коришћење за датотеке дневника У/И: 0%o"
 
-#: plugins/sudoers/def_data.c:462
+#: plugins/sudoers/def_data.c:470
 #, c-format
 msgid "Execute commands by file descriptor instead of by path: %s"
 msgstr "Извршава наредбе описником датотеке уместо путањом: %s"
 
-#: plugins/sudoers/def_data.c:466
+#: plugins/sudoers/def_data.c:474
 msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
 msgstr "Занемарује непознате уносе основности у судоерсу уместо да даје упозорење"
 
-#: plugins/sudoers/def_data.c:470
+#: plugins/sudoers/def_data.c:478
 #, c-format
 msgid "Time in seconds after which the command will be terminated: %u"
 msgstr "Време у секундама након ког ће наредба бити окончана: %u"
 
-#: plugins/sudoers/def_data.c:474
+#: plugins/sudoers/def_data.c:482
 msgid "Allow the user to specify a timeout on the command line"
 msgstr "Допушта кориснику да наведе време на линији наредби"
 
-#: plugins/sudoers/def_data.c:478
+#: plugins/sudoers/def_data.c:486
 msgid "Flush I/O log data to disk immediately instead of buffering it"
 msgstr "Пребацује У/И податке дневника на диск одмах уместо да га смешта у међумеморију"
 
-#: plugins/sudoers/def_data.c:482
+#: plugins/sudoers/def_data.c:490
 msgid "Include the process ID when logging via syslog"
 msgstr "Укључује ИБ процеса приликом пријављивања путем дневника система"
 
-#: plugins/sudoers/def_data.c:486
+#: plugins/sudoers/def_data.c:494
 #, c-format
 msgid "Type of authentication timestamp record: %s"
 msgstr "Врста временске ознаке потврђивања идентитета: %s"
 
-#: plugins/sudoers/def_data.c:490
+#: plugins/sudoers/def_data.c:498
 #, c-format
 msgid "Authentication failure message: %s"
 msgstr "Потврђивање идентитета није успело: %s"
 
-#: plugins/sudoers/def_data.c:494
+#: plugins/sudoers/def_data.c:502
 msgid "Ignore case when matching user names"
 msgstr "Занемарује величину слова приликом поклапања назива корисника"
 
-#: plugins/sudoers/def_data.c:498
+#: plugins/sudoers/def_data.c:506
 msgid "Ignore case when matching group names"
 msgstr "Занемарује величину слова приликом поклапања назива групе"
 
-#: plugins/sudoers/def_data.c:502
+#: plugins/sudoers/def_data.c:510
 msgid "Log when a command is allowed by sudoers"
 msgstr "Пише дневник када судоерси дозвољавају наредбу"
 
-#: plugins/sudoers/def_data.c:506
+#: plugins/sudoers/def_data.c:514
 msgid "Log when a command is denied by sudoers"
 msgstr "Пише дневник када судоерси не дозвољавају наредбу"
 
-#: plugins/sudoers/def_data.c:510
+#: plugins/sudoers/def_data.c:518
 msgid "Sudo log server(s) to connect to with optional port"
 msgstr "Судо сервер(и) дневника за повезивање са изборним прикључником"
 
-#: plugins/sudoers/def_data.c:514
+#: plugins/sudoers/def_data.c:522
 #, c-format
 msgid "Sudo log server timeout in seconds: %u"
 msgstr "Време истека судо сервера дневника у секундама: %u"
 
-#: plugins/sudoers/def_data.c:518
+#: plugins/sudoers/def_data.c:526
 msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver"
 msgstr "Укључује „SO_KEEPALIVE“ опцију прикључнице са повезаном прикључницом са сервером дневника"
 
-#: plugins/sudoers/def_data.c:522
+#: plugins/sudoers/def_data.c:530
 #, c-format
 msgid "Path to the audit server's CA bundle file: %s"
 msgstr "Путања до датотеке групних издавача уверења сервера испитивања: %s"
 
-#: plugins/sudoers/def_data.c:526
+#: plugins/sudoers/def_data.c:534
 #, c-format
 msgid "Path to the sudoers certificate file: %s"
 msgstr "Путања до датотеке уверења судоерса: %s"
 
-#: plugins/sudoers/def_data.c:530
+#: plugins/sudoers/def_data.c:538
 #, c-format
 msgid "Path to the sudoers private key file: %s"
 msgstr "Путања до датотеке датотеке личног кључа судоерса: %s"
 
-#: plugins/sudoers/def_data.c:534
+#: plugins/sudoers/def_data.c:542
 msgid "Verify that the log server's certificate is valid"
 msgstr "Потврђује да је исправно уверење дневника сервера"
 
-#: plugins/sudoers/def_data.c:538
+#: plugins/sudoers/def_data.c:546
 msgid "Allow the use of unknown runas user and/or group ID"
 msgstr "Допушта коришћење непознатог „runas“ корисника и/или ИБ-а групе"
 
-#: plugins/sudoers/def_data.c:542
+#: plugins/sudoers/def_data.c:550
 msgid "Only permit running commands as a user with a valid shell"
 msgstr "Допушта покретање наредби као корисник само са исправном шкољком"
 
-#: plugins/sudoers/def_data.c:546
+#: plugins/sudoers/def_data.c:554
 msgid "Set the pam remote user to the user running sudo"
 msgstr "Поставља пам удаљеног корисника на корисника покретача судо-а"
 
-#: plugins/sudoers/def_data.c:550
+#: plugins/sudoers/def_data.c:558
 msgid "Set the pam remote host to the local host name"
 msgstr "Поставља пам удаљеног домаћина на назив локалног домаћина"
 
-#: plugins/sudoers/defaults.c:183
+#: plugins/sudoers/def_data.c:562
 #, c-format
-msgid "%s:%d unknown defaults entry \"%s\""
-msgstr "%s:%d непознат унос основности „%s“"
+msgid "Working directory to change to before executing the command: %s"
+msgstr "Радни директоријум за прелазак пре извршавања наредбе: %s"
 
-#: plugins/sudoers/defaults.c:186
+#: plugins/sudoers/def_data.c:566
 #, c-format
-msgid "%s: unknown defaults entry \"%s\""
-msgstr "%s: непознат унос основности „%s“"
+msgid "Root directory to change to before executing the command: %s"
+msgstr "Корени директоријум за прелазак пре извршавања наредбе: %s"
 
-#: plugins/sudoers/defaults.c:229
+#: plugins/sudoers/def_data.c:570
 #, c-format
-msgid "%s:%d no value specified for \"%s\""
-msgstr "%s:%d није наведена вредност за „%s“"
+msgid "The format of logs to produce: %s"
+msgstr "Формат резултирајућих дневника: %s"
 
-#: plugins/sudoers/defaults.c:232
+#: plugins/sudoers/defaults.c:185
 #, c-format
-msgid "%s: no value specified for \"%s\""
-msgstr "%s: није наведена вредност за „%s“"
+msgid "%s:%d:%d: unknown defaults entry \"%s\""
+msgstr "%s:%d:%d: непознат унос основности „%s“"
 
-#: plugins/sudoers/defaults.c:252
+#: plugins/sudoers/defaults.c:188
 #, c-format
-msgid "%s:%d values for \"%s\" must start with a '/'"
-msgstr "%s:%d вредност за „%s“ мора да почиње /"
+msgid "%s: unknown defaults entry \"%s\""
+msgstr "%s: непознат унос основности „%s“"
 
-#: plugins/sudoers/defaults.c:255
+#: plugins/sudoers/defaults.c:234
 #, c-format
-msgid "%s: values for \"%s\" must start with a '/'"
-msgstr "%s: вредност за „%s“ мора да почиње /"
+msgid "%s:%d:%d: no value specified for \"%s\""
+msgstr "%s:%d:%d: није наведена вредност за „%s“"
+
+#: plugins/sudoers/defaults.c:237
+#, c-format
+msgid "%s: no value specified for \"%s\""
+msgstr "%s: није наведена вредност за „%s“"
 
-#: plugins/sudoers/defaults.c:277
+#: plugins/sudoers/defaults.c:275
 #, c-format
-msgid "%s:%d option \"%s\" does not take a value"
-msgstr "%s:%d опција „%s“ не узима вредност"
+msgid "%s:%d:%d: option \"%s\" does not take a value"
+msgstr "%s:%d:%d: опција „%s“ не узима вредност"
 
-#: plugins/sudoers/defaults.c:280
+#: plugins/sudoers/defaults.c:278
 #, c-format
 msgid "%s: option \"%s\" does not take a value"
 msgstr "%s: опција „%s“ не узима вредност"
 
-#: plugins/sudoers/defaults.c:305
+#: plugins/sudoers/defaults.c:303
 #, c-format
-msgid "%s:%d invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s:%d неисправна врста основности 0x%x за опцију „%s“"
+msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
+msgstr "%s:%d:%d: неисправна врста основности 0x%x за опцију „%s“"
 
-#: plugins/sudoers/defaults.c:308
+#: plugins/sudoers/defaults.c:306
 #, c-format
 msgid "%s: invalid Defaults type 0x%x for option \"%s\""
 msgstr "%s: неисправна врста основности 0x%x за опцију „%s“"
 
-#: plugins/sudoers/defaults.c:318
+#: plugins/sudoers/defaults.c:316
 #, c-format
-msgid "%s:%d value \"%s\" is invalid for option \"%s\""
-msgstr "%s:%d вредност „%s“ је неисправна за опцију „%s“"
+msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
+msgstr "%s:%d:%d: вредност „%s“ је неисправна за опцију „%s“"
 
-#: plugins/sudoers/defaults.c:321
+#: plugins/sudoers/defaults.c:319
 #, c-format
 msgid "%s: value \"%s\" is invalid for option \"%s\""
 msgstr "%s: вредност „%s“ је неисправна за опцију „%s“"
 
-#: plugins/sudoers/env.c:404
+#: plugins/sudoers/defaults.c:1030
+#, c-format
+msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "%s:%d:%d: вредност за „%s“ мора да почиње са /, ~ или *"
+
+#: plugins/sudoers/defaults.c:1034
+#, c-format
+msgid "%s: values for \"%s\" must start with a '/', '~', or '*'"
+msgstr "%s: вредност за „%s“ мора да почиње са /, ~ или *"
+
+#: plugins/sudoers/defaults.c:1045
+#, c-format
+msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
+msgstr "%s:%d:%d: вредност за „%s“ мора да почиње са /"
+
+#: plugins/sudoers/defaults.c:1049
+#, c-format
+msgid "%s: values for \"%s\" must start with a '/'"
+msgstr "%s: вредност за „%s“ мора да почиње /"
+
+#: plugins/sudoers/env.c:405
 msgid "sudo_putenv: corrupted envp, length mismatch"
 msgstr "sudo_putenv: оштећено стави окружење, дужине не одговарају"
 
-#: plugins/sudoers/env.c:1131
+#: plugins/sudoers/env.c:1133
 msgid "unable to rebuild the environment"
 msgstr "не могу поново да изградим окружење"
 
-#: plugins/sudoers/env.c:1205
+#: plugins/sudoers/env.c:1207
 #, c-format
 msgid "sorry, you are not allowed to set the following environment variables: %s"
 msgstr "извините, није вам дозвољено да подесите следеће променљиве окружења: %s"
 
-#: plugins/sudoers/file.c:104
+#: plugins/sudoers/file.c:107
 #, c-format
 msgid "parse error in %s near line %d"
 msgstr "грешка обраде у %s близу реда %d"
 
-#: plugins/sudoers/file.c:107
+#: plugins/sudoers/file.c:110
 #, c-format
 msgid "parse error in %s"
 msgstr "грешка обраде у %s"
@@ -1925,7 +2010,7 @@ msgstr "„%s“ мора бити у власништву јиб-а %d"
 msgid "%s must only be writable by owner"
 msgstr "Само корисник може да пише у „%s“"
 
-#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:571
+#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569
 #, c-format
 msgid "unable to load %s: %s"
 msgstr "не могу да учитам %s: %s"
@@ -1954,122 +2039,78 @@ msgstr "не могу да обрадим мрежну маску „%s“"
 msgid "Local IP address and netmask pairs:\n"
 msgstr "Месна ИП адреса и парови мрежне маске:\n"
 
-#: plugins/sudoers/iolog.c:142 plugins/sudoers/sudoers.c:393
-#: plugins/sudoers/sudoers.c:394 plugins/sudoers/sudoers.c:1274
-#: plugins/sudoers/testsudoers.c:416
+#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445
+#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410
 #, c-format
 msgid "unknown group: %s"
 msgstr "непозната група: %s"
 
-#: plugins/sudoers/iolog.c:517 plugins/sudoers/iolog.c:807
-#: plugins/sudoers/iolog.c:959 plugins/sudoers/iolog.c:966
-#: plugins/sudoers/iolog.c:1087 plugins/sudoers/iolog.c:1094
-#: plugins/sudoers/iolog.c:1193 plugins/sudoers/iolog.c:1200
+#: plugins/sudoers/iolog.c:622
+msgid "unable to update sequence file"
+msgstr "не могу да освежим датотеку низа"
+
+#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841
+#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001
+#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129
+#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235
 #, c-format
 msgid "unable to write to I/O log file: %s"
 msgstr "не могу да пишем у датотеку дневника У/И: %s"
 
-#: plugins/sudoers/iolog.c:566
-msgid "unable to update sequence file"
-msgstr "не могу да освежим датотеку низа"
-
-#: plugins/sudoers/iolog.c:605
+#: plugins/sudoers/iolog.c:661
 #, c-format
 msgid "unable to create %s/%s"
 msgstr "не могу да направим „%s/%s“"
 
-#: plugins/sudoers/iolog.c:631
-msgid "unable to connect to log server"
-msgstr "не могу да се повежем на сервер дневника"
-
-#: plugins/sudoers/iolog.c:851
+#: plugins/sudoers/iolog.c:886
 #, c-format
 msgid "%s: internal error, I/O log file for event %d not open"
 msgstr "%s: унутрашња грешка, датотека У/И дневника за догађај %d није отворена"
 
-#: plugins/sudoers/iolog.c:944 plugins/sudoers/iolog.c:1072
-#: plugins/sudoers/iolog.c:1177 plugins/sudoers/timestamp.c:855
-#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:498
+#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107
+#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855
+#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493
+#: plugins/sudoers/visudo.c:499
 msgid "unable to read the clock"
 msgstr "не могу да прочитам сат"
 
-#: plugins/sudoers/iolog.c:1169 plugins/sudoers/iolog_client.c:977
+#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193
 #, c-format
 msgid "%s: internal error, invalid signal %d"
 msgstr "%s: унутрашња грешка, неисправан сигнал %d"
 
-#: plugins/sudoers/iolog_client.c:113 plugins/sudoers/iolog_client.c:392
-#: plugins/sudoers/iolog_client.c:1200 plugins/sudoers/iolog_client.c:1775
-msgid "error in event loop"
-msgstr "грешка у петљи догађаја"
-
-#: plugins/sudoers/iolog_client.c:194
-#, c-format
-msgid "Creation of new SSL_CTX object failed: %s"
-msgstr "Стварање новог „SSL_CTX“ објекта није успело: %s"
-
-#: plugins/sudoers/iolog_client.c:346 plugins/sudoers/iolog_client.c:351
-#, c-format
-msgid "TLS connection to %s:%s failed: %s"
-msgstr "ТЛС повезивање са „%s:%s“ није успело: %s"
-
-#: plugins/sudoers/iolog_client.c:496
-msgid "TLS initialization was unsuccessful"
-msgstr "ТЛС покретање беше безуспешно"
-
-#: plugins/sudoers/iolog_client.c:505
-msgid "TLS handshake was unsuccessful"
-msgstr "ТЛС руковање беше безуспешно"
-
-#: plugins/sudoers/iolog_client.c:767 plugins/sudoers/iolog_client.c:959
-msgid "unable to get time of day"
-msgstr "не могу да добавим време дана"
-
-#: plugins/sudoers/iolog_client.c:986
-#, c-format
-msgid "%s: internal error, invalid exit status %d"
-msgstr "%s: унутрашња грешка, неисправно излазно стање %d"
-
-#: plugins/sudoers/iolog_client.c:1523
-msgid "lost connection to log server"
-msgstr "изгубих везу са сервером дневника"
-
-#: plugins/sudoers/iolog_client.c:1600
-msgid "missing write buffer"
-msgstr "недостаје међумеморија писања"
-
-#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
 msgid "starttls not supported when using ldaps"
 msgstr "старттлс није подржано када се користи лдапс"
 
-#: plugins/sudoers/ldap.c:247
+#: plugins/sudoers/ldap.c:248
 #, c-format
 msgid "unable to initialize SSL cert and key db: %s"
 msgstr "не могу да покренем ССЛ уверење и бп кључа: %s"
 
-#: plugins/sudoers/ldap.c:250
+#: plugins/sudoers/ldap.c:251
 #, c-format
 msgid "you must set TLS_CERT in %s to use SSL"
 msgstr "морате да подесите „TLS_CERT“ у „%s“ да користите ССЛ"
 
-#: plugins/sudoers/ldap.c:1658
+#: plugins/sudoers/ldap.c:1660
 #, c-format
 msgid "unable to initialize LDAP: %s"
 msgstr "не могу да покренем ЛДАП: %s"
 
-#: plugins/sudoers/ldap.c:1694
+#: plugins/sudoers/ldap.c:1697
 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:1831 plugins/sudoers/parse_ldif.c:744
+#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744
 #, c-format
 msgid "invalid sudoOrder attribute: %s"
 msgstr "неисправна особина „sudoOrder“: %s"
 
 #: plugins/sudoers/ldap_conf.c:200
-msgid "sudo_ldap_conf_add_ports: port too large"
-msgstr "sudo_ldap_conf_add_ports: прикључник је превелик"
+#, c-format
+msgid "%s: port too large"
+msgstr "%s: прикључник је превелик"
 
 #: plugins/sudoers/ldap_conf.c:260
 #, c-format
@@ -2080,7 +2121,7 @@ msgstr "неподржана врста ЛДАП путање: %s"
 msgid "unable to mix ldap and ldaps URIs"
 msgstr "не могу да помешам лдап и лдапс путање"
 
-#: plugins/sudoers/ldap_util.c:548 plugins/sudoers/ldap_util.c:550
+#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555
 #, c-format
 msgid "unable to convert sudoOption: %s%s%s"
 msgstr "не могу да претворим „sudoOption“: %s%s%s"
@@ -2089,66 +2130,91 @@ msgstr "не могу да претворим „sudoOption“: %s%s%s"
 msgid "unable to open audit system"
 msgstr "не могу да отворим систем прегледа"
 
-#: plugins/sudoers/linux_audit.c:100
+#: plugins/sudoers/linux_audit.c:101
 msgid "unable to send audit message"
 msgstr "не могу да пошаљем поруку прегледа"
 
-#: plugins/sudoers/logging.c:167
+#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391
+#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023
+msgid "error in event loop"
+msgstr "грешка у петљи догађаја"
+
+#: plugins/sudoers/log_client.c:193
 #, c-format
-msgid "unable to open log file: %s"
-msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°: %s"
+msgid "Creation of new SSL_CTX object failed: %s"
+msgstr "СÑ\82ваÑ\80аÑ\9aе Ð½Ð¾Ð²Ð¾Ð³ â\80\9eSSL_CTXâ\80\9c Ð¾Ð±Ñ\98екÑ\82а Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело: %s"
 
-#: plugins/sudoers/logging.c:175
+#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350
 #, c-format
-msgid "unable to lock log file: %s"
-msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ам Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°: %s"
+msgid "TLS connection to %s:%s failed: %s"
+msgstr "ТÐ\9bС Ð¿Ð¾Ð²ÐµÐ·Ð¸Ð²Ð°Ñ\9aе Ñ\81а â\80\9e%s:%sâ\80\9c Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело: %s"
 
-#: plugins/sudoers/logging.c:208
+#: plugins/sudoers/log_client.c:519
+msgid "TLS initialization was unsuccessful"
+msgstr "ТЛС покретање беше безуспешно"
+
+#: plugins/sudoers/log_client.c:528
+msgid "TLS handshake was unsuccessful"
+msgstr "ТЛС руковање беше безуспешно"
+
+#: plugins/sudoers/log_client.c:1202
 #, c-format
-msgid "unable to write log file: %s"
-msgstr "не могу да запишем датотеку дневника: %s"
+msgid "%s: internal error, invalid exit status %d"
+msgstr "%s: унутрашња грешка, неисправно излазно стање %d"
+
+#: plugins/sudoers/log_client.c:1738
+msgid "lost connection to log server"
+msgstr "изгубих везу са сервером дневника"
+
+#: plugins/sudoers/log_client.c:1815
+msgid "missing write buffer"
+msgstr "недостаје међумеморија писања"
+
+#: plugins/sudoers/log_client.c:1964
+msgid "unable to connect to log server"
+msgstr "не могу да се повежем на сервер дневника"
 
-#: plugins/sudoers/logging.c:241
+#: plugins/sudoers/logging.c:244
 msgid "user NOT in sudoers"
 msgstr "корисник НИЈЕ у судоерсу"
 
-#: plugins/sudoers/logging.c:243
+#: plugins/sudoers/logging.c:246
 msgid "user NOT authorized on host"
 msgstr "корисник НИЈЕ овлашћен на домаћину"
 
-#: plugins/sudoers/logging.c:245
+#: plugins/sudoers/logging.c:248
 msgid "command not allowed"
 msgstr "наредба није допуштена"
 
-#: plugins/sudoers/logging.c:288
+#: plugins/sudoers/logging.c:269
 #, c-format
 msgid "%s is not in the sudoers file.  This incident will be reported.\n"
 msgstr "„%s“ се не налази у датотеци судоерса.  О овом инциденту ће бити поднет извештај.\n"
 
-#: plugins/sudoers/logging.c:291
+#: plugins/sudoers/logging.c:272
 #, c-format
 msgid "%s is not allowed to run sudo on %s.  This incident will be reported.\n"
 msgstr "„%s“ нема права да покрене судо над „%s“.  О овом инциденту ће бити поднет извештај.\n"
 
-#: plugins/sudoers/logging.c:295
+#: plugins/sudoers/logging.c:276
 #, c-format
 msgid "Sorry, user %s may not run sudo on %s.\n"
 msgstr "Извините, корисник %s не може покренути судо на %s.\n"
 
-#: plugins/sudoers/logging.c:298
+#: plugins/sudoers/logging.c:279
 #, 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:335 plugins/sudoers/sudoers.c:512
-#: plugins/sudoers/sudoers.c:514 plugins/sudoers/sudoers.c:516
-#: plugins/sudoers/sudoers.c:518 plugins/sudoers/sudoers.c:665
-#: plugins/sudoers/sudoers.c:667
+#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583
+#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587
+#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739
+#: plugins/sudoers/sudoers.c:741
 #, c-format
 msgid "%s: command not found"
 msgstr "%s: нема такве наредбе"
 
-#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:508
+#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579
 #, c-format
 msgid ""
 "ignoring \"%s\" found in '.'\n"
@@ -2157,15 +2223,7 @@ msgstr ""
 "занемарујем „%s“ пронађено у „.“\n"
 "Користите „sudo ./%s“ ако је то „%s“ које желите да покренете."
 
-#: plugins/sudoers/logging.c:354
-msgid "authentication failure"
-msgstr "потврђивање идентитета није успело"
-
-#: plugins/sudoers/logging.c:380
-msgid "a password is required"
-msgstr "потребна је лозинка"
-
-#: plugins/sudoers/logging.c:450
+#: plugins/sudoers/logging.c:337
 #, c-format
 msgid "%u incorrect password attempt"
 msgid_plural "%u incorrect password attempts"
@@ -2173,32 +2231,30 @@ msgstr[0] "%u покушај нетачне лозинке"
 msgstr[1] "%u покушаја нетачне лозинке"
 msgstr[2] "%u покушаја нетачне лозинке"
 
-#: plugins/sudoers/logging.c:714
-#, c-format
-msgid "unable to dup stdin: %m"
-msgstr "не могу да удвостручим стандардни улаз: %m"
+#: plugins/sudoers/logging.c:393
+msgid "authentication failure"
+msgstr "потврђивање идентитета није успело"
 
-#: plugins/sudoers/logging.c:751
-#, c-format
-msgid "unable to execute %s: %m"
-msgstr "не могу да извршим „%s“: %m"
+#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453
+msgid "a password is required"
+msgstr "потребна је лозинка"
 
-#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:848
+#: plugins/sudoers/logging.c:729
 #, c-format
-msgid "unable to fork: %m"
-msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ñ\81Ñ\86епим: %m"
+msgid "unable to open log file: %s"
+msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°: %s"
 
-#: plugins/sudoers/logging.c:838
+#: plugins/sudoers/logging.c:762
 #, c-format
-msgid "unable to open pipe: %m"
-msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Ñ\81поÑ\98кÑ\83: %m"
+msgid "unable to write log file: %s"
+msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°: %s"
 
-#: plugins/sudoers/match_digest.c:116
+#: plugins/sudoers/match_digest.c:129
 #, c-format
 msgid "digest for %s (%s) is not in %s form"
 msgstr "приказ за %s (%s) није у %s облику"
 
-#: plugins/sudoers/parse.c:442
+#: plugins/sudoers/parse.c:518
 #, c-format
 msgid ""
 "\n"
@@ -2207,8 +2263,7 @@ msgstr ""
 "\n"
 "ЛДАП улога: %s\n"
 
-#: plugins/sudoers/parse.c:445
-#, c-format
+#: plugins/sudoers/parse.c:521
 msgid ""
 "\n"
 "Sudoers entry:\n"
@@ -2216,42 +2271,38 @@ msgstr ""
 "\n"
 "Унос судоерса:\n"
 
-#: plugins/sudoers/parse.c:447
-#, c-format
+#: plugins/sudoers/parse.c:523
 msgid "    RunAsUsers: "
 msgstr "    „Покрени-као“ корисници: "
 
-#: plugins/sudoers/parse.c:462
-#, c-format
+#: plugins/sudoers/parse.c:538
 msgid "    RunAsGroups: "
 msgstr "    „Покрени-као“ групе: "
 
-#: plugins/sudoers/parse.c:472
-#, c-format
+#: plugins/sudoers/parse.c:548
 msgid "    Options: "
 msgstr "    Опције: "
 
-#: plugins/sudoers/parse.c:522
-#, c-format
+#: plugins/sudoers/parse.c:602
 msgid "    Commands:\n"
 msgstr "    Наредбе:\n"
 
-#: plugins/sudoers/parse.c:713
+#: plugins/sudoers/parse.c:793
 #, c-format
 msgid "Matching Defaults entries for %s on %s:\n"
 msgstr "Упоређује уносе основности за „%s“ на %s:\n"
 
-#: plugins/sudoers/parse.c:731
+#: plugins/sudoers/parse.c:811
 #, c-format
 msgid "Runas and Command-specific defaults for %s:\n"
 msgstr "Покрени-као и Наредбено-посебне основности за „%s“:\n"
 
-#: plugins/sudoers/parse.c:749
+#: plugins/sudoers/parse.c:829
 #, c-format
 msgid "User %s may run the following commands on %s:\n"
 msgstr "Корисник „%s“ може да покреће следеће наредбе на %s:\n"
 
-#: plugins/sudoers/parse.c:764
+#: plugins/sudoers/parse.c:844
 #, c-format
 msgid "User %s is not allowed to run sudo on %s.\n"
 msgstr "Корисник „%s“ нема права да покрене судо над „%s“.\n"
@@ -2266,48 +2317,58 @@ msgstr "занемарујем непотпуно „sudoRole“: cn: %s"
 msgid "invalid LDIF attribute: %s"
 msgstr "неисправна особина „LDIF“: %s"
 
-#: plugins/sudoers/policy.c:77 plugins/sudoers/policy.c:102
+#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102
 #, c-format
 msgid "invalid %.*s set by sudo front-end"
 msgstr "судо челник је поставио неисправну „%.*s“"
 
-#: plugins/sudoers/policy.c:281 plugins/sudoers/testsudoers.c:272
+#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272
 msgid "unable to parse network address list"
 msgstr "не могу да обрадим списак адреса мреже"
 
-#: plugins/sudoers/policy.c:426
+#: plugins/sudoers/policy.c:455
 msgid "user name not set by sudo front-end"
 msgstr "судо челник није поставио име корисника"
 
-#: plugins/sudoers/policy.c:430
+#: plugins/sudoers/policy.c:459
 msgid "user-ID not set by sudo front-end"
 msgstr "судо челник није поставио ИБ корисника"
 
-#: plugins/sudoers/policy.c:434
+#: plugins/sudoers/policy.c:463
 msgid "group-ID not set by sudo front-end"
 msgstr "судо челник није поставио ИБ групе"
 
-#: plugins/sudoers/policy.c:438
+#: plugins/sudoers/policy.c:467
 msgid "host name not set by sudo front-end"
 msgstr "судо челник није поставио назив домаћина"
 
-#: plugins/sudoers/policy.c:896 plugins/sudoers/visudo.c:230
-#: plugins/sudoers/visudo.c:861
+#: plugins/sudoers/policy.c:643
+#, c-format
+msgid "invalid working directory: %s"
+msgstr "неисправан радни директоријум: %s"
+
+#: plugins/sudoers/policy.c:811
+#, c-format
+msgid "invalid chroot directory: %s"
+msgstr "неисправан „chroot“ директоријум: %s"
+
+#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231
+#: plugins/sudoers/visudo.c:860
 #, c-format
 msgid "unable to execute %s"
 msgstr "не могу да извршим „%s“"
 
-#: plugins/sudoers/policy.c:1060
+#: plugins/sudoers/policy.c:1111
 #, c-format
 msgid "Sudoers policy plugin version %s\n"
 msgstr "Издање %s прикључка политике судоерса\n"
 
-#: plugins/sudoers/policy.c:1062
+#: plugins/sudoers/policy.c:1113
 #, c-format
 msgid "Sudoers file grammar version %d\n"
 msgstr "Граматика датотеке судоерса издање %d\n"
 
-#: plugins/sudoers/policy.c:1066
+#: plugins/sudoers/policy.c:1117
 #, c-format
 msgid ""
 "\n"
@@ -2316,86 +2377,86 @@ msgstr ""
 "\n"
 "Путања судоерса: %s\n"
 
-#: plugins/sudoers/policy.c:1069
+#: plugins/sudoers/policy.c:1120
 #, c-format
 msgid "nsswitch path: %s\n"
 msgstr "путања нс-прекидача: %s\n"
 
-#: plugins/sudoers/policy.c:1071
+#: plugins/sudoers/policy.c:1122
 #, c-format
 msgid "ldap.conf path: %s\n"
 msgstr "путања лдап.подешавања: %s\n"
 
-#: plugins/sudoers/policy.c:1072
+#: plugins/sudoers/policy.c:1123
 #, c-format
 msgid "ldap.secret path: %s\n"
 msgstr "путања лдап.тајне: %s\n"
 
-#: plugins/sudoers/policy.c:1105
+#: plugins/sudoers/policy.c:1156
 #, c-format
 msgid "unable to register hook of type %d (version %d.%d)"
 msgstr "немогу да региструјем прикачку врсте „%d“ (издање %d.%d)"
 
-#: plugins/sudoers/pwutil.c:214 plugins/sudoers/pwutil.c:232
+#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235
 #, c-format
 msgid "unable to cache uid %u"
 msgstr "не могу да сместим у оставу јиб „%u“"
 
-#: plugins/sudoers/pwutil.c:226
+#: plugins/sudoers/pwutil.c:229
 #, c-format
 msgid "unable to cache uid %u, already exists"
 msgstr "не могу да сместим у оставу јиб „%u“, већ постоји"
 
-#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:304
-#: plugins/sudoers/pwutil.c:367 plugins/sudoers/pwutil.c:412
+#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307
+#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415
 #, c-format
 msgid "unable to cache user %s"
 msgstr "не могу да сместим у оставу корисника „%s“"
 
-#: plugins/sudoers/pwutil.c:299
+#: plugins/sudoers/pwutil.c:302
 #, c-format
 msgid "unable to cache user %s, already exists"
 msgstr "не могу да сместим у оставу корисника „%s“, већ постоји"
 
-#: plugins/sudoers/pwutil.c:531 plugins/sudoers/pwutil.c:549
+#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552
 #, c-format
 msgid "unable to cache gid %u"
 msgstr "не могу да сместим у оставу гиб „%u“"
 
-#: plugins/sudoers/pwutil.c:543
+#: plugins/sudoers/pwutil.c:546
 #, c-format
 msgid "unable to cache gid %u, already exists"
 msgstr "не могу да сместим у оставу гиб „%u“, већ постоји"
 
-#: plugins/sudoers/pwutil.c:596 plugins/sudoers/pwutil.c:614
-#: plugins/sudoers/pwutil.c:662 plugins/sudoers/pwutil.c:704
+#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617
+#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707
 #, c-format
 msgid "unable to cache group %s"
 msgstr "не могу да сместим у оставу групу „%s“"
 
-#: plugins/sudoers/pwutil.c:609
+#: plugins/sudoers/pwutil.c:612
 #, c-format
 msgid "unable to cache group %s, already exists"
 msgstr "не могу да сместим у оставу групу „%s“, већ постоји"
 
-#: plugins/sudoers/pwutil.c:831 plugins/sudoers/pwutil.c:883
-#: plugins/sudoers/pwutil.c:933 plugins/sudoers/pwutil.c:986
+#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885
+#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987
 #, c-format
 msgid "unable to cache group list for %s, already exists"
 msgstr "не могу да сместим у оставу списак групе за „%s“, већ постоји"
 
-#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:888
-#: plugins/sudoers/pwutil.c:939 plugins/sudoers/pwutil.c:991
+#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890
+#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992
 #, c-format
 msgid "unable to cache group list for %s"
 msgstr "не могу да сместим у оставу списак групе за „%s“"
 
-#: plugins/sudoers/pwutil.c:877
+#: plugins/sudoers/pwutil.c:879
 #, c-format
 msgid "unable to parse groups for %s"
 msgstr "не могу да обрадим групе за „%s“"
 
-#: plugins/sudoers/pwutil.c:980
+#: plugins/sudoers/pwutil.c:981
 #, c-format
 msgid "unable to parse gids for %s"
 msgstr "не могу да обрадим гид-ове за „%s“"
@@ -2459,239 +2520,259 @@ msgstr "корисничка_наредба скраћене путање пре
 msgid "truncated audit path argv[0]: %s"
 msgstr "„argv[0]“ скраћене путање прегледа: %s"
 
-#: plugins/sudoers/sssd.c:573
+#: plugins/sudoers/sssd.c:572
 msgid "unable to initialize SSS source. Is SSSD installed on your machine?"
 msgstr "не могу да покренем ССС извор. Да ли је СССД инсталиран на вашем рачунару?"
 
-#: plugins/sudoers/sssd.c:581 plugins/sudoers/sssd.c:590
-#: plugins/sudoers/sssd.c:599 plugins/sudoers/sssd.c:608
-#: plugins/sudoers/sssd.c:617
+#: 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
 #, c-format
 msgid "unable to find symbol \"%s\" in %s"
 msgstr "не могу да нађем симбол „%s“ у „%s“"
 
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/sudoers.c:943
+#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010
 msgid "problem with defaults entries"
 msgstr "неприлике са основним уносима"
 
-#: plugins/sudoers/sudoers.c:221
+#: plugins/sudoers/sudoers.c:218
 msgid "no valid sudoers sources found, quitting"
 msgstr "нисам пронашао исправне изворе судоерса, прекидам"
 
-#: plugins/sudoers/sudoers.c:297
+#: plugins/sudoers/sudoers.c:292
+#, c-format
+msgid "user not allowed to change root directory to %s"
+msgstr "кориснику није дозвољено да промени корени директоријум у „%s“"
+
+#: plugins/sudoers/sudoers.c:294
+#, c-format
+msgid "you are not permitted to use the -R option with %s"
+msgstr "није вам допуштено да користите опцију „-R“ са „%s“"
+
+#: plugins/sudoers/sudoers.c:319
+#, c-format
+msgid "user not allowed to change directory to %s"
+msgstr "кориснику није дозвољено да промени директоријум у „%s“"
+
+#: plugins/sudoers/sudoers.c:320
+#, c-format
+msgid "you are not permitted to use the -D option with %s"
+msgstr "није вам допуштено да користите опцију „-D“ са „%s“"
+
+#: plugins/sudoers/sudoers.c:351
 msgid "sudoers specifies that root is not allowed to sudo"
 msgstr "судоерси наводе да администратор није дозвољен у судоу"
 
-#: plugins/sudoers/sudoers.c:357
+#: plugins/sudoers/sudoers.c:411
 msgid "user not allowed to override closefrom limit"
 msgstr "кориснику није дозвољено да препише „closefrom“ ограничење"
 
-#: plugins/sudoers/sudoers.c:358
+#: plugins/sudoers/sudoers.c:412
 msgid "you are not permitted to use the -C option"
 msgstr "није вам допуштено да користите опцију „-C“"
 
-#: plugins/sudoers/sudoers.c:420
+#: plugins/sudoers/sudoers.c:472
 #, c-format
 msgid "timestamp owner (%s): No such user"
 msgstr "власник временске ознаке (%s): нема таквог корисника"
 
-#: plugins/sudoers/sudoers.c:435
+#: plugins/sudoers/sudoers.c:487
 msgid "no tty"
 msgstr "нема конзоле"
 
-#: plugins/sudoers/sudoers.c:436
+#: plugins/sudoers/sudoers.c:488
 msgid "sorry, you must have a tty to run sudo"
 msgstr "извините, морате имати конзолу да покренете судо"
 
-#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444
+#: plugins/sudoers/sudoers.c:495
 #, c-format
 msgid "invalid shell for user %s: %s"
 msgstr "неисправна шкољка за корисника „%s“: %s"
 
-#: plugins/sudoers/sudoers.c:507
+#: plugins/sudoers/sudoers.c:578
 msgid "command in current directory"
 msgstr "наредба у текућем директоријуму"
 
-#: plugins/sudoers/sudoers.c:525
+#: plugins/sudoers/sudoers.c:597
 msgid "user not allowed to set a command timeout"
 msgstr "кориснику није дозвољено да подеси време истека наредбе"
 
-#: plugins/sudoers/sudoers.c:526
+#: plugins/sudoers/sudoers.c:599
 msgid "sorry, you are not allowed set a command timeout"
 msgstr "извините, није вам дозвољено да подесите време истека наредбе"
 
-#: plugins/sudoers/sudoers.c:534
+#: plugins/sudoers/sudoers.c:607
 msgid "user not allowed to preserve the environment"
 msgstr "кориснику није дозвољено да сачува окружење"
 
-#: plugins/sudoers/sudoers.c:535
+#: plugins/sudoers/sudoers.c:609
 msgid "sorry, you are not allowed to preserve the environment"
 msgstr "извините, није вам дозвољено да сачувате окружење"
 
-#: plugins/sudoers/sudoers.c:878
+#: plugins/sudoers/sudoers.c:945
 msgid "command too long"
 msgstr "наредба је предуга"
 
-#: plugins/sudoers/sudoers.c:936
+#: plugins/sudoers/sudoers.c:1003
 msgid "sudoedit doesn't need to be run via sudo"
 msgstr "„sudoedit“ не треба да се покреће путем „sudo“-а"
 
-#: plugins/sudoers/sudoers.c:990 plugins/sudoers/sudoreplay.c:1548
+#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547
 #: plugins/sudoers/tsdump.c:138
 #, c-format
 msgid "unable to read %s"
 msgstr "не могу да прочитам „%s“"
 
-#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/visudo.c:431
-#: plugins/sudoers/visudo.c:727
+#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432
+#: plugins/sudoers/visudo.c:726
 #, c-format
 msgid "unable to stat %s"
 msgstr "не могу да добијем податке о „%s“"
 
-#: plugins/sudoers/sudoers.c:1019 plugins/sudoers/visudo.c:1037
+#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018
 #, c-format
 msgid "%s is not a regular file"
 msgstr "„%s“ није обична датотека"
 
-#: plugins/sudoers/sudoers.c:1023 plugins/sudoers/timestamp.c:252 toke.l:1060
+#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112
 #, c-format
 msgid "%s is owned by uid %u, should be %u"
 msgstr "%s је у власништву уиб-а %u, а треба бити %u"
 
-#: plugins/sudoers/sudoers.c:1027 toke.l:1065
+#: plugins/sudoers/sudoers.c:1094 toke.l:1117
 #, c-format
 msgid "%s is world writable"
 msgstr "Сви могу да пишу у „%s“"
 
-#: plugins/sudoers/sudoers.c:1031 toke.l:1068
+#: plugins/sudoers/sudoers.c:1098 toke.l:1120
 #, c-format
 msgid "%s is owned by gid %u, should be %u"
 msgstr "%s је у власништву уиб-а %u, а треба бити %u"
 
-#: plugins/sudoers/sudoers.c:1064
+#: plugins/sudoers/sudoers.c:1131
 #, c-format
 msgid "only root can use \"-c %s\""
 msgstr "само администратор може да користи „-c %s“"
 
-#: plugins/sudoers/sudoers.c:1083
+#: plugins/sudoers/sudoers.c:1150
 #, c-format
 msgid "unknown login class: %s"
 msgstr "непознат разред пријављивања: %s"
 
-#: plugins/sudoers/sudoers.c:1168 plugins/sudoers/sudoers.c:1183
+#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250
 #, c-format
 msgid "unable to resolve host %s"
 msgstr "не могу да решим домаћина „%s“"
 
-#: plugins/sudoers/sudoreplay.c:258
+#: plugins/sudoers/sudoreplay.c:257
 #, c-format
 msgid "invalid filter option: %s"
 msgstr "неисправна опција пропусника: %s"
 
-#: plugins/sudoers/sudoreplay.c:274
+#: plugins/sudoers/sudoreplay.c:273
 #, c-format
 msgid "invalid max wait: %s"
 msgstr "неисправно најдуже чекање: %s"
 
-#: plugins/sudoers/sudoreplay.c:297
+#: plugins/sudoers/sudoreplay.c:296
 #, c-format
 msgid "invalid speed factor: %s"
 msgstr "неисправан чинилац брзине: %s"
 
-#: plugins/sudoers/sudoreplay.c:333
+#: plugins/sudoers/sudoreplay.c:332
 #, c-format
 msgid "%s/%.2s/%.2s/%.2s: %s"
 msgstr "%s/%.2s/%.2s/%.2s: %s"
 
-#: plugins/sudoers/sudoreplay.c:338
+#: plugins/sudoers/sudoreplay.c:337
 #, c-format
 msgid "%s/timing: %s"
 msgstr "%s/временисање: %s"
 
-#: plugins/sudoers/sudoreplay.c:342
+#: plugins/sudoers/sudoreplay.c:341
 #, c-format
 msgid "%s/%s: %s"
 msgstr "%s/%s: %s"
 
-#: plugins/sudoers/sudoreplay.c:366
+#: plugins/sudoers/sudoreplay.c:365
 #, c-format
 msgid "Replaying sudo session: %s"
 msgstr "Понављам сесију судоа: %s"
 
-#: plugins/sudoers/sudoreplay.c:628
+#: plugins/sudoers/sudoreplay.c:627
 msgid "unable to set tty to raw mode"
 msgstr "не могу да подесим конзолу на сирови режим"
 
-#: plugins/sudoers/sudoreplay.c:679
+#: plugins/sudoers/sudoreplay.c:678
 msgid "Warning: your terminal is too small to properly replay the log.\n"
 msgstr "Упозорење: ваш терминал је премали да би исправно приказао дневник.\n"
 
-#: plugins/sudoers/sudoreplay.c:680
+#: plugins/sudoers/sudoreplay.c:679
 #, c-format
 msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d."
 msgstr "Геометрија дневника је %d x %d, а геометрија терминала је %d x %d."
 
-#: plugins/sudoers/sudoreplay.c:708
+#: plugins/sudoers/sudoreplay.c:707
 msgid "Replay finished, press any key to restore the terminal."
 msgstr "Одговор је завршен, притисните неки тастер да повратите терминал."
 
-#: plugins/sudoers/sudoreplay.c:1198 plugins/sudoers/sudoreplay.c:1228
+#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227
 #, c-format
 msgid "ambiguous expression \"%s\""
 msgstr "нејасан израз „%s“"
 
-#: plugins/sudoers/sudoreplay.c:1250
+#: plugins/sudoers/sudoreplay.c:1249
 msgid "unmatched ')' in expression"
 msgstr "непоклопљена ) у изразу"
 
-#: plugins/sudoers/sudoreplay.c:1254
+#: plugins/sudoers/sudoreplay.c:1253
 #, c-format
 msgid "unknown search term \"%s\""
 msgstr "непознат појам претраге „%s“"
 
-#: plugins/sudoers/sudoreplay.c:1269
+#: plugins/sudoers/sudoreplay.c:1268
 #, c-format
 msgid "%s requires an argument"
 msgstr "„%s“ захтева аргумент"
 
-#: plugins/sudoers/sudoreplay.c:1272 plugins/sudoers/sudoreplay.c:1524
+#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523
 #, c-format
 msgid "invalid regular expression: %s"
 msgstr "неисправан регуларан израз: %s"
 
-#: plugins/sudoers/sudoreplay.c:1277
+#: plugins/sudoers/sudoreplay.c:1276
 #, c-format
 msgid "could not parse date \"%s\""
 msgstr "не могу да обрадим датум „%s“"
 
-#: plugins/sudoers/sudoreplay.c:1286
+#: plugins/sudoers/sudoreplay.c:1285
 msgid "unmatched '(' in expression"
 msgstr "непоклопљена ( у изразу"
 
-#: plugins/sudoers/sudoreplay.c:1288
+#: plugins/sudoers/sudoreplay.c:1287
 msgid "illegal trailing \"or\""
 msgstr "недозвољено пратеће „или“"
 
-#: plugins/sudoers/sudoreplay.c:1290
+#: plugins/sudoers/sudoreplay.c:1289
 msgid "illegal trailing \"!\""
 msgstr "недозвољени пратећи „!“"
 
-#: plugins/sudoers/sudoreplay.c:1348
+#: plugins/sudoers/sudoreplay.c:1347
 #, c-format
 msgid "unknown search type %d"
 msgstr "непозната врста претраге „%d“"
 
-#: plugins/sudoers/sudoreplay.c:1615
+#: plugins/sudoers/sudoreplay.c:1614
 #, 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:1618
+#: plugins/sudoers/sudoreplay.c:1617
 #, c-format
 msgid "usage: %s [-h] [-d dir] -l [search expression]\n"
 msgstr "употреба: %s [-h] [-d дир] -l [израз претраге]\n"
 
-#: plugins/sudoers/sudoreplay.c:1627
+#: plugins/sudoers/sudoreplay.c:1626
 #, c-format
 msgid ""
 "%s - replay sudo session logs\n"
@@ -2700,7 +2781,7 @@ msgstr ""
 "%s — понавља дневнике сесије судоа\n"
 "\n"
 
-#: plugins/sudoers/sudoreplay.c:1629
+#: plugins/sudoers/sudoreplay.c:1628
 msgid ""
 "\n"
 "Options:\n"
@@ -2728,11 +2809,11 @@ msgstr ""
 "  -s, --speed=број         убрзава или успорава излаз\n"
 "  -V, --version            приказује податке о издању и излази"
 
-#: plugins/sudoers/testsudoers.c:354
+#: plugins/sudoers/testsudoers.c:348
 msgid "\thost  unmatched"
 msgstr "\tдомаћин  није поклопљен"
 
-#: plugins/sudoers/testsudoers.c:357
+#: plugins/sudoers/testsudoers.c:351
 msgid ""
 "\n"
 "Command allowed"
@@ -2740,7 +2821,7 @@ msgstr ""
 "\n"
 "Наредба је допуштена"
 
-#: plugins/sudoers/testsudoers.c:358
+#: plugins/sudoers/testsudoers.c:352
 msgid ""
 "\n"
 "Command denied"
@@ -2748,7 +2829,7 @@ msgstr ""
 "\n"
 "Наредба је одбијена"
 
-#: plugins/sudoers/testsudoers.c:358
+#: plugins/sudoers/testsudoers.c:352
 msgid ""
 "\n"
 "Command unmatched"
@@ -2793,89 +2874,89 @@ msgstr "„sudoedit“ не треба да се наводи са путањо
 msgid "the -x option will be removed in a future release"
 msgstr "опција „-x“ биће уклоњена у наредном издању"
 
-#: plugins/sudoers/visudo.c:227
+#: plugins/sudoers/visudo.c:228
 msgid "please consider using the cvtsudoers utility instead"
 msgstr "размотрите коришћење помагала „cvtsudoers“"
 
-#: plugins/sudoers/visudo.c:278 plugins/sudoers/visudo.c:660
+#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659
 #, c-format
 msgid "press return to edit %s: "
 msgstr "притисните „унеси“ да уредите „%s“: "
 
-#: plugins/sudoers/visudo.c:339
+#: plugins/sudoers/visudo.c:340
 #, c-format
 msgid "specified editor (%s) doesn't exist"
 msgstr "наведени уређивач (%s) не постоји"
 
-#: plugins/sudoers/visudo.c:341
+#: plugins/sudoers/visudo.c:342
 #, c-format
 msgid "no editor found (editor path = %s)"
 msgstr "нисам пронашао уређивача (путања уређивача = %s)"
 
-#: plugins/sudoers/visudo.c:451 plugins/sudoers/visudo.c:459
+#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460
 msgid "write error"
 msgstr "грешка писања"
 
-#: plugins/sudoers/visudo.c:505
+#: plugins/sudoers/visudo.c:506
 #, c-format
 msgid "unable to stat temporary file (%s), %s unchanged"
 msgstr "не могу да добавим податке привремене датотеке (%s), %s је неизмењено"
 
-#: plugins/sudoers/visudo.c:512
+#: plugins/sudoers/visudo.c:513
 #, c-format
 msgid "zero length temporary file (%s), %s unchanged"
 msgstr "привремена датотека нулте дужине (%s), %s је неизмењено"
 
-#: plugins/sudoers/visudo.c:518
+#: plugins/sudoers/visudo.c:519
 #, c-format
 msgid "editor (%s) failed, %s unchanged"
 msgstr "уређивач (%s) није успео, %s је неизмењено"
 
-#: plugins/sudoers/visudo.c:540
+#: plugins/sudoers/visudo.c:541
 #, c-format
 msgid "%s unchanged"
 msgstr "„%s“ је неизмењено"
 
-#: plugins/sudoers/visudo.c:599
+#: plugins/sudoers/visudo.c:598
 #, c-format
 msgid "unable to re-open temporary file (%s), %s unchanged."
 msgstr "не могу поново да отворим привремену датотеку (%s), %s је неизмењено."
 
-#: plugins/sudoers/visudo.c:611
+#: plugins/sudoers/visudo.c:610
 #, c-format
 msgid "unable to parse temporary file (%s), unknown error"
 msgstr "не могу да обрадим привремену датотеку (%s), непозната грешка"
 
-#: plugins/sudoers/visudo.c:649
+#: plugins/sudoers/visudo.c:648
 #, c-format
 msgid "internal error, unable to find %s in list!"
 msgstr "унутрашња грешка, не могу да пронађем „%s“ на списку!"
 
-#: plugins/sudoers/visudo.c:729 plugins/sudoers/visudo.c:738
+#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737
 #, c-format
 msgid "unable to set (uid, gid) of %s to (%u, %u)"
 msgstr "не могу да подесим (јиб, гиб) за %s на (%u, %u)"
 
-#: plugins/sudoers/visudo.c:761
+#: plugins/sudoers/visudo.c:760
 #, c-format
 msgid "%s and %s not on the same file system, using mv to rename"
 msgstr "„%s“ и „%s“ нису на истом систему датотека, користим „mv“ за преименовање"
 
-#: plugins/sudoers/visudo.c:775
+#: plugins/sudoers/visudo.c:774
 #, c-format
 msgid "command failed: '%s %s %s', %s unchanged"
 msgstr "наредба није успела: „%s %s %s“, %s је неизмењено"
 
-#: plugins/sudoers/visudo.c:785
+#: plugins/sudoers/visudo.c:784
 #, c-format
 msgid "error renaming %s, %s unchanged"
 msgstr "грешка преименовања „%s“, %s је неизмењено"
 
-#: plugins/sudoers/visudo.c:806
+#: plugins/sudoers/visudo.c:805
 msgid "What now? "
 msgstr "Шта сада? "
 
-#: plugins/sudoers/visudo.c:820
+#: plugins/sudoers/visudo.c:819
 msgid ""
 "Options are:\n"
 "  (e)dit sudoers file again\n"
@@ -2887,66 +2968,66 @@ msgstr ""
 "  x — излази без чувања измена у датотеци судоерса\n"
 "  Q — прекида и чува измене у датотеци судоерса (ОПАСНО!)\n"
 
-#: plugins/sudoers/visudo.c:866
+#: plugins/sudoers/visudo.c:865
 #, c-format
 msgid "unable to run %s"
 msgstr "не могу да покренем %s"
 
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/visudo.c:895
 #, c-format
 msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n"
 msgstr "%s: погрешан власник (јиб, гиб) треба бити (%u, %u)\n"
 
-#: plugins/sudoers/visudo.c:903
+#: plugins/sudoers/visudo.c:902
 #, c-format
 msgid "%s: bad permissions, should be mode 0%o\n"
 msgstr "%s: лоша овлашћења, требају бити у режиму 0%o\n"
 
-#: plugins/sudoers/visudo.c:960 plugins/sudoers/visudo.c:967
+#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958
 #, c-format
 msgid "%s: parsed OK\n"
 msgstr "%s: успешно је обрађено\n"
 
-#: plugins/sudoers/visudo.c:986
+#: plugins/sudoers/visudo.c:977
 #, c-format
 msgid "%s busy, try again later"
 msgstr "„%s“ је заузет, покушајте касније"
 
-#: plugins/sudoers/visudo.c:989
+#: plugins/sudoers/visudo.c:980
 #, c-format
 msgid "unable to lock %s"
 msgstr "не могу да закључам „%s“"
 
-#: plugins/sudoers/visudo.c:990
+#: plugins/sudoers/visudo.c:981
 msgid "Edit anyway? [y/N]"
 msgstr "Да ипак уреим? [д/Н]"
 
-#: plugins/sudoers/visudo.c:1083
+#: plugins/sudoers/visudo.c:1091
 #, c-format
-msgid "Error: %s:%d cycle in %s \"%s\""
-msgstr "Грешка: %s:%d циклус у „%s“ „%s“"
+msgid "Error: %s:%d:%d: cycle in %s \"%s\""
+msgstr "Грешка: %s:%d:%d: циклус у „%s“ „%s“"
 
-#: plugins/sudoers/visudo.c:1084
+#: plugins/sudoers/visudo.c:1092
 #, c-format
-msgid "Warning: %s:%d cycle in %s \"%s\""
-msgstr "Упозорење: %s:%d циклус у „%s“ „%s“"
+msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
+msgstr "Упозорење: %s:%d:%d: циклус у „%s“ „%s“"
 
-#: plugins/sudoers/visudo.c:1088
+#: plugins/sudoers/visudo.c:1096
 #, c-format
-msgid "Error: %s:%d %s \"%s\" referenced but not defined"
-msgstr "Грешка: %s:%d упута за „%s“ „%s“ постоји али није одређена"
+msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
+msgstr "Грешка: %s:%d:%d: упута за „%s“ „%s“ постоји али није одређена"
 
-#: plugins/sudoers/visudo.c:1089
+#: plugins/sudoers/visudo.c:1097
 #, c-format
-msgid "Warning: %s:%d %s \"%s\" referenced but not defined"
-msgstr "Упозорење: %s:%d упута за „%s“ „%s“ постоји али није одређена"
+msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined"
+msgstr "Упозорење: %s:%d:%d: упута за „%s“ „%s“ постоји али није одређена"
 
-#: plugins/sudoers/visudo.c:1180
+#: plugins/sudoers/visudo.c:1188
 #, c-format
-msgid "Warning: %s:%d unused %s \"%s\""
-msgstr "Упозорење: %s:%d некоришћено „%s“ „%s“"
+msgid "Warning: %s:%d:%d: unused %s \"%s\""
+msgstr "Упозорење: %s:%d:%d: некоришћено „%s“ „%s“"
 
-#: plugins/sudoers/visudo.c:1295
+#: plugins/sudoers/visudo.c:1303
 #, c-format
 msgid ""
 "%s - safely edit the sudoers file\n"
@@ -2955,7 +3036,7 @@ msgstr ""
 "%s — безбедно уређује датотеку судоерса\n"
 "\n"
 
-#: plugins/sudoers/visudo.c:1297
+#: plugins/sudoers/visudo.c:1305
 msgid ""
 "\n"
 "Options:\n"
@@ -2975,10 +3056,43 @@ msgstr ""
 "  -s, --strict          строга провера синтаксе\n"
 "  -V, --version         приказује податке о издању и излази\n"
 
-#: toke.l:1032
+#: toke.l:179
+msgid "empty string"
+msgstr "празна ниска"
+
+#: toke.l:189 toke.l:491
+msgid "empty group"
+msgstr "празна група"
+
+#: toke.l:197 toke.l:489
+msgid "empty netgroup"
+msgstr "празна мрежна група"
+
+#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392
+msgid "invalid line continuation"
+msgstr "неисправан наставак реда"
+
+#: toke.l:528 toke.l:540
+msgid "invalid IPv6 address"
+msgstr "неисправна ИПв6 адреса"
+
+#: toke.l:764
+msgid "unexpected line break in string"
+msgstr "неочекивани прекид реда у нисци"
+
+#: toke.l:1084
 msgid "too many levels of includes"
 msgstr "превише нивоа укључивања"
 
+#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library"
+#~ msgstr "Унапред учитава лажне функције извршавања које се налазе у библиотеци „sudo_noexec“"
+
+#~ msgid "sudo_ldap_conf_add_ports: port too large"
+#~ msgstr "sudo_ldap_conf_add_ports: прикључник је превелик"
+
+#~ msgid "unable to lock log file: %s"
+#~ msgstr "не могу да закључам датотеку дневника: %s"
+
 #~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n"
 #~ msgstr "„SSL_повезивање“ није успело: ssl_грешка=%d, спремник=%s\n"
 
index 4b3bb80..e63b49b 100644 (file)
@@ -5,9 +5,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: sudo 1.9.4\n"
+"Project-Id-Version: sudo 1.9.5\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-11-14 06:24-0700\n"
+"POT-Creation-Date: 2021-01-09 12:59-0700\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:1077
+#: confstr.sh:1 gram.y:1075
 msgid "syntax error"
 msgstr ""
 
@@ -41,163 +41,167 @@ msgstr ""
 msgid "Sorry, try again."
 msgstr ""
 
-#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 gram.y:334
-#: gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 gram.y:455 gram.y:464
-#: gram.y:475 gram.y:510 gram.y:517 gram.y:524 gram.y:531 gram.y:558 gram.y:654
-#: gram.y:661 gram.y:670 gram.y:679 gram.y:696 gram.y:834 gram.y:841 gram.y:849
-#: gram.y:855 gram.y:971 gram.y:978 gram.y:985 gram.y:992 gram.y:999
-#: gram.y:1025 gram.y:1032 gram.y:1039 gram.y:1236 gram.y:1526
-#: lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:352
-#: lib/eventlog/eventlog.c:753 lib/eventlog/eventlog.c:817
-#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998
+#: gram.y:224 gram.y:290 gram.y:297 gram.y:304 gram.y:311 gram.y:318 gram.y:338
+#: gram.y:362 gram.y:369 gram.y:376 gram.y:383 gram.y:390 gram.y:459 gram.y:468
+#: gram.y:479 gram.y:514 gram.y:521 gram.y:528 gram.y:535 gram.y:562 gram.y:658
+#: gram.y:665 gram.y:674 gram.y:683 gram.y:700 gram.y:838 gram.y:845 gram.y:853
+#: gram.y:859 gram.y:967 gram.y:974 gram.y:981 gram.y:988 gram.y:995
+#: gram.y:1021 gram.y:1028 gram.y:1035 gram.y:1123 gram.y:1244 gram.y:1534
+#: lib/eventlog/eventlog.c:288 lib/eventlog/eventlog.c:360
+#: lib/eventlog/eventlog.c:761 lib/eventlog/eventlog.c:825
+#: lib/eventlog/eventlog.c:1070 lib/iolog/iolog_fileio.c:998
 #: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:305
 #: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457
 #: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115
 #: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133
 #: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480
-#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134
-#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115
-#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143
-#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144
-#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
-#: plugins/sudoers/auth/sia.c:59 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:641
-#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764
-#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182
-#: plugins/sudoers/cvtsudoers.c:1284 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:630 plugins/sudoers/defaults.c:923
-#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181
-#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92
-#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596
-#: plugins/sudoers/iolog.c:613 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:603 plugins/sudoers/linux_audit.c:84
-#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381
-#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706
-#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
-#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
-#: 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:281
-#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499
-#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93
-#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213
-#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244
-#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275
-#: 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:594 plugins/sudoers/parse_ldif.c:624
-#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707
-#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752
-#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526
-#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
-#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
-#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
-#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
-#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
-#: 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/stubs.c:110 plugins/sudoers/stubs.c:118
-#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326
-#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381
-#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433
-#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927
-#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265
-#: 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:128
-#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432
-#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986
-#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104
-#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
-#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329
-#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615
-#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008
-#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091
+#: plugins/sudoers/audit.c:115 plugins/sudoers/audit.c:265
+#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118
+#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669
+#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
+#: 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:641 plugins/sudoers/cvtsudoers.c:756
+#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1178
+#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284
+#: 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:634
+#: plugins/sudoers/defaults.c:927 plugins/sudoers/defaults.c:1102
+#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261
+#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
+#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56
+#: plugins/sudoers/group_plugin.c:133 plugins/sudoers/interfaces.c:72
+#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613
+#: 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:603
+#: 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:1951
+#: plugins/sudoers/log_client.c:2008 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:277 plugins/sudoers/match_command.c:445
+#: plugins/sudoers/match_command.c:495 plugins/sudoers/match_command.c:569
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:199
+#: plugins/sudoers/parse.c:213 plugins/sudoers/parse.c:230
+#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:264
+#: plugins/sudoers/parse.c:275 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:594
+#: plugins/sudoers/parse_ldif.c:624 plugins/sudoers/parse_ldif.c:649
+#: plugins/sudoers/parse_ldif.c:707 plugins/sudoers/parse_ldif.c:724
+#: plugins/sudoers/parse_ldif.c:752 plugins/sudoers/parse_ldif.c:759
+#: plugins/sudoers/policy.c:526 plugins/sudoers/policy.c:874
+#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:194
+#: plugins/sudoers/pwutil.c:265 plugins/sudoers/pwutil.c:343
+#: plugins/sudoers/pwutil.c:517 plugins/sudoers/pwutil.c:581
+#: plugins/sudoers/pwutil.c:652 plugins/sudoers/pwutil.c:811
+#: plugins/sudoers/pwutil.c:867 plugins/sudoers/pwutil.c:911
+#: plugins/sudoers/pwutil.c:968 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/stubs.c:110
+#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:298
+#: plugins/sudoers/sudoers.c:324 plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:379 plugins/sudoers/sudoers.c:389
+#: plugins/sudoers/sudoers.c:431 plugins/sudoers/sudoers.c:792
+#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961
+#: plugins/sudoers/sudoers.c:1265 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:128 plugins/sudoers/testsudoers.c:228
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587
+#: plugins/sudoers/timestamp.c:422 plugins/sudoers/timestamp.c:466
+#: plugins/sudoers/timestamp.c:967 plugins/sudoers/toke_util.c:51
+#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:129
+#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123
+#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323
+#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439
+#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935
+#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:916
+#: toke.l:1036 toke.l:1094
 msgid "unable to allocate memory"
 msgstr ""
 
-#: gram.y:552
+#: gram.y:556
 msgid "a digest requires a path name"
 msgstr ""
 
-#: gram.y:581
+#: gram.y:585
 msgid "values for \"CWD\" must start with a '/', '~', or '*'"
 msgstr ""
 
-#: gram.y:593
+#: gram.y:597
 msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
 msgstr ""
 
-#: gram.y:715
+#: gram.y:719
 #, c-format
 msgid "syntax error, reserved word %s used as an alias name"
 msgstr ""
 
-#: gram.y:735
+#: gram.y:739
 msgid "invalid notbefore value"
 msgstr ""
 
-#: gram.y:743
+#: gram.y:747
 msgid "invalid notafter value"
 msgstr ""
 
-#: gram.y:752 plugins/sudoers/policy.c:335
+#: gram.y:756 plugins/sudoers/policy.c:335
 msgid "timeout value too large"
 msgstr ""
 
-#: gram.y:754 plugins/sudoers/policy.c:337
+#: gram.y:758 plugins/sudoers/policy.c:337
 msgid "invalid timeout value"
 msgstr ""
 
-#: gram.y:1079
+#: gram.y:1077
 #, c-format
 msgid "%s:%d:%d: %s\n"
 msgstr ""
 
-#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753
-#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816
-#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998
+#: gram.y:1121
+#, c-format
+msgid "Alias \"%s\" already defined"
+msgstr ""
+
+#: gram.y:1534 lib/eventlog/eventlog.c:288 lib/eventlog/eventlog.c:761
+#: lib/eventlog/eventlog.c:823 lib/eventlog/eventlog.c:824
+#: lib/eventlog/eventlog.c:1070 lib/iolog/iolog_fileio.c:998
 #: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304
 #: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457
 #: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106
 #: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
 #: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
-#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293
-#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321
+#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1290 logsrvd/logsrvd.c:1303
+#: logsrvd/logsrvd.c:1348 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321
 #: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115
-#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482
+#: plugins/sudoers/audit.c:265 plugins/sudoers/auth/pam.c:482
 #: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
 #: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159
 #: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187
@@ -212,8 +216,8 @@ msgstr ""
 #: 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:630
-#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098
+#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:634
+#: plugins/sudoers/defaults.c:927 plugins/sudoers/defaults.c:1102
 #: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261
 #: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
 #: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56
@@ -233,17 +237,17 @@ msgstr ""
 #: 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:603
-#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105
+#: 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:688 plugins/sudoers/log_client.c:706
-#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
-#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:1951 plugins/sudoers/log_client.c:2008
 #: 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:280 plugins/sudoers/match_command.c:448
-#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573
+#: plugins/sudoers/match_command.c:276 plugins/sudoers/match_command.c:444
+#: plugins/sudoers/match_command.c:494 plugins/sudoers/match_command.c:569
 #: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198
 #: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229
 #: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263
@@ -276,30 +280,30 @@ msgstr ""
 #: 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/stubs.c:110
-#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300
-#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370
-#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391
-#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794
+#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:298
+#: plugins/sudoers/sudoers.c:324 plugins/sudoers/sudoers.c:368
+#: plugins/sudoers/sudoers.c:379 plugins/sudoers/sudoers.c:389
+#: plugins/sudoers/sudoers.c:431 plugins/sudoers/sudoers.c:792
 #: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961
 #: plugins/sudoers/sudoers.c:1265 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:128 plugins/sudoers/testsudoers.c:228
 #: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587
-#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476
-#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51
+#: plugins/sudoers/timestamp.c:422 plugins/sudoers/timestamp.c:466
+#: plugins/sudoers/timestamp.c:967 plugins/sudoers/toke_util.c:51
 #: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128
 #: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123
 #: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323
 #: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439
 #: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935
-#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913
-#: toke.l:1033 toke.l:1091
+#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:916
+#: toke.l:1036 toke.l:1094
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463
+#: lib/eventlog/eventlog.c:293 lib/iolog/iolog_json.c:463
 #: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468
 #: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244
 #: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571
@@ -307,7 +311,7 @@ msgstr ""
 #: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618
 #: 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:90
+#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:92
 #: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711
 #: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161
 #: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249
@@ -316,36 +320,36 @@ msgstr ""
 msgid "internal error, %s overflow"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:343
+#: lib/eventlog/eventlog.c:351
 #, c-format
 msgid "unable to dup stdin: %m"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:388
+#: lib/eventlog/eventlog.c:396
 #, c-format
 msgid "unable to execute %s: %m"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198
+#: lib/eventlog/eventlog.c:436 plugins/sudoers/auth/aix_auth.c:198
 msgid "unable to fork"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490
+#: lib/eventlog/eventlog.c:444 lib/eventlog/eventlog.c:498
 #, c-format
 msgid "unable to fork: %m"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:480
+#: lib/eventlog/eventlog.c:488
 #, c-format
 msgid "unable to open pipe: %m"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:894
+#: lib/eventlog/eventlog.c:902
 #, c-format
 msgid "%8s : %s"
 msgstr ""
 
-#: lib/eventlog/eventlog.c:923
+#: lib/eventlog/eventlog.c:931
 #, c-format
 msgid "%8s : (command continued) %s"
 msgstr ""
@@ -484,141 +488,141 @@ msgstr ""
 msgid "unable to find resume point [%lld, %ld] in %s/%s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394
-#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568
-#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632
+#: logsrvd/logsrvd.c:294 logsrvd/logsrvd.c:357 logsrvd/logsrvd.c:398
+#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:521 logsrvd/logsrvd.c:572
+#: logsrvd/logsrvd.c:604 logsrvd/logsrvd.c:636
 msgid "state machine error"
 msgstr ""
 
-#: logsrvd/logsrvd.c:299
+#: logsrvd/logsrvd.c:303
 msgid "invalid AcceptMessage"
 msgstr ""
 
-#: logsrvd/logsrvd.c:307
+#: logsrvd/logsrvd.c:311
 msgid "error parsing AcceptMessage"
 msgstr ""
 
-#: logsrvd/logsrvd.c:314
+#: logsrvd/logsrvd.c:318
 msgid "error creating I/O log"
 msgstr ""
 
-#: logsrvd/logsrvd.c:321
+#: logsrvd/logsrvd.c:325
 msgid "error logging accept event"
 msgstr ""
 
-#: logsrvd/logsrvd.c:362
+#: logsrvd/logsrvd.c:366
 msgid "invalid RejectMessage"
 msgstr ""
 
-#: logsrvd/logsrvd.c:370
+#: logsrvd/logsrvd.c:374
 msgid "error parsing RejectMessage"
 msgstr ""
 
-#: logsrvd/logsrvd.c:376
+#: logsrvd/logsrvd.c:380
 msgid "error logging reject event"
 msgstr ""
 
-#: logsrvd/logsrvd.c:486
+#: logsrvd/logsrvd.c:490
 msgid "invalid AlertMessage"
 msgstr ""
 
-#: logsrvd/logsrvd.c:494
+#: logsrvd/logsrvd.c:498
 msgid "error parsing AlertMessage"
 msgstr ""
 
-#: logsrvd/logsrvd.c:502
+#: logsrvd/logsrvd.c:506
 msgid "error logging alert event"
 msgstr ""
 
-#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606
+#: logsrvd/logsrvd.c:527 logsrvd/logsrvd.c:578 logsrvd/logsrvd.c:610
 msgid "protocol error"
 msgstr ""
 
-#: logsrvd/logsrvd.c:533
+#: logsrvd/logsrvd.c:537
 msgid "error writing IoBuffer"
 msgstr ""
 
-#: logsrvd/logsrvd.c:585
+#: logsrvd/logsrvd.c:589
 msgid "error writing ChangeWindowSize"
 msgstr ""
 
-#: logsrvd/logsrvd.c:617
+#: logsrvd/logsrvd.c:621
 msgid "error writing CommandSuspend"
 msgstr ""
 
-#: logsrvd/logsrvd.c:702
+#: logsrvd/logsrvd.c:706
 msgid "unrecognized ClientMessage type"
 msgstr ""
 
-#: logsrvd/logsrvd.c:967
+#: logsrvd/logsrvd.c:977
 msgid "client message too large"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205
+#: logsrvd/logsrvd.c:1207 logsrvd/logsrvd.c:1215
 #, c-format
 msgid "unable to set TLS 1.2 ciphersuite to %s: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233
+#: logsrvd/logsrvd.c:1235 logsrvd/logsrvd.c:1243
 #, c-format
 msgid "unable to set TLS 1.3 ciphersuite to %s: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1269
+#: logsrvd/logsrvd.c:1279
 #, c-format
 msgid "unable to get TLS server method: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1274
+#: logsrvd/logsrvd.c:1284
 #, c-format
 msgid "unable to create TLS context: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236
+#: logsrvd/logsrvd.c:1291 plugins/sudoers/log_client.c:236
 #, c-format
 msgid "unable to load certificate %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216
+#: logsrvd/logsrvd.c:1304 plugins/sudoers/log_client.c:216
 #, c-format
 msgid "unable to load certificate authority bundle %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249
+#: logsrvd/logsrvd.c:1349 plugins/sudoers/log_client.c:249
 #, c-format
 msgid "unable to load private key %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365
+#: logsrvd/logsrvd.c:1366 logsrvd/logsrvd.c:1375
 #, c-format
 msgid "unable to set diffie-hellman parameters: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1378
+#: logsrvd/logsrvd.c:1388
 #, c-format
 msgid "unable to set minimum protocol version to TLS 1.2: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1563
+#: logsrvd/logsrvd.c:1573
 msgid "unable to get remote IP addr"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263
+#: logsrvd/logsrvd.c:1601 plugins/sudoers/log_client.c:263
 #, c-format
 msgid "Unable to attach user data to the ssl object: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823
+#: logsrvd/logsrvd.c:1609 logsrvd/logsrvd.c:1731 logsrvd/logsrvd.c:1833
 #: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496
 #: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956
 #: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187
 #: 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:587 plugins/sudoers/log_client.c:594
-#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376
-#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425
-#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692
-#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015
+#: 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:2016 plugins/sudoers/log_client.c:2024
 #: 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
@@ -628,18 +632,18 @@ msgstr ""
 msgid "unable to add event to queue"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011
+#: logsrvd/logsrvd.c:1785 logsrvd/logsrvd.c:2027
 msgid "unable setup listen socket"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124
+#: logsrvd/logsrvd.c:1933 logsrvd/sendlog.c:124
 #, c-format
 msgid ""
 "%s - send sudo I/O log to remote server\n"
 "\n"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1920
+#: logsrvd/logsrvd.c:1936
 msgid ""
 "\n"
 "Options:\n"
@@ -650,16 +654,16 @@ msgid ""
 "  -V, --version            display version information and exit\n"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719
+#: logsrvd/logsrvd.c:1988 logsrvd/sendlog.c:1719
 msgid "Protobuf-C version 1.3 or higher required"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1990
+#: logsrvd/logsrvd.c:2006
 #, c-format
 msgid "invalid random drop value: %s"
 msgstr ""
 
-#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769
+#: logsrvd/logsrvd.c:2010 logsrvd/sendlog.c:1769
 #: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299
 #: plugins/sudoers/visudo.c:177
 #, c-format
@@ -675,48 +679,48 @@ msgstr ""
 msgid "%s:%s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653
+#: logsrvd/logsrvd_conf.c:410 logsrvd/logsrvd_conf.c:655
 #, c-format
 msgid "%s: not a fully qualified path"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:767
+#: logsrvd/logsrvd_conf.c:769
 #, c-format
 msgid "%s:%d unmatched '[': %s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:778
+#: logsrvd/logsrvd_conf.c:780
 #, c-format
 msgid "%s:%d invalid config section: %s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:786
+#: logsrvd/logsrvd_conf.c:788
 #, c-format
 msgid "%s:%d invalid configuration line: %s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:792
+#: logsrvd/logsrvd_conf.c:794
 #, c-format
 msgid "%s:%d expected section name: %s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:806
+#: logsrvd/logsrvd_conf.c:808
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:814
+#: logsrvd/logsrvd_conf.c:816
 #, c-format
 msgid "%s:%d unknown key: %s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:1003
+#: logsrvd/logsrvd_conf.c:1005
 #, c-format
 msgid "unknown syslog facility %s"
 msgstr ""
 
-#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011
-#: logsrvd/logsrvd_conf.c:1015
+#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1013
+#: logsrvd/logsrvd_conf.c:1017
 #, c-format
 msgid "unknown syslog priority %s"
 msgstr ""
@@ -756,7 +760,7 @@ msgstr ""
 msgid "unable to read %s/%s: %s"
 msgstr ""
 
-#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694
+#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:692
 #, c-format
 msgid "client message too large: %zu"
 msgstr ""
@@ -773,31 +777,31 @@ msgid "unexpected I/O event %d"
 msgstr ""
 
 #: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959
-#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386
-#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490
+#: plugins/sudoers/log_client.c:1124 plugins/sudoers/log_client.c:1392
+#: plugins/sudoers/log_client.c:1460 plugins/sudoers/log_client.c:1496
 #, c-format
 msgid "%s: unexpected state %d"
 msgstr ""
 
-#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460
+#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1466
 msgid "invalid ServerHello"
 msgstr ""
 
-#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534
+#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1540
 #, c-format
 msgid "error message received from server: %s"
 msgstr ""
 
-#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547
+#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1553
 #, c-format
 msgid "abort message received from server: %s"
 msgstr ""
 
-#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566
+#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1572
 msgid "unable to unpack ServerMessage"
 msgstr ""
 
-#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597
+#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1603
 #, c-format
 msgid "%s: unexpected type_case value %d"
 msgstr ""
@@ -810,7 +814,7 @@ msgstr ""
 msgid "premature EOF"
 msgstr ""
 
-#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751
+#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1760
 #, c-format
 msgid "server message too large: %u"
 msgstr ""
@@ -871,14 +875,9 @@ msgstr ""
 msgid "commit point received from server [%lld, %ld]"
 msgstr ""
 
-#: plugins/sudoers/alias.c:148
-#, c-format
-msgid "Alias \"%s\" already defined"
-msgstr ""
-
-#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343
-#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002
-#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/audit.c:261 plugins/sudoers/audit.c:400
+#: 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:114
 msgid "unable to get time of day"
 msgstr ""
@@ -1093,7 +1092,27 @@ msgstr ""
 msgid "unable to commit audit record"
 msgstr ""
 
-#: plugins/sudoers/check.c:258
+#: plugins/sudoers/check.c:264
+#, c-format
+msgid "error reading lecture file %s"
+msgstr ""
+
+#: plugins/sudoers/check.c:270
+#, c-format
+msgid "ignoring lecture file %s: not a regular file"
+msgstr ""
+
+#: plugins/sudoers/check.c:274 plugins/sudoers/cvtsudoers.c:617
+#: plugins/sudoers/cvtsudoers.c:634 plugins/sudoers/cvtsudoers.c:1244
+#: plugins/sudoers/cvtsudoers_json.c:872 plugins/sudoers/cvtsudoers_ldif.c:688
+#: plugins/sudoers/sudoers.c:1053 plugins/sudoers/sudoreplay.c:1435
+#: plugins/sudoers/timestamp.c:431 plugins/sudoers/tsdump.c:128
+#: plugins/sudoers/visudo.c:922
+#, c-format
+msgid "unable to open %s"
+msgstr ""
+
+#: plugins/sudoers/check.c:283
 msgid ""
 "\n"
 "We trust you have received the usual lecture from the local System\n"
@@ -1105,16 +1124,16 @@ msgid ""
 "\n"
 msgstr ""
 
-#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311
-#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858
+#: plugins/sudoers/check.c:325 plugins/sudoers/check.c:335
+#: plugins/sudoers/sudoers.c:835 plugins/sudoers/sudoers.c:856
 #: plugins/sudoers/tsdump.c:119
 #, c-format
 msgid "unknown uid: %u"
 msgstr ""
 
-#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85
-#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088
-#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307
+#: plugins/sudoers/check.c:330 plugins/sudoers/exptilde.c:85
+#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1091
+#: plugins/sudoers/sudoers.c:438 plugins/sudoers/sudoers.c:1307
 #: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386
 #, c-format
 msgid "unknown user: %s"
@@ -1155,7 +1174,7 @@ msgstr ""
 msgid "%s: input and output files must be different"
 msgstr ""
 
-#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178
+#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:176
 #: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249
 #: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926
 msgid "unable to initialize sudoers default values"
@@ -1186,15 +1205,6 @@ msgstr ""
 msgid "invalid filter: %s"
 msgstr ""
 
-#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634
-#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872
-#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053
-#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
 #: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931
 #, c-format
 msgid "failed to parse %s file, unknown error"
@@ -1211,7 +1221,7 @@ msgid "parse error in %s\n"
 msgstr ""
 
 #: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124
-#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328
+#: plugins/sudoers/timestamp.c:315 plugins/sudoers/timestamp.c:318
 #, c-format
 msgid "unable to write to %s"
 msgstr ""
@@ -1862,6 +1872,10 @@ msgstr ""
 msgid "The format of logs to produce: %s"
 msgstr ""
 
+#: plugins/sudoers/def_data.c:574
+msgid "Enable SELinux RBAC support"
+msgstr ""
+
 #: plugins/sudoers/defaults.c:185
 #, c-format
 msgid "%s:%d:%d: unknown defaults entry \"%s\""
@@ -1912,22 +1926,22 @@ msgstr ""
 msgid "%s: value \"%s\" is invalid for option \"%s\""
 msgstr ""
 
-#: plugins/sudoers/defaults.c:1030
+#: plugins/sudoers/defaults.c:1034
 #, c-format
 msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"
 msgstr ""
 
-#: plugins/sudoers/defaults.c:1034
+#: plugins/sudoers/defaults.c:1038
 #, c-format
 msgid "%s: values for \"%s\" must start with a '/', '~', or '*'"
 msgstr ""
 
-#: plugins/sudoers/defaults.c:1045
+#: plugins/sudoers/defaults.c:1049
 #, c-format
 msgid "%s:%d:%d: values for \"%s\" must start with a '/'"
 msgstr ""
 
-#: plugins/sudoers/defaults.c:1049
+#: plugins/sudoers/defaults.c:1053
 #, c-format
 msgid "%s: values for \"%s\" must start with a '/'"
 msgstr ""
@@ -1936,11 +1950,11 @@ msgstr ""
 msgid "sudo_putenv: corrupted envp, length mismatch"
 msgstr ""
 
-#: plugins/sudoers/env.c:1133
+#: plugins/sudoers/env.c:1135
 msgid "unable to rebuild the environment"
 msgstr ""
 
-#: plugins/sudoers/env.c:1207
+#: plugins/sudoers/env.c:1209
 #, c-format
 msgid ""
 "sorry, you are not allowed to set the following environment variables: %s"
@@ -2005,7 +2019,7 @@ msgstr ""
 msgid "Local IP address and netmask pairs:\n"
 msgstr ""
 
-#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445
+#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:443
 #: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410
 #, c-format
 msgid "unknown group: %s"
@@ -2034,13 +2048,13 @@ msgid "%s: internal error, I/O log file for event %d not open"
 msgstr ""
 
 #: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107
-#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855
-#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493
+#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:836
+#: plugins/sudoers/timestamp.c:928 plugins/sudoers/visudo.c:493
 #: plugins/sudoers/visudo.c:499
 msgid "unable to read the clock"
 msgstr ""
 
-#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193
+#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1199
 #, c-format
 msgid "%s: internal error, invalid signal %d"
 msgstr ""
@@ -2094,16 +2108,16 @@ msgstr ""
 msgid "unable to convert sudoOption: %s%s%s"
 msgstr ""
 
-#: plugins/sudoers/linux_audit.c:58
+#: plugins/sudoers/linux_audit.c:58 plugins/sudoers/linux_audit.c:60
 msgid "unable to open audit system"
 msgstr ""
 
-#: plugins/sudoers/linux_audit.c:101
+#: plugins/sudoers/linux_audit.c:103
 msgid "unable to send audit message"
 msgstr ""
 
 #: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391
-#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023
+#: plugins/sudoers/log_client.c:1437 plugins/sudoers/log_client.c:2032
 msgid "error in event loop"
 msgstr ""
 
@@ -2125,20 +2139,20 @@ msgstr ""
 msgid "TLS handshake was unsuccessful"
 msgstr ""
 
-#: plugins/sudoers/log_client.c:1202
+#: plugins/sudoers/log_client.c:1208
 #, c-format
 msgid "%s: internal error, invalid exit status %d"
 msgstr ""
 
-#: plugins/sudoers/log_client.c:1738
+#: plugins/sudoers/log_client.c:1723 plugins/sudoers/log_client.c:1747
 msgid "lost connection to log server"
 msgstr ""
 
-#: plugins/sudoers/log_client.c:1815
+#: plugins/sudoers/log_client.c:1824
 msgid "missing write buffer"
 msgstr ""
 
-#: plugins/sudoers/log_client.c:1964
+#: plugins/sudoers/log_client.c:1973
 msgid "unable to connect to log server"
 msgstr ""
 
@@ -2174,15 +2188,15 @@ msgstr ""
 msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n"
 msgstr ""
 
-#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583
-#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587
-#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739
-#: plugins/sudoers/sudoers.c:741
+#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:581
+#: plugins/sudoers/sudoers.c:583 plugins/sudoers/sudoers.c:585
+#: plugins/sudoers/sudoers.c:587 plugins/sudoers/sudoers.c:737
+#: plugins/sudoers/sudoers.c:739
 #, c-format
 msgid "%s: command not found"
 msgstr ""
 
-#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579
+#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:577
 #, c-format
 msgid ""
 "ignoring \"%s\" found in '.'\n"
@@ -2204,12 +2218,12 @@ msgstr ""
 msgid "a password is required"
 msgstr ""
 
-#: plugins/sudoers/logging.c:729
+#: plugins/sudoers/logging.c:739
 #, c-format
 msgid "unable to open log file: %s"
 msgstr ""
 
-#: plugins/sudoers/logging.c:762
+#: plugins/sudoers/logging.c:772
 #, c-format
 msgid "unable to write log file: %s"
 msgstr ""
@@ -2319,39 +2333,39 @@ msgstr ""
 msgid "unable to execute %s"
 msgstr ""
 
-#: plugins/sudoers/policy.c:1111
+#: plugins/sudoers/policy.c:1114
 #, c-format
 msgid "Sudoers policy plugin version %s\n"
 msgstr ""
 
-#: plugins/sudoers/policy.c:1113
+#: plugins/sudoers/policy.c:1116
 #, c-format
 msgid "Sudoers file grammar version %d\n"
 msgstr ""
 
-#: plugins/sudoers/policy.c:1117
+#: plugins/sudoers/policy.c:1120
 #, c-format
 msgid ""
 "\n"
 "Sudoers path: %s\n"
 msgstr ""
 
-#: plugins/sudoers/policy.c:1120
+#: plugins/sudoers/policy.c:1123
 #, c-format
 msgid "nsswitch path: %s\n"
 msgstr ""
 
-#: plugins/sudoers/policy.c:1122
+#: plugins/sudoers/policy.c:1125
 #, c-format
 msgid "ldap.conf path: %s\n"
 msgstr ""
 
-#: plugins/sudoers/policy.c:1123
+#: plugins/sudoers/policy.c:1126
 #, c-format
 msgid "ldap.secret path: %s\n"
 msgstr ""
 
-#: plugins/sudoers/policy.c:1156
+#: plugins/sudoers/policy.c:1159
 #, c-format
 msgid "unable to register hook of type %d (version %d.%d)"
 msgstr ""
@@ -2490,81 +2504,81 @@ msgstr ""
 msgid "unable to find symbol \"%s\" in %s"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010
+#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:1010
 msgid "problem with defaults entries"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:218
+#: plugins/sudoers/sudoers.c:216
 msgid "no valid sudoers sources found, quitting"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:292
+#: plugins/sudoers/sudoers.c:290
 #, c-format
 msgid "user not allowed to change root directory to %s"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:294
+#: plugins/sudoers/sudoers.c:292
 #, c-format
 msgid "you are not permitted to use the -R option with %s"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:319
+#: plugins/sudoers/sudoers.c:317
 #, c-format
 msgid "user not allowed to change directory to %s"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:320
+#: plugins/sudoers/sudoers.c:318
 #, c-format
 msgid "you are not permitted to use the -D option with %s"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:351
+#: plugins/sudoers/sudoers.c:349
 msgid "sudoers specifies that root is not allowed to sudo"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:411
+#: plugins/sudoers/sudoers.c:409
 msgid "user not allowed to override closefrom limit"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:412
+#: plugins/sudoers/sudoers.c:410
 msgid "you are not permitted to use the -C option"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:472
+#: plugins/sudoers/sudoers.c:470
 #, c-format
 msgid "timestamp owner (%s): No such user"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:487
+#: plugins/sudoers/sudoers.c:485
 msgid "no tty"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:488
+#: plugins/sudoers/sudoers.c:486
 msgid "sorry, you must have a tty to run sudo"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:495
+#: plugins/sudoers/sudoers.c:493
 #, c-format
 msgid "invalid shell for user %s: %s"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:578
+#: plugins/sudoers/sudoers.c:576
 msgid "command in current directory"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:597
+#: plugins/sudoers/sudoers.c:595
 msgid "user not allowed to set a command timeout"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:599
+#: plugins/sudoers/sudoers.c:597
 msgid "sorry, you are not allowed set a command timeout"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:607
+#: plugins/sudoers/sudoers.c:605
 msgid "user not allowed to preserve the environment"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:609
+#: plugins/sudoers/sudoers.c:607
 msgid "sorry, you are not allowed to preserve the environment"
 msgstr ""
 
@@ -2593,17 +2607,17 @@ msgstr ""
 msgid "%s is not a regular file"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112
+#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1115
 #, c-format
 msgid "%s is owned by uid %u, should be %u"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:1094 toke.l:1117
+#: plugins/sudoers/sudoers.c:1094 toke.l:1120
 #, c-format
 msgid "%s is world writable"
 msgstr ""
 
-#: plugins/sudoers/sudoers.c:1098 toke.l:1120
+#: plugins/sudoers/sudoers.c:1098 toke.l:1123
 #, c-format
 msgid "%s is owned by gid %u, should be %u"
 msgstr ""
@@ -2782,26 +2796,26 @@ msgstr ""
 msgid "%s is group writable"
 msgstr ""
 
-#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680
+#: plugins/sudoers/timestamp.c:326 plugins/sudoers/timestamp.c:661
 #, c-format
 msgid "unable to truncate time stamp file to %lld bytes"
 msgstr ""
 
-#: plugins/sudoers/timestamp.c:866
+#: plugins/sudoers/timestamp.c:847
 msgid "ignoring time stamp from the future"
 msgstr ""
 
-#: plugins/sudoers/timestamp.c:889
+#: plugins/sudoers/timestamp.c:870
 #, c-format
 msgid "time stamp too far in the future: %20.20s"
 msgstr ""
 
-#: plugins/sudoers/timestamp.c:1011
+#: plugins/sudoers/timestamp.c:992
 #, c-format
 msgid "unable to lock time stamp file %s"
 msgstr ""
 
-#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075
+#: plugins/sudoers/timestamp.c:1036 plugins/sudoers/timestamp.c:1056
 #, c-format
 msgid "lecture status path too long: %s/%s"
 msgstr ""
@@ -2982,30 +2996,30 @@ msgid ""
 "  -V, --version            display version information and exit\n"
 msgstr ""
 
-#: toke.l:179
+#: toke.l:182
 msgid "empty string"
 msgstr ""
 
-#: toke.l:189 toke.l:491
+#: toke.l:192 toke.l:494
 msgid "empty group"
 msgstr ""
 
-#: toke.l:197 toke.l:489
+#: toke.l:200 toke.l:492
 msgid "empty netgroup"
 msgstr ""
 
-#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392
+#: toke.l:296 toke.l:308 toke.l:320 toke.l:336 toke.l:355 toke.l:395
 msgid "invalid line continuation"
 msgstr ""
 
-#: toke.l:528 toke.l:540
+#: toke.l:531 toke.l:543
 msgid "invalid IPv6 address"
 msgstr ""
 
-#: toke.l:764
+#: toke.l:767
 msgid "unexpected line break in string"
 msgstr ""
 
-#: toke.l:1084
+#: toke.l:1087
 msgid "too many levels of includes"
 msgstr ""
index 89ee042..a412301 100644 (file)
Binary files a/plugins/sudoers/po/sv.mo and b/plugins/sudoers/po/sv.mo differ
index a2109e8..4943e88 100644 (file)
@@ -6,21 +6,21 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: sudoers 1.9.1b1\n"
+"Project-Id-Version: sudoers 1.9.4b1\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-06-05 10:24-0600\n"
-"PO-Revision-Date: 2020-06-07 19:26+0800\n"
+"POT-Creation-Date: 2020-11-14 06:24-0700\n"
+"PO-Revision-Date: 2020-12-26 03:34+0100\n"
 "Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
-"Language-Team: Swedish <tp-sv-list@lists.sourceforge.net>\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.3.1\n"
+"X-Generator: Poedit 2.4.2\n"
 
-#: confstr.sh:1
+#: confstr.sh:1 gram.y:1077
 msgid "syntax error"
 msgstr "syntaxfel"
 
@@ -44,70 +44,73 @@ msgstr "*** SÄKERHETSINFORMATION för %h ***"
 msgid "Sorry, try again."
 msgstr "Försök igen."
 
-#: gram.y:203 gram.y:251 gram.y:258 gram.y:265 gram.y:272 gram.y:279
-#: gram.y:295 gram.y:319 gram.y:326 gram.y:333 gram.y:340 gram.y:347
-#: gram.y:410 gram.y:419 gram.y:430 gram.y:463 gram.y:470 gram.y:477
-#: gram.y:484 gram.y:511 gram.y:583 gram.y:590 gram.y:599 gram.y:608
-#: gram.y:625 gram.y:737 gram.y:744 gram.y:752 gram.y:758 gram.y:858
-#: gram.y:865 gram.y:872 gram.y:879 gram.y:886 gram.y:912 gram.y:919
-#: gram.y:926 gram.y:1068 gram.y:1347 lib/iolog/iolog_fileio.c:1101
-#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:283
-#: lib/iolog/iolog_json.c:313 lib/iolog/iolog_json.c:435
-#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115
-#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133
-#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196
-#: logsrvd/eventlog.c:223 logsrvd/sendlog.c:443 plugins/sudoers/alias.c:125
-#: plugins/sudoers/alias.c:132 plugins/sudoers/alias.c:148
-#: plugins/sudoers/audit.c:108 plugins/sudoers/audit.c:212
-#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118
-#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669
-#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59
-#: plugins/sudoers/cvtsudoers.c:120 plugins/sudoers/cvtsudoers.c:161
-#: plugins/sudoers/cvtsudoers.c:178 plugins/sudoers/cvtsudoers.c:189
-#: plugins/sudoers/cvtsudoers.c:301 plugins/sudoers/cvtsudoers.c:429
-#: plugins/sudoers/cvtsudoers.c:562 plugins/sudoers/cvtsudoers.c:579
-#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/cvtsudoers.c:757
-#: plugins/sudoers/cvtsudoers.c:765 plugins/sudoers/cvtsudoers.c:1179
-#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285
-#: 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:426 plugins/sudoers/cvtsudoers_ldif.c:434
-#: plugins/sudoers/cvtsudoers_ldif.c:451 plugins/sudoers/cvtsudoers_ldif.c:460
-#: plugins/sudoers/cvtsudoers_ldif.c:607 plugins/sudoers/defaults.c:626
-#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84
-#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261
+#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314
+#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386
+#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524
+#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679
+#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971
+#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032
+#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280
+#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062
+#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120
+#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335
+#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480
+#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134
+#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143
+#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144
+#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
+#: plugins/sudoers/auth/sia.c:59 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:641
+#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764
+#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182
+#: plugins/sudoers/cvtsudoers.c:1284 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:630 plugins/sudoers/defaults.c:923
+#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181
+#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92
 #: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
 #: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483
-#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:382
-#: plugins/sudoers/iolog_client.c:559 plugins/sudoers/iolog_client.c:678
-#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176
-#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723
-#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183
-#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431
-#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743
-#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279
-#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743
-#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959
-#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076
+#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596
+#: plugins/sudoers/iolog.c:613 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:598 plugins/sudoers/linux_audit.c:83
-#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545
-#: plugins/sudoers/logging.c:586 plugins/sudoers/logging.c:723
-#: plugins/sudoers/logging.c:1083 plugins/sudoers/match_command.c:243
-#: plugins/sudoers/match_command.c:391 plugins/sudoers/match_command.c:438
-#: plugins/sudoers/match_command.c:509 plugins/sudoers/match_digest.c:80
-#: plugins/sudoers/parse.c:193 plugins/sudoers/parse.c:205
-#: plugins/sudoers/parse.c:220 plugins/sudoers/parse.c:232
+#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84
+#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381
+#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:281
+#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499
+#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93
+#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213
+#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244
+#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275
 #: 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
@@ -117,115 +120,138 @@ msgstr "Försök igen."
 #: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624
 #: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707
 #: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752
-#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:491
-#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262
-#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514
-#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649
-#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967
-#: plugins/sudoers/sssd.c:146 plugins/sudoers/sssd.c:409
-#: plugins/sudoers/sssd.c:472 plugins/sudoers/sssd.c:516
-#: plugins/sudoers/sssd.c:563 plugins/sudoers/sssd.c:755
-#: plugins/sudoers/stubs.c:96 plugins/sudoers/stubs.c:104
-#: plugins/sudoers/sudoers.c:316 plugins/sudoers/sudoers.c:327
-#: plugins/sudoers/sudoers.c:337 plugins/sudoers/sudoers.c:380
-#: plugins/sudoers/sudoers.c:720 plugins/sudoers/sudoers.c:849
-#: plugins/sudoers/sudoers.c:894 plugins/sudoers/sudoers.c:1198
-#: plugins/sudoers/sudoreplay.c:553 plugins/sudoers/sudoreplay.c:556
-#: plugins/sudoers/sudoreplay.c:1260 plugins/sudoers/sudoreplay.c:1470
-#: plugins/sudoers/sudoreplay.c:1474 plugins/sudoers/testsudoers.c:128
+#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
+#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
+#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
+#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
+#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
+#: 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/stubs.c:110 plugins/sudoers/stubs.c:118
+#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326
+#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381
+#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433
+#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927
+#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265
+#: 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:128
 #: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245
-#: plugins/sudoers/testsudoers.c:581 plugins/sudoers/timestamp.c:432
+#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432
 #: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986
 #: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104
 #: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157
-#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:146
-#: plugins/sudoers/visudo.c:322 plugins/sudoers/visudo.c:328
-#: plugins/sudoers/visudo.c:438 plugins/sudoers/visudo.c:616
-#: plugins/sudoers/visudo.c:936 plugins/sudoers/visudo.c:1024
-#: plugins/sudoers/visudo.c:1121 toke.l:864 toke.l:981 toke.l:1039
+#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145
+#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329
+#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615
+#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008
+#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091
 msgid "unable to allocate memory"
 msgstr "kan inte allokera minne"
 
-#: gram.y:505
+#: gram.y:552
 msgid "a digest requires a path name"
 msgstr "en kontrollsumma kräver ett sökvägsnamn"
 
-#: gram.y:638
+#: gram.y:581
+msgid "values for \"CWD\" must start with a '/', '~', or '*'"
+msgstr "värden för ”CWD” måste börja med ett ”/”, ”~” eller ”*”"
+
+#: gram.y:593
+msgid "values for \"CHROOT\" must start with a '/', '~', or '*'"
+msgstr "värden för ”CHROOT” måste börja med ett ”/”, ”~” eller ”*”"
+
+#: gram.y:715
+#, 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:735
 msgid "invalid notbefore value"
 msgstr "ogiltigt notbefore-värde"
 
-#: gram.y:646
+#: gram.y:743
 msgid "invalid notafter value"
 msgstr "ogiltigt notafter-värde"
 
-#: gram.y:655 plugins/sudoers/policy.c:306
+#: gram.y:752 plugins/sudoers/policy.c:335
 msgid "timeout value too large"
 msgstr "tidsgränsvärde för stort"
 
-#: gram.y:657 plugins/sudoers/policy.c:308
+#: gram.y:754 plugins/sudoers/policy.c:337
 msgid "invalid timeout value"
 msgstr "ogiltigt värde för tidsgräns"
 
-#: gram.y:1347 lib/iolog/iolog_fileio.c:1101 lib/iolog/iolog_json.c:120
-#: lib/iolog/iolog_json.c:282 lib/iolog/iolog_json.c:313
-#: lib/iolog/iolog_json.c:435 lib/iolog/iolog_json.c:713
-#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115
-#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133
-#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196
-#: logsrvd/eventlog.c:223 logsrvd/logsrvd.c:1208 logsrvd/logsrvd.c:1221
-#: logsrvd/logsrvd.c:1266 logsrvd/sendlog.c:443 logsrvd/sendlog.c:1301
-#: logsrvd/sendlog.c:1308 logsrvd/sendlog.c:1726 plugins/sudoers/audit.c:108
-#: plugins/sudoers/audit.c:212 plugins/sudoers/auth/pam.c:482
+#: gram.y:1079
+#, c-format
+msgid "%s:%d:%d: %s\n"
+msgstr "%s:%d:%d: %s\n"
+
+#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753
+#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816
+#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998
+#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304
+#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457
+#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106
+#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125
+#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137
+#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321
+#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115
+#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482
 #: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111
-#: plugins/sudoers/cvtsudoers.c:120 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:642 plugins/sudoers/cvtsudoers.c:757
-#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1179
-#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285
+#: 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:641 plugins/sudoers/cvtsudoers.c:756
+#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178
+#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284
 #: 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:425 plugins/sudoers/cvtsudoers_ldif.c:433
-#: plugins/sudoers/cvtsudoers_ldif.c:450 plugins/sudoers/cvtsudoers_ldif.c:459
-#: plugins/sudoers/cvtsudoers_ldif.c:606 plugins/sudoers/defaults.c:626
-#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052
-#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84
-#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261
-#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70
-#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:132
-#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483
-#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:215
-#: plugins/sudoers/iolog_client.c:236 plugins/sudoers/iolog_client.c:249
-#: plugins/sudoers/iolog_client.c:382 plugins/sudoers/iolog_client.c:678
-#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176
-#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723
-#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183
-#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431
-#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440
-#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743
-#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279
-#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743
-#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959
-#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076
-#: 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:598 plugins/sudoers/linux_audit.c:83
-#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192
-#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545
-#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1083
-#: plugins/sudoers/match_command.c:242 plugins/sudoers/match_command.c:390
-#: plugins/sudoers/match_command.c:437 plugins/sudoers/match_command.c:509
-#: plugins/sudoers/match_digest.c:80 plugins/sudoers/parse.c:192
-#: plugins/sudoers/parse.c:204 plugins/sudoers/parse.c:219
-#: plugins/sudoers/parse.c:231 plugins/sudoers/parse_ldif.c:152
+#: 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:630
+#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098
+#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261
+#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54
+#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56
+#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72
+#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613
+#: 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:603
+#: plugins/sudoers/linux_audit.c:84 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:688 plugins/sudoers/log_client.c:706
+#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620
+#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999
+#: 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:280 plugins/sudoers/match_command.c:448
+#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573
+#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198
+#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229
+#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263
+#: plugins/sudoers/parse.c:274 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
@@ -235,60 +261,112 @@ msgstr "ogiltigt värde för tidsgräns"
 #: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648
 #: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723
 #: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758
-#: plugins/sudoers/policy.c:120 plugins/sudoers/policy.c:129
-#: plugins/sudoers/policy.c:138 plugins/sudoers/policy.c:164
-#: plugins/sudoers/policy.c:291 plugins/sudoers/policy.c:306
-#: plugins/sudoers/policy.c:308 plugins/sudoers/policy.c:337
-#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:389
-#: plugins/sudoers/policy.c:399 plugins/sudoers/policy.c:408
-#: plugins/sudoers/policy.c:417 plugins/sudoers/policy.c:491
-#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93
-#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262
-#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514
-#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649
-#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865
-#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967
+#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148
+#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183
+#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335
+#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366
+#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418
+#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437
+#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526
+#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93
+#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265
+#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517
+#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652
+#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867
+#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968
 #: 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:145
-#: plugins/sudoers/sssd.c:409 plugins/sudoers/sssd.c:472
-#: plugins/sudoers/sssd.c:516 plugins/sudoers/sssd.c:563
-#: plugins/sudoers/sssd.c:755 plugins/sudoers/stubs.c:96
-#: plugins/sudoers/stubs.c:104 plugins/sudoers/sudoers.c:316
-#: plugins/sudoers/sudoers.c:327 plugins/sudoers/sudoers.c:337
-#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:720
-#: plugins/sudoers/sudoers.c:849 plugins/sudoers/sudoers.c:894
-#: plugins/sudoers/sudoers.c:1198 plugins/sudoers/sudoreplay.c:553
-#: plugins/sudoers/sudoreplay.c:556 plugins/sudoers/sudoreplay.c:1260
-#: plugins/sudoers/sudoreplay.c:1470 plugins/sudoers/sudoreplay.c:1474
+#: 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/stubs.c:110
+#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300
+#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370
+#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391
+#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794
+#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961
+#: plugins/sudoers/sudoers.c:1265 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:128 plugins/sudoers/testsudoers.c:228
-#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:581
+#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587
 #: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476
 #: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51
 #: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128
 #: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123
-#: plugins/sudoers/visudo.c:146 plugins/sudoers/visudo.c:322
-#: plugins/sudoers/visudo.c:328 plugins/sudoers/visudo.c:438
-#: plugins/sudoers/visudo.c:616 plugins/sudoers/visudo.c:936
-#: plugins/sudoers/visudo.c:1024 plugins/sudoers/visudo.c:1121 toke.l:864
-#: toke.l:981 toke.l:1039
+#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323
+#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439
+#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935
+#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913
+#: toke.l:1033 toke.l:1091
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: lib/iolog/iolog_fileio.c:157
+#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463
+#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468
+#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244
+#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571
+#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
+#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618
+#: 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:90
+#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711
+#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161
+#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249
+#: plugins/sudoers/toke_util.c:169
+#, c-format
+msgid "internal error, %s overflow"
+msgstr "internt fel, %s spill"
+
+#: lib/eventlog/eventlog.c:343
+#, c-format
+msgid "unable to dup stdin: %m"
+msgstr "kan inte duplicera stdin: %m"
+
+#: lib/eventlog/eventlog.c:388
+#, c-format
+msgid "unable to execute %s: %m"
+msgstr "kan inte köra %s: %m"
+
+#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198
+msgid "unable to fork"
+msgstr "kan inte grena process"
+
+#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490
+#, c-format
+msgid "unable to fork: %m"
+msgstr "kan inte grena process: %m"
+
+#: lib/eventlog/eventlog.c:480
+#, c-format
+msgid "unable to open pipe: %m"
+msgstr "kan inte öppna rör: %m"
+
+#: lib/eventlog/eventlog.c:894
+#, c-format
+msgid "%8s : %s"
+msgstr "%8s : %s"
+
+#: lib/eventlog/eventlog.c:923
+#, c-format
+msgid "%8s : (command continued) %s"
+msgstr "%8s : (kommando fortsätter) %s"
+
+#: lib/iolog/iolog_fileio.c:155
 #, c-format
 msgid "%s exists but is not a directory (0%o)"
 msgstr "%s finns men är inte en katalog (0%o)"
 
-#: lib/iolog/iolog_fileio.c:187 lib/iolog/iolog_fileio.c:233
+#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231
 #: plugins/sudoers/timestamp.c:205
 #, c-format
 msgid "unable to mkdir %s"
 msgstr "kan inte skapa katalogen %s"
 
-#: lib/iolog/iolog_fileio.c:237 plugins/sudoers/visudo.c:733
-#: plugins/sudoers/visudo.c:744
+#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732
+#: plugins/sudoers/visudo.c:743
 #, c-format
 msgid "unable to change mode of %s to 0%o"
 msgstr "kan inte ändra läge för %s till 0%o"
@@ -298,63 +376,45 @@ msgstr "kan inte ändra läge för %s till 0%o"
 msgid "expected JSON_STRING, got %d"
 msgstr "förväntade JSON_STRING, fick %d"
 
-#: lib/iolog/iolog_json.c:305
+#: lib/iolog/iolog_json.c:327
 msgid "missing double quote in name"
 msgstr "saknar citationstecken i namn"
 
-#: lib/iolog/iolog_json.c:392
+#: lib/iolog/iolog_json.c:414
 #, c-format
 msgid "expected JSON_OBJECT, got %d"
 msgstr "förväntade JSON_OBJECT, fick %d"
 
-#: lib/iolog/iolog_json.c:441 lib/iolog/iolog_json.c:444
-#: lib/iolog/iolog_json.c:446 lib/iolog/iolog_json.c:538
-#: logsrvd/eventlog.c:228 plugins/sudoers/cvtsudoers_ldif.c:244
-#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:563
-#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330
-#: plugins/sudoers/env.c:435 plugins/sudoers/iolog.c:561
-#: plugins/sudoers/iolog.c:577 plugins/sudoers/ldap.c:516
-#: plugins/sudoers/ldap.c:747 plugins/sudoers/ldap.c:1080
-#: plugins/sudoers/ldap_conf.c:222 plugins/sudoers/ldap_conf.c:312
-#: plugins/sudoers/linux_audit.c:89 plugins/sudoers/logging.c:1088
-#: plugins/sudoers/policy.c:521 plugins/sudoers/policy.c:668
-#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:161
-#: plugins/sudoers/sudoers.c:916 plugins/sudoers/testsudoers.c:249
-#: plugins/sudoers/toke_util.c:169
-#, c-format
-msgid "internal error, %s overflow"
-msgstr "internt fel, %s spill"
-
-#: lib/iolog/iolog_json.c:607 lib/iolog/iolog_json.c:731
+#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753
 msgid "unmatched close brace"
 msgstr "omatchad avslutningsklammerparentes"
 
-#: lib/iolog/iolog_json.c:616
+#: lib/iolog/iolog_json.c:638
 msgid "unexpected array"
 msgstr "oväntat array"
 
-#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:733
+#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755
 msgid "unmatched close bracket"
 msgstr "omatchad avslutningsklammer"
 
-#: lib/iolog/iolog_json.c:637
+#: lib/iolog/iolog_json.c:659
 msgid "unexpected string"
 msgstr "oväntad sträng"
 
-#: lib/iolog/iolog_json.c:647
+#: lib/iolog/iolog_json.c:669
 msgid "missing colon after name"
 msgstr "saknar kolon efter namn"
 
-#: lib/iolog/iolog_json.c:658 lib/iolog/iolog_json.c:673
-#: lib/iolog/iolog_json.c:688
+#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695
+#: lib/iolog/iolog_json.c:710
 msgid "unexpected boolean"
 msgstr "oväntad boolean"
 
-#: lib/iolog/iolog_json.c:704
+#: lib/iolog/iolog_json.c:726
 msgid "unexpected number"
 msgstr "oväntat nummer"
 
-#: lib/iolog/iolog_json.c:741
+#: lib/iolog/iolog_json.c:763
 #, c-format
 msgid "%s:%u unable to parse \"%s\""
 msgstr "%s:%u kan inte tolka ”%s”"
@@ -399,186 +459,184 @@ msgstr "fel vid inläsning av tidsmätningsfil: %s"
 msgid "invalid timing file line: %s"
 msgstr "ogiltig rad i tidsmätningsfil: %s"
 
-#: logsrvd/eventlog.c:430 plugins/sudoers/logging.c:112
-#, c-format
-msgid "%8s : %s"
-msgstr "%8s : %s"
-
-#: logsrvd/eventlog.c:459 plugins/sudoers/logging.c:136
-#, c-format
-msgid "%8s : (command continued) %s"
-msgstr "%8s : (kommando fortsätter) %s"
-
-#: logsrvd/iolog_writer.c:936
+#: logsrvd/iolog_writer.c:919
 msgid "log is already complete, cannot be restarted"
 msgstr "logg är redan komplett, kan inte startas om"
 
-#: logsrvd/iolog_writer.c:967
+#: logsrvd/iolog_writer.c:950
 msgid "unable to restart log"
 msgstr "kan inte starta om logg"
 
-#: logsrvd/logsrv_util.c:98 logsrvd/logsrv_util.c:105
-#: plugins/sudoers/sudoreplay.c:353 plugins/sudoers/sudoreplay.c:359
+#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106
+#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358
 #, c-format
 msgid "unable to open %s/%s"
 msgstr "kan inte öppna %s/%s"
 
-#: logsrvd/logsrv_util.c:132
+#: logsrvd/logsrv_util.c:133
 #, c-format
 msgid "missing I/O log file %s/%s"
 msgstr "saknar I/O-loggfil %s/%s"
 
-#: logsrvd/logsrv_util.c:139
+#: logsrvd/logsrv_util.c:140
 #, c-format
 msgid "%s/%s: unable to seek forward %zu"
 msgstr "%s/%s: kan inte söka framåt %zu"
 
-#: logsrvd/logsrv_util.c:149
+#: logsrvd/logsrv_util.c:150
 #, c-format
 msgid "unable to find resume point [%lld, %ld] in %s/%s"
 msgstr "kan inte hitta omstartspunkt [%lld, %ld] i %s/%s"
 
-#: logsrvd/logsrvd.c:230 logsrvd/logsrvd.c:299 logsrvd/logsrvd.c:343
-#: logsrvd/logsrvd.c:398 logsrvd/logsrvd.c:445 logsrvd/logsrvd.c:496
-#: logsrvd/logsrvd.c:528 logsrvd/logsrvd.c:560
+#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394
+#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568
+#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632
 msgid "state machine error"
 msgstr "fel i tillståndsmaskin"
 
-#: logsrvd/logsrvd.c:239
+#: logsrvd/logsrvd.c:299
 msgid "invalid AcceptMessage"
 msgstr "ogiltigt AcceptMessage"
 
-#: logsrvd/logsrvd.c:250
+#: logsrvd/logsrvd.c:307
 msgid "error parsing AcceptMessage"
 msgstr "fel vid tolkning av AcceptMessage"
 
-#: logsrvd/logsrvd.c:257
+#: logsrvd/logsrvd.c:314
 msgid "error creating I/O log"
 msgstr "fel vid skapande av I/O-logg"
 
-#: logsrvd/logsrvd.c:265
+#: logsrvd/logsrvd.c:321
 msgid "error logging accept event"
 msgstr "fel vid loggning av acceptanshändelse"
 
-#: logsrvd/logsrvd.c:308
+#: logsrvd/logsrvd.c:362
 msgid "invalid RejectMessage"
 msgstr "ogiltigt RejectMessage"
 
-#: logsrvd/logsrvd.c:319
+#: logsrvd/logsrvd.c:370
 msgid "error parsing RejectMessage"
 msgstr "fel vid tolkning av RejectMessage"
 
-#: logsrvd/logsrvd.c:325
+#: logsrvd/logsrvd.c:376
 msgid "error logging reject event"
 msgstr "fel vid loggning av avböjningshändelse"
 
-#: logsrvd/logsrvd.c:430
+#: logsrvd/logsrvd.c:486
+msgid "invalid AlertMessage"
+msgstr "ogiltigt AlertMessage"
+
+#: logsrvd/logsrvd.c:494
+msgid "error parsing AlertMessage"
+msgstr "fel vid tolkning av AlertMessage"
+
+#: logsrvd/logsrvd.c:502
 msgid "error logging alert event"
 msgstr "fel vid loggning av alarmhändelse"
 
-#: logsrvd/logsrvd.c:451 logsrvd/logsrvd.c:502 logsrvd/logsrvd.c:534
+#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606
 msgid "protocol error"
 msgstr "protokollfel"
 
-#: logsrvd/logsrvd.c:461
+#: logsrvd/logsrvd.c:533
 msgid "error writing IoBuffer"
 msgstr "fel vid skrivning av IoBuffer"
 
-#: logsrvd/logsrvd.c:513
+#: logsrvd/logsrvd.c:585
 msgid "error writing ChangeWindowSize"
 msgstr "fel vid skrivning av ChangeWindowSize"
 
-#: logsrvd/logsrvd.c:545
+#: logsrvd/logsrvd.c:617
 msgid "error writing CommandSuspend"
 msgstr "fel vid skrivning av CommandSuspend"
 
-#: logsrvd/logsrvd.c:630
+#: logsrvd/logsrvd.c:702
 msgid "unrecognized ClientMessage type"
 msgstr "okänd ClientMessage-typ"
 
-#: logsrvd/logsrvd.c:895
+#: logsrvd/logsrvd.c:967
 msgid "client message too large"
 msgstr "klientmeddelande för stort"
 
-#: logsrvd/logsrvd.c:1125 logsrvd/logsrvd.c:1133
+#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205
 #, 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/logsrvd.c:1153 logsrvd/logsrvd.c:1161
+#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233
 #, 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/logsrvd.c:1197
+#: logsrvd/logsrvd.c:1269
 #, c-format
 msgid "unable to get TLS server method: %s"
 msgstr "kan inte hämta TLS-servermetod: %s"
 
-#: logsrvd/logsrvd.c:1202
+#: logsrvd/logsrvd.c:1274
 #, c-format
 msgid "unable to create TLS context: %s"
 msgstr "kan inte skapa TLS-kontext: %s"
 
-#: logsrvd/logsrvd.c:1209 plugins/sudoers/iolog_client.c:237
+#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236
 #, c-format
 msgid "unable to load certificate %s"
 msgstr "kan inte läsa in certifikat %s"
 
-#: logsrvd/logsrvd.c:1222 plugins/sudoers/iolog_client.c:217
+#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216
 #, c-format
 msgid "unable to load certificate authority bundle %s"
 msgstr "kan inte läsa in certifikatauktoritetsbunt %s"
 
-#: logsrvd/logsrvd.c:1267 plugins/sudoers/iolog_client.c:250
+#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249
 #, c-format
 msgid "unable to load private key %s"
 msgstr "kan inte läsa in privat nyckel %s"
 
-#: logsrvd/logsrvd.c:1284 logsrvd/logsrvd.c:1293
+#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365
 #, c-format
 msgid "unable to set diffie-hellman parameters: %s"
 msgstr "kunde inte sätta diffie-hellman-parametrar: %s"
 
-#: logsrvd/logsrvd.c:1306
+#: logsrvd/logsrvd.c:1378
 #, 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/logsrvd.c:1491
+#: logsrvd/logsrvd.c:1563
 msgid "unable to get remote IP addr"
 msgstr "kan inte hämta fjärr-IP-adress"
 
-#: logsrvd/logsrvd.c:1519 plugins/sudoers/iolog_client.c:264
+#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263
 #, 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:1527 logsrvd/logsrvd.c:1649 logsrvd/logsrvd.c:1749
-#: logsrvd/sendlog.c:1105 logsrvd/sendlog.c:1461 logsrvd/sendlog.c:1476
-#: logsrvd/sendlog.c:1534 plugins/sudoers/iolog.c:921
-#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1152
-#: plugins/sudoers/iolog_client.c:109 plugins/sudoers/iolog_client.c:325
-#: plugins/sudoers/iolog_client.c:341 plugins/sudoers/iolog_client.c:387
-#: plugins/sudoers/iolog_client.c:567 plugins/sudoers/iolog_client.c:574
-#: plugins/sudoers/iolog_client.c:1150 plugins/sudoers/iolog_client.c:1186
-#: plugins/sudoers/iolog_client.c:1194 plugins/sudoers/iolog_client.c:1254
-#: plugins/sudoers/iolog_client.c:1361 plugins/sudoers/iolog_client.c:1477
-#: plugins/sudoers/iolog_client.c:1759 plugins/sudoers/iolog_client.c:1767
-#: plugins/sudoers/sudoreplay.c:513 plugins/sudoers/sudoreplay.c:560
-#: plugins/sudoers/sudoreplay.c:792 plugins/sudoers/sudoreplay.c:904
-#: plugins/sudoers/sudoreplay.c:994 plugins/sudoers/sudoreplay.c:1009
-#: plugins/sudoers/sudoreplay.c:1016 plugins/sudoers/sudoreplay.c:1023
-#: plugins/sudoers/sudoreplay.c:1030 plugins/sudoers/sudoreplay.c:1037
-#: plugins/sudoers/sudoreplay.c:1164
+#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823
+#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496
+#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956
+#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187
+#: 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:587 plugins/sudoers/log_client.c:594
+#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376
+#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425
+#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692
+#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015
+#: 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:1703 logsrvd/logsrvd.c:1937
+#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011
 msgid "unable setup listen socket"
 msgstr "kan inte ställa in lyssningsuttag"
 
-#: logsrvd/logsrvd.c:1843 logsrvd/sendlog.c:123
+#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124
 #, c-format
 msgid ""
 "%s - send sudo I/O log to remote server\n"
@@ -587,7 +645,7 @@ msgstr ""
 "%s - skicka sudo I/O-logg till fjärrserver\n"
 "\n"
 
-#: logsrvd/logsrvd.c:1846
+#: logsrvd/logsrvd.c:1920
 msgid ""
 "\n"
 "Options:\n"
@@ -605,78 +663,78 @@ msgstr ""
 "  -R, --random-drop        antal procents chans att anslutningar bryts\n"
 "  -V, --version            visa versionsinformation och avsluta\n"
 
-#: logsrvd/logsrvd.c:1898 logsrvd/sendlog.c:1699
+#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719
 msgid "Protobuf-C version 1.3 or higher required"
 msgstr "Protobuf-C version 1.3 eller högre krävs"
 
-#: logsrvd/logsrvd.c:1916
+#: logsrvd/logsrvd.c:1990
 #, c-format
 msgid "invalid random drop value: %s"
 msgstr "ogiltigt slumpmässigt avbrottsvärde: %s"
 
-#: logsrvd/logsrvd.c:1920 logsrvd/sendlog.c:1749
-#: plugins/sudoers/cvtsudoers.c:229 plugins/sudoers/sudoreplay.c:300
-#: plugins/sudoers/visudo.c:178
+#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769
+#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299
+#: plugins/sudoers/visudo.c:177
 #, c-format
 msgid "%s version %s\n"
 msgstr "%s version %s\n"
 
-#: logsrvd/logsrvd_conf.c:393
+#: logsrvd/logsrvd_conf.c:331
 msgid "TLS not supported"
 msgstr "TLS stöds inte"
 
-#: logsrvd/logsrvd_conf.c:405
+#: logsrvd/logsrvd_conf.c:343
 #, c-format
 msgid "%s:%s"
 msgstr "%s:%s"
 
-#: logsrvd/logsrvd_conf.c:471 logsrvd/logsrvd_conf.c:715
+#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653
 #, c-format
 msgid "%s: not a fully qualified path"
 msgstr "%s: inte fullständigt kvalificerad sökväg"
 
-#: logsrvd/logsrvd_conf.c:829
+#: logsrvd/logsrvd_conf.c:767
 #, c-format
 msgid "%s:%d unmatched '[': %s"
 msgstr "%s:%d omatchad ”[”: %s"
 
-#: logsrvd/logsrvd_conf.c:840
+#: logsrvd/logsrvd_conf.c:778
 #, c-format
 msgid "%s:%d invalid config section: %s"
 msgstr "%s:%d ogiltigt konfigurationsavsnitt: %s"
 
-#: logsrvd/logsrvd_conf.c:848
+#: logsrvd/logsrvd_conf.c:786
 #, c-format
 msgid "%s:%d invalid configuration line: %s"
 msgstr "%s:%d ogiltig konfigurationsrad: %s"
 
-#: logsrvd/logsrvd_conf.c:854
+#: logsrvd/logsrvd_conf.c:792
 #, c-format
 msgid "%s:%d expected section name: %s"
 msgstr "%s:%d avsnittsnamn förväntades: %s"
 
-#: logsrvd/logsrvd_conf.c:868
+#: logsrvd/logsrvd_conf.c:806
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "ogiltigt värde för %s: %s"
 
-#: logsrvd/logsrvd_conf.c:876
+#: logsrvd/logsrvd_conf.c:814
 #, c-format
 msgid "%s:%d unknown key: %s"
 msgstr "%s:%d okänd nyckel: %s"
 
-#: logsrvd/logsrvd_conf.c:1032
+#: logsrvd/logsrvd_conf.c:1003
 #, c-format
 msgid "unknown syslog facility %s"
 msgstr "okänd syslog-funktionalitet: %s"
 
-#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1040
-#: logsrvd/logsrvd_conf.c:1044
+#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011
+#: logsrvd/logsrvd_conf.c:1015
 #, c-format
 msgid "unknown syslog priority %s"
 msgstr "okänd syslog-prioritet: %s"
 
-#: logsrvd/sendlog.c:126
+#: logsrvd/sendlog.c:127
 msgid ""
 "\n"
 "Options:\n"
@@ -710,145 +768,148 @@ msgstr ""
 "  -t, --test               testa granskningsserver genom att skicka valda I/O-loggmeddelanden parallellt n gånger\n"
 "  -V, --version            visa versionsinformation och avsluta\n"
 
-#: logsrvd/sendlog.c:163 plugins/sudoers/iolog_client.c:433
+#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432
 #, c-format
 msgid "unable to look up %s:%s: %s"
 msgstr "kan inte slå upp %s:%s: %s"
 
-#: logsrvd/sendlog.c:186
+#: logsrvd/sendlog.c:202
 msgid "unable to get server IP addr"
 msgstr "kan inte hämta server-IP-adress"
 
-#: logsrvd/sendlog.c:240 plugins/sudoers/sudoreplay.c:852
+#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851
 #, c-format
 msgid "unable to read %s/%s: %s"
 msgstr "kan inte läsa %s/%s: %s"
 
-#: logsrvd/sendlog.c:261 plugins/sudoers/iolog_client.c:684
+#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694
 #, c-format
 msgid "client message too large: %zu"
 msgstr "klientmeddelande för stort: %zu"
 
-#: logsrvd/sendlog.c:790
+#: logsrvd/sendlog.c:810
 #, c-format
 msgid "%s: write buffer already in use"
 msgstr "%s: skrivbuffert används redan"
 
-#: logsrvd/sendlog.c:842 plugins/sudoers/iolog.c:845
-#: plugins/sudoers/iolog.c:914
+#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880
+#: plugins/sudoers/iolog.c:949
 #, c-format
 msgid "unexpected I/O event %d"
 msgstr "oväntad I/O-händelse %d"
 
-#: logsrvd/sendlog.c:888 logsrvd/sendlog.c:905 logsrvd/sendlog.c:939
-#: plugins/sudoers/iolog_client.c:1155 plugins/sudoers/iolog_client.c:1225
-#: plugins/sudoers/iolog_client.c:1273
+#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959
+#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386
+#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490
 #, c-format
 msgid "%s: unexpected state %d"
 msgstr "%s: oväntat tillstånd %d"
 
-#: logsrvd/sendlog.c:911 plugins/sudoers/iolog_client.c:1231
+#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460
 msgid "invalid ServerHello"
 msgstr "ogiltigt ServerHello"
 
-#: logsrvd/sendlog.c:975 plugins/sudoers/iolog_client.c:1317
+#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534
 #, c-format
 msgid "error message received from server: %s"
 msgstr "felmeddelande mottaget från server: %s"
 
-#: logsrvd/sendlog.c:988 plugins/sudoers/iolog_client.c:1330
+#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547
 #, c-format
 msgid "abort message received from server: %s"
 msgstr "avbrottsmeddelande mottaget från server: %s"
 
-#: logsrvd/sendlog.c:1007 plugins/sudoers/iolog_client.c:1349
+#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566
 msgid "unable to unpack ServerMessage"
 msgstr "kan inte packa upp ServerMessage"
 
-#: logsrvd/sendlog.c:1047 plugins/sudoers/iolog_client.c:1382
+#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597
 #, c-format
 msgid "%s: unexpected type_case value %d"
 msgstr "%s: oväntat type_case-värde %d"
 
-#: logsrvd/sendlog.c:1076
+#: logsrvd/sendlog.c:1096
 msgid "timeout reading from server"
 msgstr "tidsgräns passerad vid läsning från server"
 
-#: logsrvd/sendlog.c:1154
+#: logsrvd/sendlog.c:1174
 msgid "premature EOF"
 msgstr "oväntad EOF"
 
-#: logsrvd/sendlog.c:1167 plugins/sudoers/iolog_client.c:1536
+#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751
 #, c-format
 msgid "server message too large: %u"
 msgstr "servermeddelande för långt: %u"
 
-#: logsrvd/sendlog.c:1218
+#: logsrvd/sendlog.c:1238
 msgid "timeout writing to server"
 msgstr "tidsgräns passerad vid skrivning till server"
 
-#: logsrvd/sendlog.c:1437 plugins/sudoers/iolog_client.c:297
+#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296
 msgid "TLS handshake timeout occurred"
 msgstr "Tidsgräns för TLS-handskakning uppnådd"
 
-#: logsrvd/sendlog.c:1456 logsrvd/sendlog.c:1471
-#: plugins/sudoers/iolog_client.c:319 plugins/sudoers/iolog_client.c:335
+#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491
+#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334
 msgid "unable to set event"
 msgstr "kan inte ställa in händelse"
 
-#: logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1485
+#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505
 #, c-format
 msgid "TLS connection failed: %s"
 msgstr "TLS-anslutning misslyckades: %s"
 
-#: logsrvd/sendlog.c:1518
+#: logsrvd/sendlog.c:1538
 #, c-format
 msgid "Unable to initialize ssl context: %s"
 msgstr "Kan inte initiera ssl-kontext: %s"
 
-#: logsrvd/sendlog.c:1523 plugins/sudoers/iolog_client.c:259
+#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258
 #, c-format
 msgid "Unable to allocate ssl object: %s"
 msgstr "Kan inte allokera ssl-objekt: %s"
 
-#: logsrvd/sendlog.c:1528
+#: logsrvd/sendlog.c:1548
 #, c-format
 msgid "Unable to attach socket to the ssl object: %s"
 msgstr "Kan inte fästa kontakt på ssl-objektet: %s"
 
-#: logsrvd/sendlog.c:1772
+#: logsrvd/sendlog.c:1792
 msgid "both restart point and iolog ID must be specified"
 msgstr "både omstartspunkt och iolog-ID måste anges"
 
-#: logsrvd/sendlog.c:1776
+#: logsrvd/sendlog.c:1796
 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:1851
+#: logsrvd/sendlog.c:1871
 #, c-format
 msgid "exited prematurely with state %d"
 msgstr "avslutade oväntat i tillstånd %d"
 
-#: logsrvd/sendlog.c:1852
+#: logsrvd/sendlog.c:1872
 #, c-format
 msgid "elapsed time sent to server [%lld, %ld]"
 msgstr "förfluten tid skickad till server [%lld, %ld]"
 
-#: logsrvd/sendlog.c:1854
+#: logsrvd/sendlog.c:1874
 #, c-format
 msgid "commit point received from server [%lld, %ld]"
 msgstr "incheckningspunkt mottagen från server [%lld, %ld]"
 
-#: plugins/sudoers/alias.c:144
+#: plugins/sudoers/alias.c:148
 #, c-format
 msgid "Alias \"%s\" already defined"
 msgstr "Aliaset ”%s” är redan definierat"
 
-#: plugins/sudoers/auth/aix_auth.c:198 plugins/sudoers/logging.c:784
-msgid "unable to fork"
-msgstr "kan inte grena process"
+#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343
+#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002
+#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175
+#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114
+msgid "unable to get time of day"
+msgstr "kan inte hämta tid på dagen"
 
-#: plugins/sudoers/auth/aix_auth.c:278
+#: plugins/sudoers/auth/aix_auth.c:277
 #, c-format
 msgid "unable to change password for %s"
 msgstr "kan inte ändra lösenord för %s"
@@ -870,11 +931,11 @@ msgstr "ogiltig autentiseringstyp"
 msgid "unable to initialize BSD authentication"
 msgstr "kan inte initiera BSD-autentisering"
 
-#: plugins/sudoers/auth/bsdauth.c:180
+#: plugins/sudoers/auth/bsdauth.c:179
 msgid "your account has expired"
 msgstr "ditt konto har gått ut"
 
-#: plugins/sudoers/auth/bsdauth.c:182
+#: plugins/sudoers/auth/bsdauth.c:181
 msgid "approval failed"
 msgstr "godkännande misslyckades"
 
@@ -981,7 +1042,7 @@ msgstr "Konto utgånget eller så saknar PAM-konfigurationen ett ”account”-a
 msgid "PAM account management error: %s"
 msgstr "Fel vid hantering av PAM-konto: %s"
 
-#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:242
+#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243
 #, c-format
 msgid "you do not exist in the %s database"
 msgstr "du finns inte i %s-databasen"
@@ -1010,7 +1071,7 @@ msgstr "ogiltigt autentiseringshandtag för SecurID"
 msgid "SecurID communication failed"
 msgstr "SecurID-kommunikation misslyckades"
 
-#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:212
+#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210
 msgid "unknown SecurID error"
 msgstr "okänt SecurID-fel"
 
@@ -1018,7 +1079,7 @@ msgstr "okänt SecurID-fel"
 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:124
+#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123
 msgid "unable to initialize SIA session"
 msgstr "kan inte initiera SIA-session"
 
@@ -1042,7 +1103,7 @@ msgstr "Det finns inga autentiseringsmetoder inbyggda i sudo!  Om du vill inakti
 msgid "Unable to initialize authentication methods."
 msgstr "Kan inte initiera autentiseringsmetoder."
 
-#: plugins/sudoers/auth/sudo_auth.c:473
+#: plugins/sudoers/auth/sudo_auth.c:471
 msgid "Authentication methods:"
 msgstr "Autentiseringsmetoder:"
 
@@ -1075,117 +1136,117 @@ msgstr ""
 "\n"
 
 #: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311
-#: plugins/sudoers/sudoers.c:763 plugins/sudoers/sudoers.c:811
+#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858
 #: plugins/sudoers/tsdump.c:119
 #, c-format
 msgid "unknown uid: %u"
 msgstr "okänt uid: %u"
 
-#: plugins/sudoers/check.c:306 plugins/sudoers/iolog.c:117
-#: plugins/sudoers/policy.c:1037 plugins/sudoers/sudoers.c:387
-#: plugins/sudoers/sudoers.c:388 plugins/sudoers/sudoers.c:1240
-#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:392
+#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85
+#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088
+#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307
+#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386
 #, c-format
 msgid "unknown user: %s"
 msgstr "okänd användare: %s"
 
-#: plugins/sudoers/cvtsudoers.c:195
+#: plugins/sudoers/cvtsudoers.c:194
 #, c-format
 msgid "order increment: %s: %s"
 msgstr "ordningsinkrement: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:211
+#: plugins/sudoers/cvtsudoers.c:210
 #, c-format
 msgid "starting order: %s: %s"
 msgstr "startordning: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:221
+#: plugins/sudoers/cvtsudoers.c:220
 #, c-format
 msgid "order padding: %s: %s"
 msgstr "ordningsutfyllnad: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:231 plugins/sudoers/visudo.c:180
+#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179
 #, c-format
 msgid "%s grammar version %d\n"
 msgstr "%s grammatikversion %d\n"
 
-#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/testsudoers.c:167
+#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167
 #, c-format
 msgid "unsupported input format %s"
 msgstr "inmatningsformat %s stöds inte"
 
-#: plugins/sudoers/cvtsudoers.c:263
+#: plugins/sudoers/cvtsudoers.c:262
 #, c-format
 msgid "unsupported output format %s"
 msgstr "utmatningsformat %s stöds inte"
 
-#: plugins/sudoers/cvtsudoers.c:315
+#: plugins/sudoers/cvtsudoers.c:314
 #, c-format
 msgid "%s: input and output files must be different"
 msgstr "%s: in- och utmatningsfiler måste vara olika"
 
-#: plugins/sudoers/cvtsudoers.c:331 plugins/sudoers/sudoers.c:181
-#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:248
-#: plugins/sudoers/visudo.c:604 plugins/sudoers/visudo.c:927
+#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178
+#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249
+#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926
 msgid "unable to initialize sudoers default values"
 msgstr "kan inte initiera sudoers standardvärden"
 
-#: plugins/sudoers/cvtsudoers.c:417 plugins/sudoers/ldap_conf.c:431
+#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431
 #, c-format
 msgid "%s: %s: %s: %s"
 msgstr "%s: %s: %s: %s"
 
-#: plugins/sudoers/cvtsudoers.c:476
+#: plugins/sudoers/cvtsudoers.c:475
 #, c-format
 msgid "%s: unknown key word: %s"
 msgstr "%s: okänt nyckelord: %s"
 
-#: plugins/sudoers/cvtsudoers.c:522
+#: plugins/sudoers/cvtsudoers.c:521
 #, c-format
 msgid "invalid defaults type: %s"
 msgstr "ogiltig standardtyp: %s"
 
-#: plugins/sudoers/cvtsudoers.c:545
+#: plugins/sudoers/cvtsudoers.c:544
 #, c-format
 msgid "invalid suppression type: %s"
 msgstr "ogiltig undertryckningstyp: %s"
 
-#: plugins/sudoers/cvtsudoers.c:585 plugins/sudoers/cvtsudoers.c:599
+#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598
 #, c-format
 msgid "invalid filter: %s"
 msgstr "ogiltigt filter: %s"
 
-#: plugins/sudoers/cvtsudoers.c:618 plugins/sudoers/cvtsudoers.c:635
-#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:861
-#: plugins/sudoers/cvtsudoers_ldif.c:680 plugins/sudoers/sudoers.c:986
-#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/timestamp.c:441
-#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:923
+#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634
+#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872
+#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053
+#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441
+#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922
 #, c-format
 msgid "unable to open %s"
 msgstr "kan inte öppna %s"
 
-#: plugins/sudoers/cvtsudoers.c:638 plugins/sudoers/visudo.c:932
+#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931
 #, c-format
 msgid "failed to parse %s file, unknown error"
 msgstr "misslyckades med att tolka %s-filen, okänt fel"
 
-#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/visudo.c:949
+#: plugins/sudoers/cvtsudoers.c:645
 #, c-format
 msgid "parse error in %s near line %d\n"
 msgstr "tolkningsfel i %s nära rad %d\n"
 
-#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:952
+#: plugins/sudoers/cvtsudoers.c:648
 #, c-format
 msgid "parse error in %s\n"
 msgstr "tolkningsfel i %s\n"
 
-#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/sudoreplay.c:1125
+#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124
 #: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328
 #, c-format
 msgid "unable to write to %s"
 msgstr "kan inte skriva till %s"
 
-#: plugins/sudoers/cvtsudoers.c:1315
+#: plugins/sudoers/cvtsudoers.c:1314
 #, c-format
 msgid ""
 "%s - convert between sudoers file formats\n"
@@ -1194,7 +1255,7 @@ msgstr ""
 "%s - konvertera mellan sudoers filformat\n"
 "\n"
 
-#: plugins/sudoers/cvtsudoers.c:1317
+#: plugins/sudoers/cvtsudoers.c:1316
 msgid ""
 "\n"
 "Options:\n"
@@ -1235,675 +1296,700 @@ msgstr ""
 "  -V, --version              visa versionsinformation och avsluta"
 
 #: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514
-#: plugins/sudoers/cvtsudoers_json.c:702
+#: plugins/sudoers/cvtsudoers_json.c:713
 #, c-format
 msgid "unknown defaults entry \"%s\""
 msgstr "okänd standardpost ”%s”"
 
-#: plugins/sudoers/cvtsudoers_json.c:640 plugins/sudoers/cvtsudoers_json.c:653
-#: plugins/sudoers/cvtsudoers_ldif.c:345 plugins/sudoers/cvtsudoers_ldif.c:356
-#: plugins/sudoers/ldap.c:502
+#: 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
 msgid "unable to get GMT time"
 msgstr "kan inte hämta GMT-tid"
 
-#: plugins/sudoers/cvtsudoers_json.c:643 plugins/sudoers/cvtsudoers_json.c:656
-#: plugins/sudoers/cvtsudoers_ldif.c:348 plugins/sudoers/cvtsudoers_ldif.c:359
-#: plugins/sudoers/ldap.c:508
+#: 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
 msgid "unable to format timestamp"
 msgstr "kan inte formatera tidsstämpel"
 
-#: plugins/sudoers/cvtsudoers_ldif.c:632
+#: plugins/sudoers/cvtsudoers_ldif.c:640
 #, c-format
 msgid "too many sudoers entries, maximum %u"
 msgstr "för många sudoers-poster, maximalt %u"
 
-#: plugins/sudoers/cvtsudoers_ldif.c:675
+#: plugins/sudoers/cvtsudoers_ldif.c:683
 msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified."
 msgstr "miljövariabeln SUDOERS_BASE är inte satt och flaggan -b angavs inte."
 
-#: plugins/sudoers/def_data.c:42
+#: plugins/sudoers/def_data.c:50
 #, c-format
 msgid "Syslog facility if syslog is being used for logging: %s"
 msgstr "Syslog-facilitet om syslog används för loggning: %s"
 
-#: plugins/sudoers/def_data.c:46
+#: plugins/sudoers/def_data.c:54
 #, c-format
 msgid "Syslog priority to use when user authenticates successfully: %s"
 msgstr "Syslog-prioritet att använda när användaren lyckas med autentisering: %s"
 
-#: plugins/sudoers/def_data.c:50
+#: plugins/sudoers/def_data.c:58
 #, c-format
 msgid "Syslog priority to use when user authenticates unsuccessfully: %s"
 msgstr "Syslog-prioritet att använda när användaren misslyckas med autentisering: %s"
 
-#: plugins/sudoers/def_data.c:54
+#: plugins/sudoers/def_data.c:62
 msgid "Put OTP prompt on its own line"
 msgstr "Lägg OTP-prompt på en egen rad"
 
-#: plugins/sudoers/def_data.c:58
+#: plugins/sudoers/def_data.c:66
 msgid "Ignore '.' in $PATH"
 msgstr "Ignorera ”.” i $PATH"
 
-#: plugins/sudoers/def_data.c:62
+#: plugins/sudoers/def_data.c:70
 msgid "Always send mail when sudo is run"
 msgstr "Skicka alltid e-post när sudo körs"
 
-#: plugins/sudoers/def_data.c:66
+#: plugins/sudoers/def_data.c:74
 msgid "Send mail if user authentication fails"
 msgstr "Skicka e-post om användarens autentisering misslyckas"
 
-#: plugins/sudoers/def_data.c:70
+#: plugins/sudoers/def_data.c:78
 msgid "Send mail if the user is not in sudoers"
 msgstr "Skicka e-post om användaren inte finns med i sudoers"
 
-#: plugins/sudoers/def_data.c:74
+#: plugins/sudoers/def_data.c:82
 msgid "Send mail if the user is not in sudoers for this host"
 msgstr "Skicka e-post om användaren inte finns med i sudoers för denna värddator"
 
-#: plugins/sudoers/def_data.c:78
+#: plugins/sudoers/def_data.c:86
 msgid "Send mail if the user is not allowed to run a command"
 msgstr "Skicka e-post om användaren inte tillåts att köra ett kommando"
 
-#: plugins/sudoers/def_data.c:82
+#: plugins/sudoers/def_data.c:90
 msgid "Send mail if the user tries to run a command"
 msgstr "Skicka e-post om användaren försöker köra ett kommando"
 
-#: plugins/sudoers/def_data.c:86
+#: plugins/sudoers/def_data.c:94
 msgid "Use a separate timestamp for each user/tty combo"
 msgstr "Använd en separat tidsstämpel för varje användar-/tty-kombination"
 
-#: plugins/sudoers/def_data.c:90
+#: plugins/sudoers/def_data.c:98
 msgid "Lecture user the first time they run sudo"
 msgstr "Lär upp användaren första gången de kör sudo"
 
-#: plugins/sudoers/def_data.c:94
+#: plugins/sudoers/def_data.c:102
 #, c-format
 msgid "File containing the sudo lecture: %s"
 msgstr "Fil som innehåller sudo-lektion: %s"
 
-#: plugins/sudoers/def_data.c:98
+#: plugins/sudoers/def_data.c:106
 msgid "Require users to authenticate by default"
 msgstr "Kräv att användare autentiseras som standard"
 
-#: plugins/sudoers/def_data.c:102
+#: plugins/sudoers/def_data.c:110
 msgid "Root may run sudo"
 msgstr "Root får köra sudo"
 
-#: plugins/sudoers/def_data.c:106
+#: plugins/sudoers/def_data.c:114
 msgid "Log the hostname in the (non-syslog) log file"
 msgstr "Logga värdnamnet i (den icke syslog-baserade) loggfilen"
 
-#: plugins/sudoers/def_data.c:110
+#: plugins/sudoers/def_data.c:118
 msgid "Log the year in the (non-syslog) log file"
 msgstr "Logga året i (den icke syslog-baserade) loggfilen"
 
-#: plugins/sudoers/def_data.c:114
+#: plugins/sudoers/def_data.c:122
 msgid "If sudo is invoked with no arguments, start a shell"
 msgstr "Om sudo startas utan argument, starta ett skal"
 
-#: plugins/sudoers/def_data.c:118
+#: plugins/sudoers/def_data.c:126
 msgid "Set $HOME to the target user when starting a shell with -s"
 msgstr "Ställ in $HOME till målanvändaren när ett skal startas med -s"
 
-#: plugins/sudoers/def_data.c:122
+#: plugins/sudoers/def_data.c:130
 msgid "Always set $HOME to the target user's home directory"
 msgstr "Ställ alltid in $HOME till målanvändarens hemkatalog"
 
-#: plugins/sudoers/def_data.c:126
+#: plugins/sudoers/def_data.c:134
 msgid "Allow some information gathering to give useful error messages"
 msgstr "Tillåt viss informationsinsamling för att ge meningsfulla felmeddelanden"
 
-#: plugins/sudoers/def_data.c:130
+#: plugins/sudoers/def_data.c:138
 msgid "Require fully-qualified hostnames in the sudoers file"
 msgstr "Kräv fullständiga värdnamn i sudoers-filen"
 
-#: plugins/sudoers/def_data.c:134
+#: plugins/sudoers/def_data.c:142
 msgid "Insult the user when they enter an incorrect password"
 msgstr "Förolämpa användaren när de anger ett felaktigt lösenord"
 
-#: plugins/sudoers/def_data.c:138
+#: plugins/sudoers/def_data.c:146
 msgid "Only allow the user to run sudo if they have a tty"
 msgstr "Tillåt bara användare att köra sudo om de har en tty"
 
-#: plugins/sudoers/def_data.c:142
+#: plugins/sudoers/def_data.c:150
 msgid "Visudo will honor the EDITOR environment variable"
 msgstr "Visudo kommer att respektera miljövariabeln EDITOR"
 
-#: plugins/sudoers/def_data.c:146
+#: plugins/sudoers/def_data.c:154
 msgid "Prompt for root's password, not the users's"
 msgstr "Fråga efter root-lösenordet, inte användarens"
 
-#: plugins/sudoers/def_data.c:150
+#: plugins/sudoers/def_data.c:158
 msgid "Prompt for the runas_default user's password, not the users's"
 msgstr "Fråga efter runas_default-användarens lösenord, inte användarens"
 
-#: plugins/sudoers/def_data.c:154
+#: plugins/sudoers/def_data.c:162
 msgid "Prompt for the target user's password, not the users's"
 msgstr "Fråga efter målanvändarens lösenord, inte användarens"
 
-#: plugins/sudoers/def_data.c:158
+#: plugins/sudoers/def_data.c:166
 msgid "Apply defaults in the target user's login class if there is one"
 msgstr "Tillämpa standardvärden i målanvändarens inloggningsklass om det finns en"
 
-#: plugins/sudoers/def_data.c:162
+#: plugins/sudoers/def_data.c:170
 msgid "Set the LOGNAME and USER environment variables"
 msgstr "Ställ in miljövariablerna LOGNAME och USER"
 
-#: plugins/sudoers/def_data.c:166
+#: plugins/sudoers/def_data.c:174
 msgid "Only set the effective uid to the target user, not the real uid"
 msgstr "Sätt bara det effektiva uid:t till målanvändaren, inte till det riktiga uid:t"
 
-#: plugins/sudoers/def_data.c:170
+#: plugins/sudoers/def_data.c:178
 msgid "Don't initialize the group vector to that of the target user"
 msgstr "Initiera inte gruppvektorn till den från målanvändaren"
 
-#: plugins/sudoers/def_data.c:174
+#: plugins/sudoers/def_data.c:182
 #, c-format
 msgid "Length at which to wrap log file lines (0 for no wrap): %u"
 msgstr "Längden vid vilken långa loggfilsrader radbryts (0 för att inte radbryta): %u"
 
-#: plugins/sudoers/def_data.c:178
+#: plugins/sudoers/def_data.c:186
 #, c-format
 msgid "Authentication timestamp timeout: %.1f minutes"
 msgstr "Tidsgräns för autentiseringstidsstämpel: %.1f minuter"
 
-#: plugins/sudoers/def_data.c:182
+#: plugins/sudoers/def_data.c:190
 #, c-format
 msgid "Password prompt timeout: %.1f minutes"
 msgstr "Tidsgräns för lösenordsprompt: %.1f minuter"
 
-#: plugins/sudoers/def_data.c:186
+#: plugins/sudoers/def_data.c:194
 #, c-format
 msgid "Number of tries to enter a password: %u"
 msgstr "Antal försök att ange ett lösenord: %u"
 
-#: plugins/sudoers/def_data.c:190
+#: plugins/sudoers/def_data.c:198
 #, c-format
 msgid "Umask to use or 0777 to use user's: 0%o"
 msgstr "Umask att använda eller 0777 för att använda användarens: 0%o"
 
-#: plugins/sudoers/def_data.c:194
+#: plugins/sudoers/def_data.c:202
 #, c-format
 msgid "Path to log file: %s"
 msgstr "Sökväg till loggfil: %s"
 
-#: plugins/sudoers/def_data.c:198
+#: plugins/sudoers/def_data.c:206
 #, c-format
 msgid "Path to mail program: %s"
 msgstr "Sökväg till e-postprogram: %s"
 
-#: plugins/sudoers/def_data.c:202
+#: plugins/sudoers/def_data.c:210
 #, c-format
 msgid "Flags for mail program: %s"
 msgstr "Flaggor för e-postprogram: %s"
 
-#: plugins/sudoers/def_data.c:206
+#: plugins/sudoers/def_data.c:214
 #, c-format
 msgid "Address to send mail to: %s"
 msgstr "Adress att skicka e-post till: %s"
 
-#: plugins/sudoers/def_data.c:210
+#: plugins/sudoers/def_data.c:218
 #, c-format
 msgid "Address to send mail from: %s"
 msgstr "Adress att skicka e-post från: %s"
 
-#: plugins/sudoers/def_data.c:214
+#: plugins/sudoers/def_data.c:222
 #, c-format
 msgid "Subject line for mail messages: %s"
 msgstr "Ämnesrad för e-postmeddelanden: %s"
 
-#: plugins/sudoers/def_data.c:218
+#: plugins/sudoers/def_data.c:226
 #, c-format
 msgid "Incorrect password message: %s"
 msgstr "Meddelande vid felaktigt lösenord: %s"
 
-#: plugins/sudoers/def_data.c:222
+#: plugins/sudoers/def_data.c:230
 #, c-format
 msgid "Path to lecture status dir: %s"
 msgstr "Sökväg till lektionsstatuskatalog: %s"
 
-#: plugins/sudoers/def_data.c:226
+#: plugins/sudoers/def_data.c:234
 #, c-format
 msgid "Path to authentication timestamp dir: %s"
 msgstr "Sökväg till katalog för autentiseringstidsstämplar: %s"
 
-#: plugins/sudoers/def_data.c:230
+#: plugins/sudoers/def_data.c:238
 #, c-format
 msgid "Owner of the authentication timestamp dir: %s"
 msgstr "Ägare av katalogen för autentiseringstidsstämplar: %s"
 
-#: plugins/sudoers/def_data.c:234
+#: plugins/sudoers/def_data.c:242
 #, c-format
 msgid "Users in this group are exempt from password and PATH requirements: %s"
 msgstr "Användare i denna grupp är undantagna från lösenords- och SÖKVÄGs-kraven: %s"
 
-#: plugins/sudoers/def_data.c:238
+#: plugins/sudoers/def_data.c:246
 #, c-format
 msgid "Default password prompt: %s"
 msgstr "Standard lösenordsprompt: %s"
 
-#: plugins/sudoers/def_data.c:242
+#: plugins/sudoers/def_data.c:250
 msgid "If set, passprompt will override system prompt in all cases."
 msgstr "Om inställt kommer passprompt att åsidosätta systemprompten i varje fall."
 
-#: plugins/sudoers/def_data.c:246
+#: plugins/sudoers/def_data.c:254
 #, c-format
 msgid "Default user to run commands as: %s"
 msgstr "Standardanvändaren att köra kommandon som: %s"
 
-#: plugins/sudoers/def_data.c:250
+#: plugins/sudoers/def_data.c:258
 #, c-format
 msgid "Value to override user's $PATH with: %s"
 msgstr "Värde att åsidosätta användarens $PATH med: %s"
 
-#: plugins/sudoers/def_data.c:254
+#: plugins/sudoers/def_data.c:262
 #, c-format
 msgid "Path to the editor for use by visudo: %s"
 msgstr "Sökväg till textredigerare för användning av visudo: %s"
 
-#: plugins/sudoers/def_data.c:258
+#: plugins/sudoers/def_data.c:266
 #, c-format
 msgid "When to require a password for 'list' pseudocommand: %s"
 msgstr "När ett lösenord ska krävas för pseudokommandot ”list”: %s"
 
-#: plugins/sudoers/def_data.c:262
+#: plugins/sudoers/def_data.c:270
 #, c-format
 msgid "When to require a password for 'verify' pseudocommand: %s"
 msgstr "När lösenord ska krävas för pseudokommandot ”verify”: %s"
 
-#: plugins/sudoers/def_data.c:266
-msgid "Preload the dummy exec functions contained in the sudo_noexec library"
-msgstr "Förinläs attrapp-exec-funktioner som finns i biblioteket sudo_noexec"
+#: plugins/sudoers/def_data.c:274
+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:270
+#: plugins/sudoers/def_data.c:278
 msgid "If LDAP directory is up, do we ignore local sudoers file"
 msgstr "Om LDAP-registret är uppe, ignorerar vi den lokala sudoers-filen"
 
-#: plugins/sudoers/def_data.c:274
+#: plugins/sudoers/def_data.c:282
 #, c-format
 msgid "File descriptors >= %d will be closed before executing a command"
-msgstr "Fildeskriptorer >= %d kommer att stängas innan ett kommando exekveras"
+msgstr "Fildeskriptorer >= %d kommer att stängas innan ett kommando körs"
 
-#: plugins/sudoers/def_data.c:278
-msgid "If set, users may override the value of `closefrom' with the -C option"
+#: plugins/sudoers/def_data.c:286
+msgid "If set, users may override the value of \"closefrom\" with the -C option"
 msgstr "Om inställt kan användare åsidosätta värdet ”closefrom” med flaggan -C"
 
-#: plugins/sudoers/def_data.c:282
+#: plugins/sudoers/def_data.c:290
 msgid "Allow users to set arbitrary environment variables"
 msgstr "Låt användare ställa in godtyckliga miljövariabler"
 
-#: plugins/sudoers/def_data.c:286
+#: plugins/sudoers/def_data.c:294
 msgid "Reset the environment to a default set of variables"
 msgstr "Återställ miljön till standarduppsättningen av variabler"
 
-#: plugins/sudoers/def_data.c:290
-msgid "Environment variables to check for sanity:"
-msgstr "Miljövariabler att kontrollera:"
+#: plugins/sudoers/def_data.c:298
+msgid "Environment variables to check for safety:"
+msgstr "Miljövariabler att säkerhetskontrollera:"
 
-#: plugins/sudoers/def_data.c:294
+#: plugins/sudoers/def_data.c:302
 msgid "Environment variables to remove:"
 msgstr "Miljövariabler att ta bort:"
 
-#: plugins/sudoers/def_data.c:298
+#: plugins/sudoers/def_data.c:306
 msgid "Environment variables to preserve:"
 msgstr "Miljövariabler att behålla:"
 
-#: plugins/sudoers/def_data.c:302
+#: plugins/sudoers/def_data.c:310
 #, c-format
 msgid "SELinux role to use in the new security context: %s"
 msgstr "SELinux-roll att använda i den nya säkerhetskontexten: %s"
 
-#: plugins/sudoers/def_data.c:306
+#: plugins/sudoers/def_data.c:314
 #, c-format
 msgid "SELinux type to use in the new security context: %s"
 msgstr "SELinux-typ att använda i den nya säkerhetskontexten: %s"
 
-#: plugins/sudoers/def_data.c:310
+#: plugins/sudoers/def_data.c:318
 #, c-format
 msgid "Path to the sudo-specific environment file: %s"
 msgstr "Sökväg till den sudo-specifika miljöfilen: %s"
 
-#: plugins/sudoers/def_data.c:314
+#: plugins/sudoers/def_data.c:322
 #, c-format
 msgid "Path to the restricted sudo-specific environment file: %s"
 msgstr "Sökväg till den begränsade sudo-specifika miljöfilen: %s"
 
-#: plugins/sudoers/def_data.c:318
+#: plugins/sudoers/def_data.c:326
 #, c-format
 msgid "Locale to use while parsing sudoers: %s"
 msgstr "Lokalanpassning att använda vid tolkning av sudoers: %s"
 
-#: plugins/sudoers/def_data.c:322
+#: plugins/sudoers/def_data.c:330
 msgid "Allow sudo to prompt for a password even if it would be visible"
 msgstr "Tillåt sudo att fråga efter ett lösenord även om det skulle vara synligt"
 
-#: plugins/sudoers/def_data.c:326
+#: plugins/sudoers/def_data.c:334
 msgid "Provide visual feedback at the password prompt when there is user input"
 msgstr "Ge visuell återkoppling vid lösenordsprompten när det finns användarinmatad data"
 
-#: plugins/sudoers/def_data.c:330
+#: plugins/sudoers/def_data.c:338
 msgid "Use faster globbing that is less accurate but does not access the filesystem"
 msgstr "Använd snabbare matchning som är mindre exakt men inte använder filsystemet"
 
-#: plugins/sudoers/def_data.c:334
+#: plugins/sudoers/def_data.c:342
 msgid "The umask specified in sudoers will override the user's, even if it is more permissive"
 msgstr "Umasken angiven i sudoers kommer att åsidosätta användarens, även om den är mer tillåtande"
 
-#: plugins/sudoers/def_data.c:338
+#: plugins/sudoers/def_data.c:346
 msgid "Log user's input for the command being run"
 msgstr "Logga användarens inmatning för kommandot som körs"
 
-#: plugins/sudoers/def_data.c:342
+#: plugins/sudoers/def_data.c:350
 msgid "Log the output of the command being run"
 msgstr "Logga utmatningen för kommandot som körs"
 
-#: plugins/sudoers/def_data.c:346
+#: plugins/sudoers/def_data.c:354
 msgid "Compress I/O logs using zlib"
 msgstr "Komprimera I/O-loggar med hjälp av zlib"
 
-#: plugins/sudoers/def_data.c:350
+#: plugins/sudoers/def_data.c:358
 msgid "Always run commands in a pseudo-tty"
 msgstr "Kör alltid kommandon i en pseudo-tty"
 
-#: plugins/sudoers/def_data.c:354
+#: plugins/sudoers/def_data.c:362
 #, c-format
 msgid "Plugin for non-Unix group support: %s"
 msgstr "Insticksmodul för stöd för icke-Unix-grupper: %s"
 
-#: plugins/sudoers/def_data.c:358
+#: plugins/sudoers/def_data.c:366
 #, c-format
 msgid "Directory in which to store input/output logs: %s"
 msgstr "Katalog i vilken in-/utmatningsloggar lagras: %s"
 
-#: plugins/sudoers/def_data.c:362
+#: plugins/sudoers/def_data.c:370
 #, c-format
 msgid "File in which to store the input/output log: %s"
 msgstr "Fil i vilken in-/utmatningsloggar lagras: %s"
 
-#: plugins/sudoers/def_data.c:366
+#: plugins/sudoers/def_data.c:374
 msgid "Add an entry to the utmp/utmpx file when allocating a pty"
 msgstr "Lägg till en post till utmp/utmpx-filen när en pty allokeras"
 
-#: plugins/sudoers/def_data.c:370
+#: plugins/sudoers/def_data.c:378
 msgid "Set the user in utmp to the runas user, not the invoking user"
 msgstr "Sätt användaren i utmp till runas-användaren, inte användaren som anropar"
 
-#: plugins/sudoers/def_data.c:374
+#: plugins/sudoers/def_data.c:382
 #, c-format
 msgid "Set of permitted privileges: %s"
 msgstr "Uppsättning tillåtna rättigheter: %s"
 
-#: plugins/sudoers/def_data.c:378
+#: plugins/sudoers/def_data.c:386
 #, c-format
 msgid "Set of limit privileges: %s"
 msgstr "Uppsättning av begränsningsrättigheter: %s"
 
-#: plugins/sudoers/def_data.c:382
+#: plugins/sudoers/def_data.c:390
 msgid "Run commands on a pty in the background"
 msgstr "Kör kommandon i en pty i bakgrunden"
 
-#: plugins/sudoers/def_data.c:386
+#: plugins/sudoers/def_data.c:394
 #, c-format
 msgid "PAM service name to use: %s"
 msgstr "PAM-tjänstnamn att använda: %s"
 
-#: plugins/sudoers/def_data.c:390
+#: plugins/sudoers/def_data.c:398
 #, c-format
 msgid "PAM service name to use for login shells: %s"
 msgstr "PAM-tjänstnamn att använda för inloggningsskal: %s"
 
-#: plugins/sudoers/def_data.c:394
+#: plugins/sudoers/def_data.c:402
 msgid "Attempt to establish PAM credentials for the target user"
 msgstr "Försök att etablera PAM-inloggningsuppgifter för målanvändaren"
 
-#: plugins/sudoers/def_data.c:398
+#: plugins/sudoers/def_data.c:406
 msgid "Create a new PAM session for the command to run in"
 msgstr "Skapa en ny PAM-session för kommandot att köra i"
 
-#: plugins/sudoers/def_data.c:402
+#: plugins/sudoers/def_data.c:410
 msgid "Perform PAM account validation management"
 msgstr "Utför valideringshantering av PAM-konto"
 
-#: plugins/sudoers/def_data.c:406
+#: plugins/sudoers/def_data.c:414
 #, c-format
 msgid "Maximum I/O log sequence number: %s"
 msgstr "Största sekvensnummer i I/O-logg: %s"
 
-#: plugins/sudoers/def_data.c:410
+#: plugins/sudoers/def_data.c:418
 msgid "Enable sudoers netgroup support"
 msgstr "Aktivera sudoers nätgruppsstöd"
 
-#: plugins/sudoers/def_data.c:414
+#: plugins/sudoers/def_data.c:422
 msgid "Check parent directories for writability when editing files with sudoedit"
 msgstr "Kontrollera överordnade kataloger för skrivbarhet när filer redigeras med sudoedit"
 
-#: plugins/sudoers/def_data.c:418
+#: plugins/sudoers/def_data.c:426
 msgid "Follow symbolic links when editing files with sudoedit"
 msgstr "Följ symboliska länkar när filer redigeras med sudoedit"
 
-#: plugins/sudoers/def_data.c:422
+#: plugins/sudoers/def_data.c:430
 msgid "Query the group plugin for unknown system groups"
 msgstr "Fråga gruppinsticksmodulen efter okända systemgrupper"
 
-#: plugins/sudoers/def_data.c:426
+#: plugins/sudoers/def_data.c:434
 msgid "Match netgroups based on the entire tuple: user, host and domain"
 msgstr "Matcha nätgrupper baserat på hela tupeln: användare, värd och domän"
 
-#: plugins/sudoers/def_data.c:430
+#: plugins/sudoers/def_data.c:438
 msgid "Allow commands to be run even if sudo cannot write to the audit log"
 msgstr "Tillåt kommandon att köras även om sudo inte kan skriva till granskningsloggen"
 
-#: plugins/sudoers/def_data.c:434
+#: plugins/sudoers/def_data.c:442
 msgid "Allow commands to be run even if sudo cannot write to the I/O log"
 msgstr "Tillåt kommandon att köras även om sudo inte kan skriva I/O-loggen"
 
-#: plugins/sudoers/def_data.c:438
+#: plugins/sudoers/def_data.c:446
 msgid "Allow commands to be run even if sudo cannot write to the log file"
 msgstr "Tillåt kommandon att köras även om sudo inte kan skriva till loggfilen"
 
-#: plugins/sudoers/def_data.c:442
+#: plugins/sudoers/def_data.c:450
 msgid "Resolve groups in sudoers and match on the group ID, not the name"
 msgstr "Gör namnupplösning för grupper i sudoers och matcha efter grupp-ID, inte namnet"
 
-#: plugins/sudoers/def_data.c:446
+#: plugins/sudoers/def_data.c:454
 #, c-format
 msgid "Log entries larger than this value will be split into multiple syslog messages: %u"
 msgstr "Loggposter större än detta värde kommer att delas upp i flera syslog-meddelanden: %u"
 
-#: plugins/sudoers/def_data.c:450
+#: plugins/sudoers/def_data.c:458
 #, c-format
 msgid "User that will own the I/O log files: %s"
 msgstr "Användare som kommer att äga I/O-loggfilerna: %s"
 
-#: plugins/sudoers/def_data.c:454
+#: plugins/sudoers/def_data.c:462
 #, c-format
 msgid "Group that will own the I/O log files: %s"
 msgstr "Grupp som kommer att äga I/O-loggfilerna: %s"
 
-#: plugins/sudoers/def_data.c:458
+#: plugins/sudoers/def_data.c:466
 #, c-format
 msgid "File mode to use for the I/O log files: 0%o"
 msgstr "Filrättigheter att använda för I/O-loggfilerna: 0%o"
 
-#: plugins/sudoers/def_data.c:462
+#: plugins/sudoers/def_data.c:470
 #, c-format
 msgid "Execute commands by file descriptor instead of by path: %s"
-msgstr "Exekvera kommandon efter fildeskriptor istället för efter sökväg: %s"
+msgstr "Kör kommandon efter fildeskriptor istället för efter sökväg: %s"
 
-#: plugins/sudoers/def_data.c:466
+#: plugins/sudoers/def_data.c:474
 msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning"
 msgstr "Hoppa över okända Defaults-poster i sudoers istället för att skriva ut en varning"
 
-#: plugins/sudoers/def_data.c:470
+#: plugins/sudoers/def_data.c:478
 #, c-format
 msgid "Time in seconds after which the command will be terminated: %u"
 msgstr "Tid i sekunder efter vilka kommandot kommer att avslutas: %u"
 
-#: plugins/sudoers/def_data.c:474
+#: plugins/sudoers/def_data.c:482
 msgid "Allow the user to specify a timeout on the command line"
 msgstr "Tillåt användaren att ange en tidsgräns på kommandoraden"
 
-#: plugins/sudoers/def_data.c:478
+#: plugins/sudoers/def_data.c:486
 msgid "Flush I/O log data to disk immediately instead of buffering it"
 msgstr "Spola ut I/O-loggdata till disk omedelbart istället för att buffra det"
 
-#: plugins/sudoers/def_data.c:482
+#: plugins/sudoers/def_data.c:490
 msgid "Include the process ID when logging via syslog"
 msgstr "Inkludera process-ID:t vid loggning via syslog"
 
-#: plugins/sudoers/def_data.c:486
+#: plugins/sudoers/def_data.c:494
 #, c-format
 msgid "Type of authentication timestamp record: %s"
 msgstr "Typ av post för autentiseringstidsstämplar: %s"
 
-#: plugins/sudoers/def_data.c:490
+#: plugins/sudoers/def_data.c:498
 #, c-format
 msgid "Authentication failure message: %s"
 msgstr "Autentiseringsfelsmeddelande: %s"
 
-#: plugins/sudoers/def_data.c:494
+#: plugins/sudoers/def_data.c:502
 msgid "Ignore case when matching user names"
 msgstr "Matcha användarnamn skiftlägesokänsligt"
 
-#: plugins/sudoers/def_data.c:498
+#: plugins/sudoers/def_data.c:506
 msgid "Ignore case when matching group names"
 msgstr "Matcha gruppnamn skiftlägesokänsligt"
 
-#: plugins/sudoers/def_data.c:502
+#: plugins/sudoers/def_data.c:510
 msgid "Log when a command is allowed by sudoers"
 msgstr "Logga när ett kommando tillåts av sudoers"
 
-#: plugins/sudoers/def_data.c:506
+#: plugins/sudoers/def_data.c:514
 msgid "Log when a command is denied by sudoers"
 msgstr "Logga när ett kommando nekas av sudoers"
 
-#: plugins/sudoers/def_data.c:510
+#: plugins/sudoers/def_data.c:518
 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:514
+#: plugins/sudoers/def_data.c:522
 #, 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:518
+#: plugins/sudoers/def_data.c:526
 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:522
+#: plugins/sudoers/def_data.c:530
 #, 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:526
+#: plugins/sudoers/def_data.c:534
 #, c-format
 msgid "Path to the sudoers certificate file: %s"
 msgstr "Sökväg till sudoers certifikatfil: %s"
 
-#: plugins/sudoers/def_data.c:530
+#: plugins/sudoers/def_data.c:538
 #, 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:534
+#: plugins/sudoers/def_data.c:542
 msgid "Verify that the log server's certificate is valid"
 msgstr "Verifiera att loggserverns certifikatfil är giltig"
 
-#: plugins/sudoers/def_data.c:538
+#: plugins/sudoers/def_data.c:546
 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:542
+#: plugins/sudoers/def_data.c:550
 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:546
+#: plugins/sudoers/def_data.c:554
 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:550
+#: plugins/sudoers/def_data.c:558
 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/defaults.c:183
+#: plugins/sudoers/def_data.c:562
 #, c-format
-msgid "%s:%d unknown defaults entry \"%s\""
-msgstr "%s:%d okänd standardpost ”%s”"
+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/defaults.c:186
+#: plugins/sudoers/def_data.c:566
 #, c-format
-msgid "%s: unknown defaults entry \"%s\""
-msgstr "%s: okänd standardpost ”%s”"
+msgid "Root directory to change to before executing the command: %s"
+msgstr "Rotkatalog att ändra till innan kommandot körs: %s"
 
-#: plugins/sudoers/defaults.c:229
+#: plugins/sudoers/def_data.c:570
 #, c-format
-msgid "%s:%d no value specified for \"%s\""
-msgstr "%s:%d inget värde angivet för ”%s”"
+msgid "The format of logs to produce: %s"
+msgstr "Formatet för loggarna som ska produceras: %s"
 
-#: plugins/sudoers/defaults.c:232
+#: plugins/sudoers/defaults.c:185
 #, c-format
-msgid "%s: no value specified for \"%s\""
-msgstr "%s: inget värde angivet för ”%s”"
+msgid "%s:%d:%d: unknown defaults entry \"%s\""
+msgstr "%s:%d:%d: okänd standardpost ”%s”"
 
-#: plugins/sudoers/defaults.c:252
+#: plugins/sudoers/defaults.c:188
 #, c-format
-msgid "%s:%d values for \"%s\" must start with a '/'"
-msgstr "%s:%d värden för ”%s” måste börja med ett ”/”"
+msgid "%s: unknown defaults entry \"%s\""
+msgstr "%s: okänd standardpost ”%s”"
 
-#: plugins/sudoers/defaults.c:255
+#: plugins/sudoers/defaults.c:234
 #, 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 "%s:%d:%d: no value specified for \"%s\""
+msgstr "%s:%d:%d: inget värde angivet för ”%s”"
+
+#: plugins/sudoers/defaults.c:237
+#, c-format
+msgid "%s: no value specified for \"%s\""
+msgstr "%s: inget värde angivet för ”%s”"
 
-#: plugins/sudoers/defaults.c:277
+#: plugins/sudoers/defaults.c:275
 #, c-format
-msgid "%s:%d option \"%s\" does not take a value"
-msgstr "%s:%d flaggan ”%s” tar inte emot något värde"
+msgid "%s:%d:%d: option \"%s\" does not take a value"
+msgstr "%s:%d:%d: flaggan ”%s” tar inte emot något värde"
 
-#: plugins/sudoers/defaults.c:280
+#: plugins/sudoers/defaults.c:278
 #, c-format
 msgid "%s: option \"%s\" does not take a value"
 msgstr "%s: flaggan ”%s” tar inte emot något värde"
 
-#: plugins/sudoers/defaults.c:305
+#: plugins/sudoers/defaults.c:303
 #, c-format
-msgid "%s:%d invalid Defaults type 0x%x for option \"%s\""
-msgstr "%s:%d ogiltig standardtyp 0x%x för flagga ”%s”"
+msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""
+msgstr "%s:%d:%d: ogiltig standardtyp 0x%x för flagga ”%s”"
 
-#: plugins/sudoers/defaults.c:308
+#: plugins/sudoers/defaults.c:306
 #, c-format
 msgid "%s: invalid Defaults type 0x%x for option \"%s\""
 msgstr "%s: ogiltig standardtyp 0x%x för flagga ”%s”"
 
-#: plugins/sudoers/defaults.c:318
+#: plugins/sudoers/defaults.c:316
 #, c-format
-msgid "%s:%d value \"%s\" is invalid for option \"%s\""
-msgstr "%s:%d värdet ”%s” är ogiltigt för flaggan ”%s”"
+msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\""
+msgstr "%s:%d:%d: värdet ”%s” är ogiltigt för flaggan ”%s”"
 
-#: plugins/sudoers/defaults.c:321
+#: plugins/sudoers/defaults.c:319
 #, c-format
 msgid "%s: value \"%s\" is invalid for option \"%s\""
 msgstr "%s: värdet ”%s” är ogiltigt för flaggan ”%s”"
 
-#: plugins/sudoers/env.c:404
+#: plugins/sudoers/defaults.c:1030
+#, 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 ”*”"
+
+#: plugins/sudoers/defaults.c:1034
+#, 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 ”*”"
+
+#: plugins/sudoers/defaults.c:1045
+#, 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 ”/”"
+
+#: plugins/sudoers/defaults.c:1049
+#, c-format
+msgid "%s: values for \"%s\" must start with a '/'"
+msgstr "%s: värden för ”%s” måste börja med ett ”/”"
+
+#: plugins/sudoers/env.c:405
 msgid "sudo_putenv: corrupted envp, length mismatch"
 msgstr "sudo_putenv: trasig envp, längd stämmer inte"
 
-#: plugins/sudoers/env.c:1131
+#: plugins/sudoers/env.c:1133
 msgid "unable to rebuild the environment"
 msgstr "kan inte återuppbygga miljön"
 
-#: plugins/sudoers/env.c:1205
+#: plugins/sudoers/env.c:1207
 #, 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:104
+#: 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:107
+#: plugins/sudoers/file.c:110
 #, c-format
 msgid "parse error in %s"
 msgstr "tolkningsfel i %s"
@@ -1928,7 +2014,7 @@ msgstr "%s måste ägas av uid %d"
 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:571
+#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569
 #, c-format
 msgid "unable to load %s: %s"
 msgstr "kan inte läsa in %s: %s"
@@ -1957,122 +2043,78 @@ msgstr "kan inte tolka nätmask ”%s”"
 msgid "Local IP address and netmask pairs:\n"
 msgstr "Lokala IP-adress- och nätmaskpar:\n"
 
-#: plugins/sudoers/iolog.c:142 plugins/sudoers/sudoers.c:393
-#: plugins/sudoers/sudoers.c:394 plugins/sudoers/sudoers.c:1274
-#: plugins/sudoers/testsudoers.c:416
+#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445
+#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410
 #, c-format
 msgid "unknown group: %s"
 msgstr "okänd grupp: %s"
 
-#: plugins/sudoers/iolog.c:517 plugins/sudoers/iolog.c:807
-#: plugins/sudoers/iolog.c:959 plugins/sudoers/iolog.c:966
-#: plugins/sudoers/iolog.c:1087 plugins/sudoers/iolog.c:1094
-#: plugins/sudoers/iolog.c:1193 plugins/sudoers/iolog.c:1200
+#: plugins/sudoers/iolog.c:622
+msgid "unable to update sequence file"
+msgstr "kan inte uppdatera sekvensfil"
+
+#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841
+#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001
+#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129
+#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235
 #, 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:566
-msgid "unable to update sequence file"
-msgstr "kan inte uppdatera sekvensfil"
-
-#: plugins/sudoers/iolog.c:605
+#: plugins/sudoers/iolog.c:661
 #, c-format
 msgid "unable to create %s/%s"
 msgstr "kan inte skapa %s/%s"
 
-#: plugins/sudoers/iolog.c:631
-msgid "unable to connect to log server"
-msgstr "kan inte ansluta till loggserver"
-
-#: plugins/sudoers/iolog.c:851
+#: plugins/sudoers/iolog.c:886
 #, 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:944 plugins/sudoers/iolog.c:1072
-#: plugins/sudoers/iolog.c:1177 plugins/sudoers/timestamp.c:855
-#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:492
-#: plugins/sudoers/visudo.c:498
+#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107
+#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855
+#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493
+#: plugins/sudoers/visudo.c:499
 msgid "unable to read the clock"
 msgstr "kan inte läsa klockan"
 
-#: plugins/sudoers/iolog.c:1169 plugins/sudoers/iolog_client.c:977
+#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193
 #, c-format
 msgid "%s: internal error, invalid signal %d"
 msgstr "%s: internt fel, ogiltig signal %d"
 
-#: plugins/sudoers/iolog_client.c:113 plugins/sudoers/iolog_client.c:392
-#: plugins/sudoers/iolog_client.c:1200 plugins/sudoers/iolog_client.c:1775
-msgid "error in event loop"
-msgstr "fel i händelseloop"
-
-#: plugins/sudoers/iolog_client.c:194
-#, c-format
-msgid "Creation of new SSL_CTX object failed: %s"
-msgstr "Skapande av nytt SSL_CTX-objekt misslyckades: %s"
-
-#: plugins/sudoers/iolog_client.c:346 plugins/sudoers/iolog_client.c:351
-#, c-format
-msgid "TLS connection to %s:%s failed: %s"
-msgstr "TLS-anslutning till %s:%s misslyckades: %s"
-
-#: plugins/sudoers/iolog_client.c:496
-msgid "TLS initialization was unsuccessful"
-msgstr "TLS-initiering misslyckades"
-
-#: plugins/sudoers/iolog_client.c:505
-msgid "TLS handshake was unsuccessful"
-msgstr "TLS-handskakning misslyckades"
-
-#: plugins/sudoers/iolog_client.c:767 plugins/sudoers/iolog_client.c:959
-msgid "unable to get time of day"
-msgstr "kan inte hämta tid på dagen"
-
-#: plugins/sudoers/iolog_client.c:986
-#, c-format
-msgid "%s: internal error, invalid exit status %d"
-msgstr "%s: internt fel, ogiltig avslutningskod %d"
-
-#: plugins/sudoers/iolog_client.c:1523
-msgid "lost connection to log server"
-msgstr "förlorade kontakten med loggservern"
-
-#: plugins/sudoers/iolog_client.c:1600
-msgid "missing write buffer"
-msgstr "saknar skrivbuffert"
-
-#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:291
+#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291
 msgid "starttls not supported when using ldaps"
 msgstr "starttls stöds inte när ldaps används"
 
-#: plugins/sudoers/ldap.c:247
+#: plugins/sudoers/ldap.c:248
 #, c-format
 msgid "unable to initialize SSL cert and key db: %s"
 msgstr "kan inte initiera SSL-certifikat och nyckeldatabas: %s"
 
-#: plugins/sudoers/ldap.c:250
+#: plugins/sudoers/ldap.c:251
 #, c-format
 msgid "you must set TLS_CERT in %s to use SSL"
 msgstr "du måste ställa in TLS_CERT i %s för att använda SSL"
 
-#: plugins/sudoers/ldap.c:1658
+#: plugins/sudoers/ldap.c:1660
 #, c-format
 msgid "unable to initialize LDAP: %s"
 msgstr "kan inte initiera LDAP: %s"
 
-#: plugins/sudoers/ldap.c:1694
+#: plugins/sudoers/ldap.c:1697
 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:1831 plugins/sudoers/parse_ldif.c:744
+#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744
 #, c-format
 msgid "invalid sudoOrder attribute: %s"
 msgstr "ogiltigt sudoOrder-attribut: %s"
 
 #: plugins/sudoers/ldap_conf.c:200
-msgid "sudo_ldap_conf_add_ports: port too large"
-msgstr "sudo_ldap_conf_add_ports: port är för stor"
+#, c-format
+msgid "%s: port too large"
+msgstr "%s: port för stor"
 
 #: plugins/sudoers/ldap_conf.c:260
 #, c-format
@@ -2083,7 +2125,7 @@ msgstr "LDAP-uri-typ stöds ej: %s"
 msgid "unable to mix ldap and ldaps URIs"
 msgstr "kan inte blanda ldap- och ldaps-URI:er"
 
-#: plugins/sudoers/ldap_util.c:548 plugins/sudoers/ldap_util.c:550
+#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555
 #, c-format
 msgid "unable to convert sudoOption: %s%s%s"
 msgstr "kan inte konvertera sudoOption: %s%s%s"
@@ -2092,66 +2134,91 @@ msgstr "kan inte konvertera sudoOption: %s%s%s"
 msgid "unable to open audit system"
 msgstr "kan inte öppna granskningssystem"
 
-#: plugins/sudoers/linux_audit.c:100
+#: plugins/sudoers/linux_audit.c:101
 msgid "unable to send audit message"
 msgstr "kan inte skicka granskningsmeddelande"
 
-#: plugins/sudoers/logging.c:167
+#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391
+#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023
+msgid "error in event loop"
+msgstr "fel i händelseloop"
+
+#: plugins/sudoers/log_client.c:193
 #, c-format
-msgid "unable to open log file: %s"
-msgstr "kan inte öppna loggfil: %s"
+msgid "Creation of new SSL_CTX object failed: %s"
+msgstr "Skapande av nytt SSL_CTX-objekt misslyckades: %s"
 
-#: plugins/sudoers/logging.c:175
+#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350
 #, c-format
-msgid "unable to lock log file: %s"
-msgstr "kan inte låsa loggfil: %s"
+msgid "TLS connection to %s:%s failed: %s"
+msgstr "TLS-anslutning till %s:%s misslyckades: %s"
 
-#: plugins/sudoers/logging.c:208
+#: plugins/sudoers/log_client.c:519
+msgid "TLS initialization was unsuccessful"
+msgstr "TLS-initiering misslyckades"
+
+#: plugins/sudoers/log_client.c:528
+msgid "TLS handshake was unsuccessful"
+msgstr "TLS-handskakning misslyckades"
+
+#: plugins/sudoers/log_client.c:1202
 #, c-format
-msgid "unable to write log file: %s"
-msgstr "kan inte skriva till loggfil: %s"
+msgid "%s: internal error, invalid exit status %d"
+msgstr "%s: internt fel, ogiltig avslutningskod %d"
+
+#: plugins/sudoers/log_client.c:1738
+msgid "lost connection to log server"
+msgstr "förlorade kontakten med loggservern"
+
+#: plugins/sudoers/log_client.c:1815
+msgid "missing write buffer"
+msgstr "saknar skrivbuffert"
+
+#: plugins/sudoers/log_client.c:1964
+msgid "unable to connect to log server"
+msgstr "kan inte ansluta till loggserver"
 
-#: plugins/sudoers/logging.c:241
+#: plugins/sudoers/logging.c:244
 msgid "user NOT in sudoers"
 msgstr "användare finns INTE i sudoers"
 
-#: plugins/sudoers/logging.c:243
+#: plugins/sudoers/logging.c:246
 msgid "user NOT authorized on host"
 msgstr "användaren är INTE auktoriserad på värddatorn"
 
-#: plugins/sudoers/logging.c:245
+#: plugins/sudoers/logging.c:248
 msgid "command not allowed"
 msgstr "kommandot tillåts inte"
 
-#: plugins/sudoers/logging.c:288
+#: plugins/sudoers/logging.c:269
 #, c-format
 msgid "%s is not in the sudoers file.  This incident will be reported.\n"
 msgstr "%s finns inte i filen sudoers.  Denna incident kommer att rapporteras.\n"
 
-#: plugins/sudoers/logging.c:291
+#: plugins/sudoers/logging.c:272
 #, c-format
 msgid "%s is not allowed to run sudo on %s.  This incident will be reported.\n"
 msgstr "%s tillåts inte att köra sudo på %s.  Denna incident kommer att rapporteras.\n"
 
-#: plugins/sudoers/logging.c:295
+#: plugins/sudoers/logging.c:276
 #, 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:298
+#: plugins/sudoers/logging.c:279
 #, 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:335 plugins/sudoers/sudoers.c:512
-#: plugins/sudoers/sudoers.c:514 plugins/sudoers/sudoers.c:516
-#: plugins/sudoers/sudoers.c:518 plugins/sudoers/sudoers.c:665
-#: plugins/sudoers/sudoers.c:667
+#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583
+#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587
+#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739
+#: plugins/sudoers/sudoers.c:741
 #, c-format
 msgid "%s: command not found"
 msgstr "%s: kommandot hittades inte"
 
-#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:508
+#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579
 #, c-format
 msgid ""
 "ignoring \"%s\" found in '.'\n"
@@ -2160,47 +2227,37 @@ 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:354
-msgid "authentication failure"
-msgstr "autentiseringsfel"
-
-#: plugins/sudoers/logging.c:380
-msgid "a password is required"
-msgstr "ett lösenord krävs"
-
-#: plugins/sudoers/logging.c:450
+#: plugins/sudoers/logging.c:337
 #, 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:714
-#, c-format
-msgid "unable to dup stdin: %m"
-msgstr "kan inte duplicera stdin: %m"
+#: plugins/sudoers/logging.c:393
+msgid "authentication failure"
+msgstr "autentiseringsfel"
 
-#: plugins/sudoers/logging.c:751
-#, c-format
-msgid "unable to execute %s: %m"
-msgstr "kan inte köra %s: %m"
+#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453
+msgid "a password is required"
+msgstr "ett lösenord krävs"
 
-#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:848
+#: plugins/sudoers/logging.c:729
 #, c-format
-msgid "unable to fork: %m"
-msgstr "kan inte grena process: %m"
+msgid "unable to open log file: %s"
+msgstr "kan inte öppna loggfil: %s"
 
-#: plugins/sudoers/logging.c:838
+#: plugins/sudoers/logging.c:762
 #, c-format
-msgid "unable to open pipe: %m"
-msgstr "kan inte öppna rör: %m"
+msgid "unable to write log file: %s"
+msgstr "kan inte skriva till loggfil: %s"
 
-#: plugins/sudoers/match_digest.c:116
+#: plugins/sudoers/match_digest.c:129
 #, 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:442
+#: plugins/sudoers/parse.c:518
 #, c-format
 msgid ""
 "\n"
@@ -2209,8 +2266,7 @@ msgstr ""
 "\n"
 "LDAP-roll: %s\n"
 
-#: plugins/sudoers/parse.c:445
-#, c-format
+#: plugins/sudoers/parse.c:521
 msgid ""
 "\n"
 "Sudoers entry:\n"
@@ -2218,42 +2274,38 @@ msgstr ""
 "\n"
 "Sudoers-post:\n"
 
-#: plugins/sudoers/parse.c:447
-#, c-format
+#: plugins/sudoers/parse.c:523
 msgid "    RunAsUsers: "
 msgstr "    KörSomAnvändare: "
 
-#: plugins/sudoers/parse.c:462
-#, c-format
+#: plugins/sudoers/parse.c:538
 msgid "    RunAsGroups: "
 msgstr "    KörSomGrupper: "
 
-#: plugins/sudoers/parse.c:472
-#, c-format
+#: plugins/sudoers/parse.c:548
 msgid "    Options: "
 msgstr "    Flaggor: "
 
-#: plugins/sudoers/parse.c:522
-#, c-format
+#: plugins/sudoers/parse.c:602
 msgid "    Commands:\n"
 msgstr "    Kommandon:\n"
 
-#: plugins/sudoers/parse.c:713
+#: plugins/sudoers/parse.c:793
 #, c-format
 msgid "Matching Defaults entries for %s on %s:\n"
 msgstr "Matchande standardposter för %s på %s:\n"
 
-#: plugins/sudoers/parse.c:731
+#: plugins/sudoers/parse.c:811
 #, 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:749
+#: plugins/sudoers/parse.c:829
 #, 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:764
+#: plugins/sudoers/parse.c:844
 #, 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"
@@ -2268,48 +2320,58 @@ msgstr "hoppar över ofullständig sudoRole: cn: %s"
 msgid "invalid LDIF attribute: %s"
 msgstr "ogiltigt LDIF-attribut: %s"
 
-#: plugins/sudoers/policy.c:77 plugins/sudoers/policy.c:102
+#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102
 #, c-format
 msgid "invalid %.*s set by sudo front-end"
 msgstr "ogiltigt %.*s inställt av sudo-framände"
 
-#: plugins/sudoers/policy.c:281 plugins/sudoers/testsudoers.c:272
+#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272
 msgid "unable to parse network address list"
 msgstr "kan inte tolka nätverksadresslista"
 
-#: plugins/sudoers/policy.c:426
+#: plugins/sudoers/policy.c:455
 msgid "user name not set by sudo front-end"
 msgstr "användarnamn inte inställt av sudo-framände"
 
-#: plugins/sudoers/policy.c:430
+#: plugins/sudoers/policy.c:459
 msgid "user-ID not set by sudo front-end"
 msgstr "användar-ID inte inställt av sudo-framände"
 
-#: plugins/sudoers/policy.c:434
+#: plugins/sudoers/policy.c:463
 msgid "group-ID not set by sudo front-end"
 msgstr "grupp-ID inte inställt av sudo-framände"
 
-#: plugins/sudoers/policy.c:438
+#: plugins/sudoers/policy.c:467
 msgid "host name not set by sudo front-end"
 msgstr "värdnamn inte inställt av sudo-framände"
 
-#: plugins/sudoers/policy.c:896 plugins/sudoers/visudo.c:230
-#: plugins/sudoers/visudo.c:861
+#: plugins/sudoers/policy.c:643
+#, c-format
+msgid "invalid working directory: %s"
+msgstr "ogiltig arbetskatalog: %s"
+
+#: plugins/sudoers/policy.c:811
+#, c-format
+msgid "invalid chroot directory: %s"
+msgstr "ogiltig chroot-katalog: %s"
+
+#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231
+#: plugins/sudoers/visudo.c:860
 #, c-format
 msgid "unable to execute %s"
 msgstr "kan inte köra %s"
 
-#: plugins/sudoers/policy.c:1060
+#: plugins/sudoers/policy.c:1111
 #, c-format
 msgid "Sudoers policy plugin version %s\n"
 msgstr "Sudoers policyinsticksmodul version %s\n"
 
-#: plugins/sudoers/policy.c:1062
+#: plugins/sudoers/policy.c:1113
 #, c-format
 msgid "Sudoers file grammar version %d\n"
 msgstr "Sudoers-filgrammatik version %d\n"
 
-#: plugins/sudoers/policy.c:1066
+#: plugins/sudoers/policy.c:1117
 #, c-format
 msgid ""
 "\n"
@@ -2318,86 +2380,86 @@ msgstr ""
 "\n"
 "Sökväg till sudoers: %s\n"
 
-#: plugins/sudoers/policy.c:1069
+#: plugins/sudoers/policy.c:1120
 #, c-format
 msgid "nsswitch path: %s\n"
 msgstr "Sökväg till nsswitch: %s\n"
 
-#: plugins/sudoers/policy.c:1071
+#: plugins/sudoers/policy.c:1122
 #, c-format
 msgid "ldap.conf path: %s\n"
 msgstr "Sökväg till ldap.conf: %s\n"
 
-#: plugins/sudoers/policy.c:1072
+#: plugins/sudoers/policy.c:1123
 #, c-format
 msgid "ldap.secret path: %s\n"
 msgstr "Sökväg till ldap.secret: %s\n"
 
-#: plugins/sudoers/policy.c:1105
+#: plugins/sudoers/policy.c:1156
 #, c-format
 msgid "unable to register hook of type %d (version %d.%d)"
 msgstr "kan inte registrera krok av typ %d (version %d.%d)"
 
-#: plugins/sudoers/pwutil.c:214 plugins/sudoers/pwutil.c:232
+#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235
 #, c-format
 msgid "unable to cache uid %u"
 msgstr "kan inte cacha uid %u"
 
-#: plugins/sudoers/pwutil.c:226
+#: plugins/sudoers/pwutil.c:229
 #, c-format
 msgid "unable to cache uid %u, already exists"
 msgstr "kan inte cacha uid %u, finns redan"
 
-#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:304
-#: plugins/sudoers/pwutil.c:367 plugins/sudoers/pwutil.c:412
+#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307
+#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415
 #, c-format
 msgid "unable to cache user %s"
 msgstr "kan inte cacha användare %s"
 
-#: plugins/sudoers/pwutil.c:299
+#: plugins/sudoers/pwutil.c:302
 #, c-format
 msgid "unable to cache user %s, already exists"
 msgstr "kan inte cacha användare %s, finns redan"
 
-#: plugins/sudoers/pwutil.c:531 plugins/sudoers/pwutil.c:549
+#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552
 #, c-format
 msgid "unable to cache gid %u"
 msgstr "kan inte cacha gid %u"
 
-#: plugins/sudoers/pwutil.c:543
+#: plugins/sudoers/pwutil.c:546
 #, c-format
 msgid "unable to cache gid %u, already exists"
 msgstr "kan inte cacha gid %u, finns redan"
 
-#: plugins/sudoers/pwutil.c:596 plugins/sudoers/pwutil.c:614
-#: plugins/sudoers/pwutil.c:662 plugins/sudoers/pwutil.c:704
+#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617
+#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707
 #, c-format
 msgid "unable to cache group %s"
 msgstr "kan inte cacha grupp %s"
 
-#: plugins/sudoers/pwutil.c:609
+#: plugins/sudoers/pwutil.c:612
 #, c-format
 msgid "unable to cache group %s, already exists"
 msgstr "kan inte cacha grupp %s, finns redan"
 
-#: plugins/sudoers/pwutil.c:831 plugins/sudoers/pwutil.c:883
-#: plugins/sudoers/pwutil.c:933 plugins/sudoers/pwutil.c:986
+#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885
+#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987
 #, 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:837 plugins/sudoers/pwutil.c:888
-#: plugins/sudoers/pwutil.c:939 plugins/sudoers/pwutil.c:991
+#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890
+#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992
 #, c-format
 msgid "unable to cache group list for %s"
 msgstr "kan inte cacha grupplista för %s"
 
-#: plugins/sudoers/pwutil.c:877
+#: plugins/sudoers/pwutil.c:879
 #, c-format
 msgid "unable to parse groups for %s"
 msgstr "kan inte tolka grupper för %s"
 
-#: plugins/sudoers/pwutil.c:980
+#: plugins/sudoers/pwutil.c:981
 #, c-format
 msgid "unable to parse gids for %s"
 msgstr "kan inte tolka gids för %s"
@@ -2461,239 +2523,259 @@ 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:573
+#: plugins/sudoers/sssd.c:572
 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:581 plugins/sudoers/sssd.c:590
-#: plugins/sudoers/sssd.c:599 plugins/sudoers/sssd.c:608
-#: plugins/sudoers/sssd.c:617
+#: 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
 #, c-format
 msgid "unable to find symbol \"%s\" in %s"
 msgstr "kan inte hitta symbol ”%s” i %s"
 
-#: plugins/sudoers/sudoers.c:217 plugins/sudoers/sudoers.c:943
+#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010
 msgid "problem with defaults entries"
 msgstr "problem med standardposter"
 
-#: plugins/sudoers/sudoers.c:221
+#: plugins/sudoers/sudoers.c:218
 msgid "no valid sudoers sources found, quitting"
 msgstr "inga giltiga sudoers-källor hittades, avslutar"
 
-#: plugins/sudoers/sudoers.c:297
+#: plugins/sudoers/sudoers.c:292
+#, 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:294
+#, 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:319
+#, 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:320
+#, 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:351
 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:357
+#: plugins/sudoers/sudoers.c:411
 msgid "user not allowed to override closefrom limit"
 msgstr "användare inte tillåten att åsidosätta closefrom-begränsning"
 
-#: plugins/sudoers/sudoers.c:358
+#: plugins/sudoers/sudoers.c:412
 msgid "you are not permitted to use the -C option"
 msgstr "du tillåts inte att använda flaggan -C"
 
-#: plugins/sudoers/sudoers.c:420
+#: plugins/sudoers/sudoers.c:472
 #, 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:435
+#: plugins/sudoers/sudoers.c:487
 msgid "no tty"
 msgstr "ingen tty"
 
-#: plugins/sudoers/sudoers.c:436
+#: plugins/sudoers/sudoers.c:488
 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:442 plugins/sudoers/sudoers.c:444
+#: plugins/sudoers/sudoers.c:495
 #, c-format
 msgid "invalid shell for user %s: %s"
 msgstr "ogiltigt skal för användare %s: %s"
 
-#: plugins/sudoers/sudoers.c:507
+#: plugins/sudoers/sudoers.c:578
 msgid "command in current directory"
 msgstr "kommando i aktuell katalog"
 
-#: plugins/sudoers/sudoers.c:525
+#: plugins/sudoers/sudoers.c:597
 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:526
+#: plugins/sudoers/sudoers.c:599
 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:534
-msgid "user not allowed to set a preserve the environment"
-msgstr "användare inte tillåten att ställa in att behålla miljön"
+#: plugins/sudoers/sudoers.c:607
+msgid "user not allowed to preserve the environment"
+msgstr "användare inte tillåten att behålla miljön"
 
-#: plugins/sudoers/sudoers.c:535
+#: plugins/sudoers/sudoers.c:609
 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:878
+#: plugins/sudoers/sudoers.c:945
 msgid "command too long"
 msgstr "kommandot för långt"
 
-#: plugins/sudoers/sudoers.c:936
+#: plugins/sudoers/sudoers.c:1003
 msgid "sudoedit doesn't need to be run via sudo"
 msgstr "sudoedit behöver inte köras via sudo"
 
-#: plugins/sudoers/sudoers.c:990 plugins/sudoers/sudoreplay.c:1548
+#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547
 #: plugins/sudoers/tsdump.c:138
 #, c-format
 msgid "unable to read %s"
 msgstr "kan inte läsa %s"
 
-#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/visudo.c:431
-#: plugins/sudoers/visudo.c:727
+#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432
+#: plugins/sudoers/visudo.c:726
 #, c-format
 msgid "unable to stat %s"
 msgstr "kan inte ta status på %s"
 
-#: plugins/sudoers/sudoers.c:1019 plugins/sudoers/visudo.c:1037
+#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018
 #, c-format
 msgid "%s is not a regular file"
 msgstr "%s är inte en vanlig fil"
 
-#: plugins/sudoers/sudoers.c:1023 plugins/sudoers/timestamp.c:252 toke.l:1060
+#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112
 #, 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:1027 toke.l:1065
+#: plugins/sudoers/sudoers.c:1094 toke.l:1117
 #, c-format
 msgid "%s is world writable"
 msgstr "%s är skrivbar för alla"
 
-#: plugins/sudoers/sudoers.c:1031 toke.l:1068
+#: plugins/sudoers/sudoers.c:1098 toke.l:1120
 #, 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:1064
+#: plugins/sudoers/sudoers.c:1131
 #, c-format
 msgid "only root can use \"-c %s\""
 msgstr "endast root kan använda ”-c %s”"
 
-#: plugins/sudoers/sudoers.c:1083
+#: plugins/sudoers/sudoers.c:1150
 #, c-format
 msgid "unknown login class: %s"
 msgstr "okänd inloggningsklass: %s"
 
-#: plugins/sudoers/sudoers.c:1168 plugins/sudoers/sudoers.c:1183
+#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250
 #, c-format
 msgid "unable to resolve host %s"
 msgstr "kan inte slå upp värddatorn %s"
 
-#: plugins/sudoers/sudoreplay.c:258
+#: plugins/sudoers/sudoreplay.c:257
 #, c-format
 msgid "invalid filter option: %s"
 msgstr "ogiltig filterflagga: %s"
 
-#: plugins/sudoers/sudoreplay.c:274
+#: plugins/sudoers/sudoreplay.c:273
 #, c-format
 msgid "invalid max wait: %s"
 msgstr "ogiltig största väntan: %s"
 
-#: plugins/sudoers/sudoreplay.c:297
+#: plugins/sudoers/sudoreplay.c:296
 #, c-format
 msgid "invalid speed factor: %s"
 msgstr "ogiltig hastighetsfaktor: %s"
 
-#: plugins/sudoers/sudoreplay.c:333
+#: plugins/sudoers/sudoreplay.c:332
 #, c-format
 msgid "%s/%.2s/%.2s/%.2s: %s"
 msgstr "%s/%.2s/%.2s/%.2s: %s"
 
-#: plugins/sudoers/sudoreplay.c:338
+#: plugins/sudoers/sudoreplay.c:337
 #, c-format
 msgid "%s/timing: %s"
 msgstr "%s/tidsmätning: %s"
 
-#: plugins/sudoers/sudoreplay.c:342
+#: plugins/sudoers/sudoreplay.c:341
 #, c-format
 msgid "%s/%s: %s"
 msgstr "%s/%s: %s"
 
-#: plugins/sudoers/sudoreplay.c:366
+#: plugins/sudoers/sudoreplay.c:365
 #, c-format
 msgid "Replaying sudo session: %s"
 msgstr "Spelar upp sudo-session: %s"
 
-#: plugins/sudoers/sudoreplay.c:628
+#: plugins/sudoers/sudoreplay.c:627
 msgid "unable to set tty to raw mode"
 msgstr "kan inte ställa in tty i råläge"
 
-#: plugins/sudoers/sudoreplay.c:679
+#: plugins/sudoers/sudoreplay.c:678
 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:680
+#: plugins/sudoers/sudoreplay.c:679
 #, 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:708
+#: plugins/sudoers/sudoreplay.c:707
 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:1198 plugins/sudoers/sudoreplay.c:1228
+#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227
 #, c-format
 msgid "ambiguous expression \"%s\""
 msgstr "tvetydigt uttryck ”%s”"
 
-#: plugins/sudoers/sudoreplay.c:1250
+#: plugins/sudoers/sudoreplay.c:1249
 msgid "unmatched ')' in expression"
 msgstr "omatchat ”)” i uttryck"
 
-#: plugins/sudoers/sudoreplay.c:1254
+#: plugins/sudoers/sudoreplay.c:1253
 #, c-format
 msgid "unknown search term \"%s\""
 msgstr "okänt sökvillkor ”%s”"
 
-#: plugins/sudoers/sudoreplay.c:1269
+#: plugins/sudoers/sudoreplay.c:1268
 #, c-format
 msgid "%s requires an argument"
 msgstr "%s kräver ett argument"
 
-#: plugins/sudoers/sudoreplay.c:1272 plugins/sudoers/sudoreplay.c:1524
+#: 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:1277
+#: plugins/sudoers/sudoreplay.c:1276
 #, c-format
 msgid "could not parse date \"%s\""
 msgstr "kunde inte tolka datumet ”%s”"
 
-#: plugins/sudoers/sudoreplay.c:1286
+#: plugins/sudoers/sudoreplay.c:1285
 msgid "unmatched '(' in expression"
 msgstr "omatchat ”(” i uttryck"
 
-#: plugins/sudoers/sudoreplay.c:1288
+#: plugins/sudoers/sudoreplay.c:1287
 msgid "illegal trailing \"or\""
 msgstr "ogiltigt avslutande ”or”"
 
-#: plugins/sudoers/sudoreplay.c:1290
+#: plugins/sudoers/sudoreplay.c:1289
 msgid "illegal trailing \"!\""
 msgstr "ogiltigt efterföljande ”!”"
 
-#: plugins/sudoers/sudoreplay.c:1348
+#: plugins/sudoers/sudoreplay.c:1347
 #, c-format
 msgid "unknown search type %d"
 msgstr "okänd söktyp %d"
 
-#: plugins/sudoers/sudoreplay.c:1615
+#: plugins/sudoers/sudoreplay.c:1614
 #, 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:1618
+#: plugins/sudoers/sudoreplay.c:1617
 #, 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:1627
+#: plugins/sudoers/sudoreplay.c:1626
 #, c-format
 msgid ""
 "%s - replay sudo session logs\n"
@@ -2702,7 +2784,7 @@ msgstr ""
 "%s - spela upp loggar från sudo-session\n"
 "\n"
 
-#: plugins/sudoers/sudoreplay.c:1629
+#: plugins/sudoers/sudoreplay.c:1628
 msgid ""
 "\n"
 "Options:\n"
@@ -2730,11 +2812,11 @@ msgstr ""
 "  -s, --speed=num      påskynda eller fördröj utmatning\n"
 "  -V, --version        visa versionsinformation och avsluta"
 
-#: plugins/sudoers/testsudoers.c:354
+#: plugins/sudoers/testsudoers.c:348
 msgid "\thost  unmatched"
 msgstr "\tvärd  omatchad"
 
-#: plugins/sudoers/testsudoers.c:357
+#: plugins/sudoers/testsudoers.c:351
 msgid ""
 "\n"
 "Command allowed"
@@ -2742,7 +2824,7 @@ msgstr ""
 "\n"
 "Kommandot tillåts"
 
-#: plugins/sudoers/testsudoers.c:358
+#: plugins/sudoers/testsudoers.c:352
 msgid ""
 "\n"
 "Command denied"
@@ -2750,7 +2832,7 @@ msgstr ""
 "\n"
 "Kommandot nekades"
 
-#: plugins/sudoers/testsudoers.c:358
+#: plugins/sudoers/testsudoers.c:352
 msgid ""
 "\n"
 "Command unmatched"
@@ -2795,90 +2877,90 @@ msgstr "sudoedit ska inte anges med en sökväg"
 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:227
+#: plugins/sudoers/visudo.c:228
 msgid "please consider using the cvtsudoers utility instead"
 msgstr "överväg att använda verktyget cvtsudoers istället"
 
-#: plugins/sudoers/visudo.c:278 plugins/sudoers/visudo.c:660
+#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659
 #, c-format
 msgid "press return to edit %s: "
 msgstr "tryck på retur för att redigera %s: "
 
-#: plugins/sudoers/visudo.c:339
+#: plugins/sudoers/visudo.c:340
 #, c-format
 msgid "specified editor (%s) doesn't exist"
 msgstr "angiven redigerare (%s) finns inte"
 
-#: plugins/sudoers/visudo.c:341
+#: plugins/sudoers/visudo.c:342
 #, c-format
 msgid "no editor found (editor path = %s)"
 msgstr "ingen textredigerare hittad (sökväg för textredigerare = %s)"
 
-#: plugins/sudoers/visudo.c:451 plugins/sudoers/visudo.c:459
+#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460
 msgid "write error"
 msgstr "skrivfel"
 
-#: plugins/sudoers/visudo.c:505
+#: plugins/sudoers/visudo.c:506
 #, 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:512
+#: plugins/sudoers/visudo.c:513
 #, c-format
 msgid "zero length temporary file (%s), %s unchanged"
 msgstr "temporärfil tom (%s), %s oförändrad"
 
-#: plugins/sudoers/visudo.c:518
+#: plugins/sudoers/visudo.c:519
 #, c-format
 msgid "editor (%s) failed, %s unchanged"
 msgstr "redigeraren (%s) misslyckades, %s är oförändrad"
 
-#: plugins/sudoers/visudo.c:540
+#: plugins/sudoers/visudo.c:541
 #, c-format
 msgid "%s unchanged"
 msgstr "%s oförändrad"
 
-#: plugins/sudoers/visudo.c:599
+#: plugins/sudoers/visudo.c:598
 #, 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:611
+#: plugins/sudoers/visudo.c:610
 #, 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:649
+#: plugins/sudoers/visudo.c:648
 #, c-format
 msgid "internal error, unable to find %s in list!"
 msgstr "internt fel, kan inte hitta %s i listan!"
 
-#: plugins/sudoers/visudo.c:729 plugins/sudoers/visudo.c:738
+#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737
 #, 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:761
+#: plugins/sudoers/visudo.c:760
 #, 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:775
+#: plugins/sudoers/visudo.c:774
 #, 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:785
+#: plugins/sudoers/visudo.c:784
 #, c-format
 msgid "error renaming %s, %s unchanged"
 msgstr "fel vid namnbyte för %s, %s är oförändrad"
 
-#: plugins/sudoers/visudo.c:806
+#: plugins/sudoers/visudo.c:805
 msgid "What now? "
 msgstr "Nu då? "
 
-#: plugins/sudoers/visudo.c:820
+#: plugins/sudoers/visudo.c:819
 msgid ""
 "Options are:\n"
 "  (e)dit sudoers file again\n"
@@ -2890,66 +2972,66 @@ 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:866
+#: plugins/sudoers/visudo.c:865
 #, c-format
 msgid "unable to run %s"
 msgstr "kan inte köra %s"
 
-#: plugins/sudoers/visudo.c:896
+#: plugins/sudoers/visudo.c:895
 #, 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:903
+#: plugins/sudoers/visudo.c:902
 #, 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:960 plugins/sudoers/visudo.c:967
+#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958
 #, c-format
 msgid "%s: parsed OK\n"
 msgstr "%s: tolkad OK\n"
 
-#: plugins/sudoers/visudo.c:986
+#: plugins/sudoers/visudo.c:977
 #, c-format
 msgid "%s busy, try again later"
 msgstr "%s är upptagen, försök igen senare"
 
-#: plugins/sudoers/visudo.c:989
+#: plugins/sudoers/visudo.c:980
 #, c-format
 msgid "unable to lock %s"
 msgstr "kan inte låsa %s"
 
-#: plugins/sudoers/visudo.c:990
+#: plugins/sudoers/visudo.c:981
 msgid "Edit anyway? [y/N]"
 msgstr "Redigera ändå? [y/N]"
 
-#: plugins/sudoers/visudo.c:1083
+#: plugins/sudoers/visudo.c:1091
 #, c-format
-msgid "Error: %s:%d cycle in %s \"%s\""
-msgstr "Fel: %s:%d cykel i %s ”%s”"
+msgid "Error: %s:%d:%d: cycle in %s \"%s\""
+msgstr "Fel: %s:%d:%d: cykel i %s ”%s”"
 
-#: plugins/sudoers/visudo.c:1084
+#: plugins/sudoers/visudo.c:1092
 #, c-format
-msgid "Warning: %s:%d cycle in %s \"%s\""
-msgstr "Varning: %s:%d cykel i %s ”%s”"
+msgid "Warning: %s:%d:%d: cycle in %s \"%s\""
+msgstr "Varning: %s:%d:%d: cykel i %s ”%s”"
 
-#: plugins/sudoers/visudo.c:1088
+#: plugins/sudoers/visudo.c:1096
 #, c-format
-msgid "Error: %s:%d %s \"%s\" referenced but not defined"
-msgstr "Fel: %s:%d %s ”%s” refererad till men inte definierad"
+msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined"
+msgstr "Fel: %s:%d:%d: %s ”%s” refererad till men inte definierad"
 
-#: plugins/sudoers/visudo.c:1089
+#: plugins/sudoers/visudo.c:1097
 #, c-format
-msgid "Warning: %s:%d %s \"%s\" referenced but not defined"
-msgstr "Varning: %s:%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"
 
-#: plugins/sudoers/visudo.c:1180
+#: plugins/sudoers/visudo.c:1188
 #, c-format
-msgid "Warning: %s:%d unused %s \"%s\""
-msgstr "Varning: %s:%d oanvänd %s ”%s”"
+msgid "Warning: %s:%d:%d: unused %s \"%s\""
+msgstr "Varning: %s:%d:%d: oanvänd %s ”%s”"
 
-#: plugins/sudoers/visudo.c:1295
+#: plugins/sudoers/visudo.c:1303
 #, c-format
 msgid ""
 "%s - safely edit the sudoers file\n"
@@ -2958,7 +3040,7 @@ msgstr ""
 "%s - redigera sudoers-filen på ett säkert sätt\n"
 "\n"
 
-#: plugins/sudoers/visudo.c:1297
+#: plugins/sudoers/visudo.c:1305
 msgid ""
 "\n"
 "Options:\n"
@@ -2978,10 +3060,43 @@ msgstr ""
 "  -s, --strict             strikt syntaxkontroll\n"
 "  -V, --version            visa versionsinformation och avsluta\n"
 
-#: toke.l:1032
+#: toke.l:179
+msgid "empty string"
+msgstr "tom sträng"
+
+#: toke.l:189 toke.l:491
+msgid "empty group"
+msgstr "tom grupp"
+
+#: toke.l:197 toke.l:489
+msgid "empty netgroup"
+msgstr "tom nätgrupp"
+
+#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392
+msgid "invalid line continuation"
+msgstr "ogiltig radfortsättning"
+
+#: toke.l:528 toke.l:540
+msgid "invalid IPv6 address"
+msgstr "ogiltig IPv6-adress"
+
+#: toke.l:764
+msgid "unexpected line break in string"
+msgstr "oväntad radbrytning i sträng"
+
+#: toke.l:1084
 msgid "too many levels of includes"
 msgstr "för många nivåer av inkluderingar"
 
+#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library"
+#~ msgstr "Förinläs attrapp-exec-funktioner som finns i biblioteket sudo_noexec"
+
+#~ msgid "sudo_ldap_conf_add_ports: port too large"
+#~ msgstr "sudo_ldap_conf_add_ports: port är för stor"
+
+#~ msgid "unable to lock log file: %s"
+#~ msgstr "kan inte låsa loggfil: %s"
+
 #~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n"
 #~ msgstr "SSL_connect misslyckades: ssl_error=%d, stack=%s\n"
 
index 6f1787f..d4be264 100644 (file)
@@ -839,11 +839,11 @@ sudoers_policy_store_result(bool accepted, char *argv[], char *envp[],
     }
 #endif /* HAVE_LOGIN_CAP_H */
 #ifdef HAVE_SELINUX
-    if (user_role != NULL) {
+    if (def_selinux && user_role != NULL) {
        if ((command_info[info_len++] = sudo_new_key_val("selinux_role", user_role)) == NULL)
            goto oom;
     }
-    if (user_type != NULL) {
+    if (def_selinux && user_type != NULL) {
        if ((command_info[info_len++] = sudo_new_key_val("selinux_type", user_type)) == NULL)
            goto oom;
     }
index 4426e09..04233a3 100644 (file)
@@ -66,7 +66,7 @@ rcstr_alloc(size_t len)
     rcs->refcnt = 1;
     rcs->str[0] = '\0';
     /* cppcheck-suppress memleak */
-    debug_return_ptr(rcs->str);
+    debug_return_ptr(rcs->str); // -V773
 }
 
 char *
index 3c837b8..a7d023c 100644 (file)
@@ -109,7 +109,7 @@ rbcreate(int (*compar)(const void *, const void*))
      * Similarly, the fake root node keeps us from having to worry
      * about splitting the root.
      */
-    tree->root.left = tree->root.right = tree->root.parent = &tree->nil;
+    tree->root.left = tree->root.right = tree->root.parent = &tree->nil; // -V778
     tree->root.color = black;
     tree->root.data = NULL;
 
index 8217a77..daee5fd 100644 (file)
@@ -98,7 +98,7 @@ get_starttime(pid_t pid, struct timespec *starttime)
     mib[3] = (int)pid;
     mib[4] = sizeof(*ki_proc);
     mib[5] = 1;
-    do {
+    for (;;) {
        struct sudo_kinfo_proc *kp;
 
        size += size / 10;
@@ -108,7 +108,9 @@ get_starttime(pid_t pid, struct timespec *starttime)
        }
        ki_proc = kp;
        rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0);
-    } while (rc == -1 && errno == ENOMEM);
+       if (rc != -1 || errno != ENOMEM)
+           break;
+    }
     if (rc != -1) {
 #if defined(HAVE_KINFO_PROC_FREEBSD)
        /* FreeBSD and Dragonfly */
index 670a7d7..d6eddd0 100644 (file)
@@ -296,7 +296,7 @@ check_user_runchroot(void)
     free(def_runchroot);
     if ((def_runchroot = strdup(user_runchroot)) == NULL) {
        sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
-       debug_return_bool(-1);
+       debug_return_int(-1);
     }
     debug_return_bool(true);
 }
index 14ffe55..ace568e 100644 (file)
@@ -307,17 +307,7 @@ ts_write(int fd, const char *fname, struct timestamp_entry *entry, off_t offset)
        nwritten = write(fd, entry, entry->size);
     } else {
        old_eof = offset;
-#ifdef HAVE_PWRITE
        nwritten = pwrite(fd, entry, entry->size, offset);
-#else
-       if (lseek(fd, offset, SEEK_SET) == -1) {
-           sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO,
-               "unable to seek to %lld", (long long)offset);
-           nwritten = -1;
-       } else {
-           nwritten = write(fd, entry, entry->size);
-       }
-#endif
     }
     if ((size_t)nwritten != entry->size) {
        if (nwritten == -1) {
@@ -577,16 +567,7 @@ ts_read(struct ts_cookie *cookie, struct timestamp_entry *entry)
     }
 
     /* Seek to the record position and read it.  */
-#ifdef HAVE_PREAD
     nread = pread(cookie->fd, entry, sizeof(*entry), cookie->pos);
-#else
-    if (lseek(cookie->fd, cookie->pos, SEEK_SET) == -1) {
-       sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO,
-           "unable to seek to %lld", (long long)cookie->pos);
-       goto done;
-    }
-    nread = read(cookie->fd, entry, sizeof(*entry));
-#endif
     if (nread != sizeof(*entry)) {
        /* short read, should not happen */
        sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
index 1e4d9bc..366f805 100644 (file)
@@ -2759,6 +2759,9 @@ char *sudoerstext;
 # define NAMLEN(dirent)        strlen((dirent)->d_name)
 #endif
 
+// PVS Studio suppression
+// -V::519, 1004, 1037
+
 int sudolineno;                        /* current sudoers line number. */
 char *sudoers;                 /* sudoers file being parsed. */
 struct sudolinebuf sudolinebuf;        /* sudoers line being parsed. */
@@ -2801,7 +2804,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print;
 
 
 
-#line 2799 "toke.c"
+#line 2802 "toke.c"
 
 #define INITIAL 0
 #define GOTDEFS 1
@@ -3021,9 +3024,9 @@ YY_DECL
        }
 
        {
-#line 114 "toke.l"
+#line 117 "toke.l"
 
-#line 3021 "toke.c"
+#line 3024 "toke.c"
 
        while ( 1 )             /* loops until end-of-file is reached */
                {
@@ -3083,7 +3086,7 @@ do_action:        /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 115 "toke.l"
+#line 118 "toke.l"
 {
                            LEXTRACE(", ");
                            return ',';
@@ -3091,12 +3094,12 @@ YY_RULE_SETUP
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 120 "toke.l"
+#line 123 "toke.l"
 BEGIN STARTDEFS;
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 122 "toke.l"
+#line 125 "toke.l"
 {
                            BEGIN INDEFS;
                            LEXTRACE("DEFVAR ");
@@ -3108,7 +3111,7 @@ YY_RULE_SETUP
 
 case 4:
 YY_RULE_SETUP
-#line 131 "toke.l"
+#line 134 "toke.l"
 {
                            BEGIN STARTDEFS;
                            LEXTRACE(", ");
@@ -3117,7 +3120,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 137 "toke.l"
+#line 140 "toke.l"
 {
                            LEXTRACE("= ");
                            return '=';
@@ -3125,7 +3128,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 142 "toke.l"
+#line 145 "toke.l"
 {
                            LEXTRACE("+= ");
                            return '+';
@@ -3133,7 +3136,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 147 "toke.l"
+#line 150 "toke.l"
 {
                            LEXTRACE("-= ");
                            return '-';
@@ -3141,7 +3144,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 152 "toke.l"
+#line 155 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -3151,7 +3154,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 159 "toke.l"
+#line 162 "toke.l"
 {
                            LEXTRACE("WORD(2) ");
                            if (!fill(sudoerstext, sudoersleng))
@@ -3164,7 +3167,7 @@ YY_RULE_SETUP
 case 10:
 /* rule 10 can match eol */
 YY_RULE_SETUP
-#line 168 "toke.l"
+#line 171 "toke.l"
 {
                            /* Line continuation char followed by newline. */
                            sudolineno++;
@@ -3173,7 +3176,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 174 "toke.l"
+#line 177 "toke.l"
 {
                            LEXTRACE("ENDSTR ");
                            BEGIN prev_state;
@@ -3211,7 +3214,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 209 "toke.l"
+#line 212 "toke.l"
 {
                            LEXTRACE("BACKSLASH ");
                            if (!append(sudoerstext, sudoersleng))
@@ -3220,7 +3223,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 215 "toke.l"
+#line 218 "toke.l"
 {
                            LEXTRACE("STRBODY ");
                            if (!append(sudoerstext, sudoersleng))
@@ -3231,7 +3234,7 @@ YY_RULE_SETUP
 
 case 14:
 YY_RULE_SETUP
-#line 223 "toke.l"
+#line 226 "toke.l"
 {
                            /* quoted fnmatch glob char, pass verbatim */
                            LEXTRACE("QUOTEDCHAR ");
@@ -3242,7 +3245,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 231 "toke.l"
+#line 234 "toke.l"
 {
                            /* quoted sudoers special char, strip backslash */
                            LEXTRACE("QUOTEDCHAR ");
@@ -3254,7 +3257,7 @@ YY_RULE_SETUP
 case 16:
 /* rule 16 can match eol */
 YY_RULE_SETUP
-#line 239 "toke.l"
+#line 242 "toke.l"
 {
                            BEGIN INITIAL;
                            sudoersless(0);
@@ -3264,7 +3267,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 246 "toke.l"
+#line 249 "toke.l"
 {
                            LEXTRACE("ARG ");
                            if (!fill_args(sudoerstext, sudoersleng, sawspace))
@@ -3275,7 +3278,7 @@ YY_RULE_SETUP
 
 case 18:
 YY_RULE_SETUP
-#line 254 "toke.l"
+#line 257 "toke.l"
 {
                            /* Only return DIGEST if the length is correct. */
                            yy_size_t digest_len =
@@ -3293,7 +3296,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 269 "toke.l"
+#line 272 "toke.l"
 {
                            /* Only return DIGEST if the length is correct. */
                            yy_size_t len, digest_len =
@@ -3318,7 +3321,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 291 "toke.l"
+#line 294 "toke.l"
 {
                            if (continued) {
                                sudoerserror(N_("invalid line continuation"));
@@ -3333,7 +3336,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 303 "toke.l"
+#line 306 "toke.l"
 {
                            if (continued) {
                                sudoerserror(N_("invalid line continuation"));
@@ -3349,7 +3352,7 @@ YY_RULE_SETUP
 case 22:
 /* rule 22 can match eol */
 YY_RULE_SETUP
-#line 315 "toke.l"
+#line 318 "toke.l"
 {
                            if (continued) {
                                sudoerserror(N_("invalid line continuation"));
@@ -3369,7 +3372,7 @@ YY_RULE_SETUP
 case 23:
 /* rule 23 can match eol */
 YY_RULE_SETUP
-#line 331 "toke.l"
+#line 334 "toke.l"
 {
                            if (continued) {
                                sudoerserror(N_("invalid line continuation"));
@@ -3388,7 +3391,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 347 "toke.l"
+#line 350 "toke.l"
 {
                            char deftype;
                            int n;
@@ -3432,7 +3435,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 388 "toke.l"
+#line 391 "toke.l"
 {
                            int n;
 
@@ -3462,7 +3465,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 415 "toke.l"
+#line 418 "toke.l"
 {
                                /* cmnd does not require passwd for this user */
                                LEXTRACE("NOPASSWD ");
@@ -3471,7 +3474,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 421 "toke.l"
+#line 424 "toke.l"
 {
                                /* cmnd requires passwd for this user */
                                LEXTRACE("PASSWD ");
@@ -3480,7 +3483,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 427 "toke.l"
+#line 430 "toke.l"
 {
                                LEXTRACE("NOEXEC ");
                                return NOEXEC;
@@ -3488,7 +3491,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 432 "toke.l"
+#line 435 "toke.l"
 {
                                LEXTRACE("EXEC ");
                                return EXEC;
@@ -3496,7 +3499,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 437 "toke.l"
+#line 440 "toke.l"
 {
                                LEXTRACE("SETENV ");
                                return SETENV;
@@ -3504,7 +3507,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 442 "toke.l"
+#line 445 "toke.l"
 {
                                LEXTRACE("NOSETENV ");
                                return NOSETENV;
@@ -3512,7 +3515,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 447 "toke.l"
+#line 450 "toke.l"
 {
                                LEXTRACE("LOG_OUTPUT ");
                                return LOG_OUTPUT;
@@ -3520,7 +3523,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 452 "toke.l"
+#line 455 "toke.l"
 {
                                LEXTRACE("NOLOG_OUTPUT ");
                                return NOLOG_OUTPUT;
@@ -3528,7 +3531,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 457 "toke.l"
+#line 460 "toke.l"
 {
                                LEXTRACE("LOG_INPUT ");
                                return LOG_INPUT;
@@ -3536,7 +3539,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 462 "toke.l"
+#line 465 "toke.l"
 {
                                LEXTRACE("NOLOG_INPUT ");
                                return NOLOG_INPUT;
@@ -3544,7 +3547,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 467 "toke.l"
+#line 470 "toke.l"
 {
                                LEXTRACE("MAIL ");
                                return MAIL;
@@ -3552,7 +3555,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 472 "toke.l"
+#line 475 "toke.l"
 {
                                LEXTRACE("NOMAIL ");
                                return NOMAIL;
@@ -3560,7 +3563,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 477 "toke.l"
+#line 480 "toke.l"
 {
                                LEXTRACE("FOLLOW ");
                                return FOLLOWLNK;
@@ -3568,7 +3571,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 482 "toke.l"
+#line 485 "toke.l"
 {
                                LEXTRACE("NOFOLLOW ");
                                return NOFOLLOWLNK;
@@ -3576,7 +3579,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 487 "toke.l"
+#line 490 "toke.l"
 {
                            if (sudoerstext[0] == '+')
                                sudoerserror(N_("empty netgroup"));
@@ -3588,7 +3591,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 496 "toke.l"
+#line 499 "toke.l"
 {
                            /* netgroup */
                            if (!fill(sudoerstext, sudoersleng))
@@ -3599,7 +3602,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 504 "toke.l"
+#line 507 "toke.l"
 {
                            /* group */
                            if (!fill(sudoerstext, sudoersleng))
@@ -3610,7 +3613,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 512 "toke.l"
+#line 515 "toke.l"
 {
                            if (!fill(sudoerstext, sudoersleng))
                                yyterminate();
@@ -3620,7 +3623,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 519 "toke.l"
+#line 522 "toke.l"
 {
                            if (!fill(sudoerstext, sudoersleng))
                                yyterminate();
@@ -3630,7 +3633,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 526 "toke.l"
+#line 529 "toke.l"
 {
                            if (!ipv6_valid(sudoerstext)) {
                                sudoerserror(N_("invalid IPv6 address"));
@@ -3645,7 +3648,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 538 "toke.l"
+#line 541 "toke.l"
 {
                            if (!ipv6_valid(sudoerstext)) {
                                sudoerserror(N_("invalid IPv6 address"));
@@ -3660,7 +3663,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 550 "toke.l"
+#line 553 "toke.l"
 {
                            LEXTRACE("ALL ");
                            return ALL;
@@ -3669,7 +3672,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 556 "toke.l"
+#line 559 "toke.l"
 {
                            LEXTRACE("CMND_TIMEOUT ");
                            return CMND_TIMEOUT;
@@ -3677,7 +3680,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 561 "toke.l"
+#line 564 "toke.l"
 {
                            LEXTRACE("NOTBEFORE ");
                            return NOTBEFORE;
@@ -3685,7 +3688,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 566 "toke.l"
+#line 569 "toke.l"
 {
                            LEXTRACE("NOTAFTER ");
                            return NOTAFTER;
@@ -3693,7 +3696,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 571 "toke.l"
+#line 574 "toke.l"
 {
                            LEXTRACE("CWD ");
                            prev_state = YY_START;
@@ -3703,7 +3706,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 578 "toke.l"
+#line 581 "toke.l"
 {
                            LEXTRACE("CHROOT ");
                            prev_state = YY_START;
@@ -3713,7 +3716,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 585 "toke.l"
+#line 588 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("ROLE ");
@@ -3725,7 +3728,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 594 "toke.l"
+#line 597 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("TYPE ");
@@ -3737,7 +3740,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 602 "toke.l"
+#line 605 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("PRIVS ");
@@ -3749,7 +3752,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 611 "toke.l"
+#line 614 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("LIMITPRIVS ");
@@ -3761,7 +3764,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 620 "toke.l"
+#line 623 "toke.l"
 {
                        got_alias:
                            if (!fill(sudoerstext, sudoersleng))
@@ -3772,7 +3775,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 628 "toke.l"
+#line 631 "toke.l"
 {
                            /* XXX - no way to specify digest for command */
                            /* no command args allowed for Defaults!/path */
@@ -3784,7 +3787,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 637 "toke.l"
+#line 640 "toke.l"
 {
                            digest_type = SUDO_DIGEST_SHA224;
                            BEGIN WANTDIGEST;
@@ -3794,7 +3797,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 644 "toke.l"
+#line 647 "toke.l"
 {
                            digest_type = SUDO_DIGEST_SHA256;
                            BEGIN WANTDIGEST;
@@ -3804,7 +3807,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 651 "toke.l"
+#line 654 "toke.l"
 {
                            digest_type = SUDO_DIGEST_SHA384;
                            BEGIN WANTDIGEST;
@@ -3814,7 +3817,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 658 "toke.l"
+#line 661 "toke.l"
 {
                            digest_type = SUDO_DIGEST_SHA512;
                            BEGIN WANTDIGEST;
@@ -3824,7 +3827,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 665 "toke.l"
+#line 668 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -3834,7 +3837,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 672 "toke.l"
+#line 675 "toke.l"
 {
                                BEGIN prev_state;
                                if (!fill(sudoerstext, sudoersleng))
@@ -3845,7 +3848,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 680 "toke.l"
+#line 683 "toke.l"
 {
                            /* directories can't have args... */
                            if (sudoerstext[sudoersleng - 1] == '/') {
@@ -3862,7 +3865,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 694 "toke.l"
+#line 697 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -3872,7 +3875,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 701 "toke.l"
+#line 704 "toke.l"
 {
                            /* a word */
                            if (!fill(sudoerstext, sudoersleng))
@@ -3884,7 +3887,7 @@ YY_RULE_SETUP
 
 case 68:
 YY_RULE_SETUP
-#line 710 "toke.l"
+#line 713 "toke.l"
 {
                            /* include file/directory */
                            if (!fill(sudoerstext, sudoersleng))
@@ -3896,7 +3899,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 719 "toke.l"
+#line 722 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -3907,7 +3910,7 @@ YY_RULE_SETUP
 
 case 70:
 YY_RULE_SETUP
-#line 727 "toke.l"
+#line 730 "toke.l"
 {
                            LEXTRACE("( ");
                            return '(';
@@ -3915,7 +3918,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 732 "toke.l"
+#line 735 "toke.l"
 {
                            LEXTRACE(") ");
                            return ')';
@@ -3923,7 +3926,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 737 "toke.l"
+#line 740 "toke.l"
 {
                            LEXTRACE(", ");
                            return ',';
@@ -3931,7 +3934,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 742 "toke.l"
+#line 745 "toke.l"
 {
                            LEXTRACE("= ");
                            return '=';
@@ -3939,7 +3942,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 747 "toke.l"
+#line 750 "toke.l"
 {
                            LEXTRACE(": ");
                            return ':';
@@ -3947,7 +3950,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 752 "toke.l"
+#line 755 "toke.l"
 {
                            if (sudoersleng & 1) {
                                LEXTRACE("!");
@@ -3958,7 +3961,7 @@ YY_RULE_SETUP
 case 76:
 /* rule 76 can match eol */
 YY_RULE_SETUP
-#line 759 "toke.l"
+#line 762 "toke.l"
 {
                            if (YY_START == INSTR) {
                                /* re-scan after changing state */
@@ -3977,7 +3980,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 775 "toke.l"
+#line 778 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = true;    /* but remember for fill_args */
                        }
@@ -3985,7 +3988,7 @@ YY_RULE_SETUP
 case 78:
 /* rule 78 can match eol */
 YY_RULE_SETUP
-#line 779 "toke.l"
+#line 782 "toke.l"
 {
                            sawspace = true;    /* remember for fill_args */
                            sudolineno++;
@@ -3995,7 +3998,7 @@ YY_RULE_SETUP
 case 79:
 /* rule 79 can match eol */
 YY_RULE_SETUP
-#line 785 "toke.l"
+#line 788 "toke.l"
 {
                            if (sudoerstext[sudoersleng - 1] == '\n') {
                                /* comment ending in a newline */
@@ -4013,7 +4016,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 800 "toke.l"
+#line 803 "toke.l"
 {
                            LEXTRACE("NOMATCH ");
                            return NOMATCH;
@@ -4028,7 +4031,7 @@ case YY_STATE_EOF(INSTR):
 case YY_STATE_EOF(WANTDIGEST):
 case YY_STATE_EOF(GOTINC):
 case YY_STATE_EOF(EXPECTPATH):
-#line 805 "toke.l"
+#line 808 "toke.l"
 {
                            if (!pop_include())
                                yyterminate();
@@ -4036,10 +4039,10 @@ case YY_STATE_EOF(EXPECTPATH):
        YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 810 "toke.l"
+#line 813 "toke.l"
 ECHO;
        YY_BREAK
-#line 4037 "toke.c"
+#line 4040 "toke.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -5000,7 +5003,7 @@ void sudoersfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 810 "toke.l"
+#line 813 "toke.l"
 
 
 struct path_list {
index 5903dcd..cf5a7d4 100644 (file)
@@ -50,6 +50,9 @@
 # define NAMLEN(dirent)        strlen((dirent)->d_name)
 #endif
 
+// PVS Studio suppression
+// -V::519, 1004, 1037
+
 int sudolineno;                        /* current sudoers line number. */
 char *sudoers;                 /* sudoers file being parsed. */
 struct sudolinebuf sudolinebuf;        /* sudoers line being parsed. */
index 22cad9e..5307666 100644 (file)
@@ -117,7 +117,7 @@ fill_cmnd(const char *src, size_t len)
     *dst = '\0';
 
     /* Check for sudoedit specified as a fully-qualified path. */
-    if ((dst = strrchr(sudoerslval.command.cmnd, '/')) != NULL) {
+    if ((dst = strrchr(sudoerslval.command.cmnd, '/')) != NULL) { // -V575
        if (strcmp(dst, "/sudoedit") == 0) {
            if (sudoers_strict) {
                sudoerserror(
index dcb1c3f..2b6d3cb 100644 (file)
@@ -86,8 +86,12 @@ setpwent(void)
 {
     if (pwf == NULL) {
        pwf = fopen(pwfile, "r");
-       if (pwf != NULL)
-           (void)fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC);
+       if (pwf != NULL) {
+           if (fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC) == -1) {
+               fclose(pwf);
+               pwf = NULL;
+           }
+       }
     } else {
        rewind(pwf);
     }
@@ -164,7 +168,10 @@ getpwnam(const char *name)
     if (pwf == NULL) {
        if ((pwf = fopen(pwfile, "r")) == NULL)
            return NULL;
-       (void)fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC);
+       if (fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC) == -1) {
+           fclose(pwf);
+           return NULL;
+       }
     } else {
        rewind(pwf);
     }
@@ -187,7 +194,10 @@ getpwuid(uid_t uid)
     if (pwf == NULL) {
        if ((pwf = fopen(pwfile, "r")) == NULL)
            return NULL;
-       (void)fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC);
+       if (fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC) == -1) {
+           fclose(pwf);
+           return NULL;
+       }
     } else {
        rewind(pwf);
     }
@@ -215,8 +225,12 @@ setgrent(void)
 {
     if (grf == NULL) {
        grf = fopen(grfile, "r");
-       if (grf != NULL)
-           (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
+       if (grf != NULL) {
+           if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) {
+               fclose(grf);
+               grf = NULL;
+           }
+       }
     } else {
        rewind(grf);
     }
@@ -290,7 +304,10 @@ getgrnam(const char *name)
     if (grf == NULL) {
        if ((grf = fopen(grfile, "r")) == NULL)
            return NULL;
-       (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
+       if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) {
+           fclose(grf);
+           grf = NULL;
+       }
     } else {
        rewind(grf);
     }
@@ -313,7 +330,10 @@ getgrgid(gid_t gid)
     if (grf == NULL) {
        if ((grf = fopen(grfile, "r")) == NULL)
            return NULL;
-       (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC);
+       if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) {
+           fclose(grf);
+           grf = NULL;
+       }
     } else {
        rewind(grf);
     }
@@ -336,8 +356,7 @@ sudo_getgrouplist2_v1(const char *name, GETGROUPS_T basegid,
     GETGROUPS_T **groupsp, int *ngroupsp)
 {
     GETGROUPS_T *groups = *groupsp;
-    int grpsize = *ngroupsp;
-    int i, ngroups = 1;
+    int i, grpsize, ngroups = 1;
     int ret = -1;
     struct group *grp;
 
@@ -352,7 +371,7 @@ sudo_getgrouplist2_v1(const char *name, GETGROUPS_T basegid,
        grpsize <<= 2;
     } else {
        /* Static group vector. */
-       if (grpsize < 1)
+       if ((grpsize = *ngroupsp) < 1)
            return -1;
     }
 
index e09297b..6fd3c83 100644 (file)
@@ -477,7 +477,7 @@ edit_sudoers(struct sudoersfile *sp, char *editor, int editor_argc,
     ac = editor_argc - 3;
     if (lineno > 0) {
        (void)snprintf(linestr, sizeof(linestr), "+%d", lineno);
-       editor_argv[ac++] = linestr;
+       editor_argv[ac++] = linestr; // -V507
     }
     editor_argv[ac++] = "--";
     editor_argv[ac++] = sp->tpath;
index f525189..99159b2 100644 (file)
@@ -72,7 +72,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
index f9db721..d10c065 100644 (file)
Binary files a/po/ko.mo and b/po/ko.mo differ
index 342dbdd..7e2e4f4 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -5,10 +5,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: sudo 1.9.2rc1\n"
+"Project-Id-Version: sudo 1.9.3b1\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-06-24 05:35-0600\n"
-"PO-Revision-Date: 2020-07-17 23:13+0900\n"
+"POT-Creation-Date: 2020-09-12 08:28-0600\n"
+"PO-Revision-Date: 2020-12-11 01:07+0900\n"
 "Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
 "Language-Team: Korean <translation-team-ko@googlegroups.com>\n"
 "Language: ko\n"
@@ -52,17 +52,17 @@ msgstr "레지스트리를 복원할 수 없습니다"
 #: 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:462 src/load_plugins.c:468
-#: src/parse_args.c:176 src/parse_args.c:197 src/parse_args.c:270
-#: src/parse_args.c:593 src/parse_args.c:615 src/parse_args.c:640
+#: 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:485 src/selinux.c:494 src/sesh.c:116
-#: src/sudo.c:624 src/sudo.c:693 src/sudo.c:703 src/sudo.c:724 src/sudo.c:743
-#: src/sudo.c:752 src/sudo.c:761 src/sudo.c:778 src/sudo.c:820 src/sudo.c:830
-#: src/sudo.c:859 src/sudo.c:1045 src/sudo.c:1067 src/sudo.c:1365
-#: src/sudo.c:1538 src/sudo.c:1732 src/sudo.c:2076 src/sudo_edit.c:263
-#: src/sudo_edit.c:770 src/sudo_edit.c:854 src/sudo_edit.c:974
-#: src/sudo_edit.c:994
+#: 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
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
@@ -85,20 +85,20 @@ msgstr "%s: %s"
 #: 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:462 src/load_plugins.c:468
-#: src/parse_args.c:176 src/parse_args.c:198 src/parse_args.c:270
-#: src/parse_args.c:593 src/parse_args.c:615 src/parse_args.c:640
+#: 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:485 src/selinux.c:494 src/sesh.c:116
-#: src/sudo.c:234 src/sudo.c:624 src/sudo.c:859 src/sudo.c:1045
-#: src/sudo.c:1067 src/sudo.c:1365 src/sudo.c:1538 src/sudo.c:1732
-#: src/sudo.c:2076 src/sudo_edit.c:263 src/sudo_edit.c:770 src/sudo_edit.c:854
-#: src/sudo_edit.c:974 src/sudo_edit.c:994
+#: 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
 msgid "unable to allocate memory"
 msgstr "메모리를 할당할 수 없습니다"
 
 #: lib/util/mkdir_parents.c:69 lib/util/sudo_conf.c:614 src/selinux.c:234
-#: src/selinux.c:264 src/sudo.c:367
+#: src/selinux.c:264 src/sudo.c:369
 #, c-format
 msgid "unable to open %s"
 msgstr "%s을(를) 열 수 없습니다"
@@ -175,12 +175,22 @@ msgstr "%s에 모두가 기록할 수 있습니다"
 msgid "%s is group writable"
 msgstr "%s에 그룹 구성원이 기록할 수 있습니다"
 
-#: src/copy_file.c:118
+#: src/copy_file.c:91
+#, c-format
+msgid "%s: truncate %s to zero bytes? (y/n) [n] "
+msgstr "%s: %s 문자열을 0 바이트로 자릅니까? (y/n) [n] "
+
+#: src/copy_file.c:95
+#, c-format
+msgid "not overwriting %s"
+msgstr "%s 덮어쓰지 않음"
+
+#: src/copy_file.c:117
 #, c-format
 msgid "unable to read from %s"
 msgstr "%s을(를) 읽을 수 없습니다"
 
-#: src/copy_file.c:122 src/sudo_edit.c:695
+#: src/copy_file.c:134 src/sudo_edit.c:695
 #, c-format
 msgid "unable to write to %s"
 msgstr "%s에 기록할 수 없습니다"
@@ -261,7 +271,7 @@ msgid "unable to set controlling tty"
 msgstr "처리 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:304
+#: src/exec_pty.c:1486 src/exec_pty.c:1506 src/tgetpass.c:306
 msgid "unable to create pipe"
 msgstr "파이프를 만들 수 없습니다"
 
@@ -271,7 +281,7 @@ msgid "unable to receive message from parent"
 msgstr "상위로부터 메시지를 받을 수 없습니다"
 
 #: src/exec_monitor.c:612 src/exec_nopty.c:387 src/exec_pty.c:1544
-#: src/sudo_edit.c:735 src/tgetpass.c:308
+#: src/sudo_edit.c:735 src/tgetpass.c:310
 msgid "unable to fork"
 msgstr "포킹할 수 없습니다"
 
@@ -279,7 +289,7 @@ msgstr "포킹할 수 없습니다"
 msgid "unable to restore tty label"
 msgstr "tty 레이블을 복원할 수 없습니다"
 
-#: src/exec_monitor.c:632 src/sesh.c:126 src/sudo.c:1123
+#: src/exec_monitor.c:632 src/sesh.c:125 src/sudo.c:1131
 #, c-format
 msgid "unable to execute %s"
 msgstr "%s을(를) 실행할 수 없습니다"
@@ -330,7 +340,7 @@ msgstr "감사 프로세스에 메시지를 보낼 수 없습니다"
 #: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85
 #: src/load_plugins.c:115 src/load_plugins.c: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:353
+#: src/load_plugins.c:354
 #, c-format
 msgid "error in %s, line %d while loading plugin \"%s\""
 msgstr "%s의 %d번째 줄에서 \"%s\" 플러그인을 불러오는 중 오류"
@@ -375,67 +385,67 @@ msgstr "%3$s에 주 버전이(%2$d을(를) 기대했지만) %1$d인 비호환 
 msgid "ignoring policy plugin \"%s\" in %s, line %d"
 msgstr "%2$s의 %3$d번째 줄에서 \"%1$s\" 정책 플러그인 무시"
 
-#: src/load_plugins.c:329
+#: src/load_plugins.c:330
 msgid "only a single policy plugin may be specified"
 msgstr "단일 정책 플러그인을 지정하십시오"
 
-#: src/load_plugins.c:355
+#: src/load_plugins.c:356
 #, c-format
 msgid "unknown plugin type %d found in %s"
 msgstr "%2$s에 알 수 없는 정책 유형 %1$d이(가) 있습니다"
 
-#: src/load_plugins.c:541
+#: src/load_plugins.c:552
 #, c-format
 msgid "policy plugin %s does not include a check_policy method"
 msgstr "%s 정책 플러그인에 check_policy 메서드가 없습니다"
 
-#: src/net_ifs.c:178 src/net_ifs.c:195 src/net_ifs.c:340 src/sudo.c:477
+#: 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 "내부 오류, %s 오버플로우"
 
-#: src/parse_args.c:218
+#: src/parse_args.c:223
 #, c-format
 msgid "invalid environment variable name: %s"
 msgstr "잘못된 환경 변수 이름: %s"
 
-#: src/parse_args.c:319
+#: src/parse_args.c:325
 msgid "the argument to -C must be a number greater than or equal to 3"
 msgstr "-C의 인자 값은 3보다 크거나 같아야 합니다"
 
-#: src/parse_args.c:532
+#: src/parse_args.c:552
 msgid "you may not specify both the -i and -s options"
 msgstr "-i 와 -s 옵션을 함께 지정할 수 없습니다"
 
-#: src/parse_args.c:536
+#: src/parse_args.c:557
 msgid "you may not specify both the -i and -E options"
 msgstr "-i 와 -E 옵션을 함께 지정할 수 없습니다"
 
-#: src/parse_args.c:546
+#: src/parse_args.c:567
 msgid "the -E option is not valid in edit mode"
 msgstr "-E 옵션은 편집 모드에서 유효하지 않습니다"
 
-#: src/parse_args.c:548
+#: src/parse_args.c:570
 msgid "you may not specify environment variables in edit mode"
 msgstr "편집 모드에서 환경 변수를 지정할 수 없습니다"
 
-#: src/parse_args.c:557
+#: src/parse_args.c:580
 msgid "the -U option may only be used with the -l option"
 msgstr "-U 옵션은 -l 옵션만 함께 사용할 수 있습니다"
 
-#: src/parse_args.c:561
+#: src/parse_args.c:584
 msgid "the -A and -S options may not be used together"
 msgstr "-A 와 -S 옵션을 함께 사용할 수 없습니다"
 
-#: src/parse_args.c:654
+#: src/parse_args.c:677
 msgid "sudoedit is not supported on this platform"
 msgstr "이 플랫폼에서 sudoedit를 지원하지 않습니다"
 
-#: src/parse_args.c:735
+#: src/parse_args.c:759
 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:749
+#: src/parse_args.c:773
 #, c-format
 msgid ""
 "%s - edit files as another user\n"
@@ -444,7 +454,7 @@ msgstr ""
 "%s - 다른 사용자 권한으로 파일을 편집합니다\n"
 "\n"
 
-#: src/parse_args.c:751
+#: src/parse_args.c:775
 #, c-format
 msgid ""
 "%s - execute a command as another user\n"
@@ -453,8 +463,7 @@ msgstr ""
 "%s - 다른 사용자 권한으로 명령을 실행합니다\n"
 "\n"
 
-#: src/parse_args.c:756
-#, c-format
+#: src/parse_args.c:780
 msgid ""
 "\n"
 "Options:\n"
@@ -462,123 +471,131 @@ msgstr ""
 "\n"
 "옵션:\n"
 
-#: src/parse_args.c:758
+#: src/parse_args.c:782
 msgid "use a helper program for password prompting"
 msgstr "암호 질문에 보조 프로그램 활용"
 
-#: src/parse_args.c:761
+#: src/parse_args.c:785
 msgid "use specified BSD authentication type"
 msgstr "지정 BSD 인증 형식 활용"
 
-#: src/parse_args.c:764
+#: src/parse_args.c:788
 msgid "run command in the background"
 msgstr "백그라운드에서 명령 실행"
 
-#: src/parse_args.c:766
+#: src/parse_args.c:790
 msgid "ring bell when prompting"
 msgstr "프롬프트를 띄울 때 알림 소리를 냅니다"
 
-#: src/parse_args.c:768
+#: src/parse_args.c:792
 msgid "close all file descriptors >= num"
 msgstr "num 보다 크거나 같은 모든 파일 서술자를 닫습니다"
 
-#: src/parse_args.c:771
+#: src/parse_args.c:795
 msgid "run command with the specified BSD login class"
 msgstr "지정 BSD 로그인 클래스로 명령을 실행합니다"
 
-#: src/parse_args.c:774
+#: src/parse_args.c:798
+msgid "change the working directory before running command"
+msgstr "명령 실행 전 작업 디렉터리를 바꿉니다"
+
+#: src/parse_args.c:800
 msgid "preserve user environment when running command"
 msgstr "명령을 실행할 때 사용자 환경을 유지합니다"
 
-#: src/parse_args.c:776
+#: src/parse_args.c:802
 msgid "preserve specific environment variables"
 msgstr "지정 환경 변수 값을 유지합니다"
 
-#: src/parse_args.c:778
+#: src/parse_args.c:804
 msgid "edit files instead of running a command"
 msgstr "명령을 실행하는 대신 파일을 편집합니다"
 
-#: src/parse_args.c:780
+#: src/parse_args.c:806
 msgid "run command as the specified group name or ID"
 msgstr "지정 그룹 이름 또는 ID로 명령을 실행합니다"
 
-#: src/parse_args.c:782
+#: src/parse_args.c:808
 msgid "set HOME variable to target user's home dir"
 msgstr "대상 사용자의 내 폴더에 HOME 변수를 지정합니다"
 
-#: src/parse_args.c:784
+#: src/parse_args.c:810
 msgid "display help message and exit"
 msgstr "도움말을 보여주고 빠져나갑니다"
 
-#: src/parse_args.c:786
+#: src/parse_args.c:812
 msgid "run command on host (if supported by plugin)"
 msgstr "(플러그인에서 지원한다면)호스트에서 명령을 실행합니다"
 
-#: src/parse_args.c:788
+#: src/parse_args.c:814
 msgid "run login shell as the target user; a command may also be specified"
 msgstr "대상 사용자 자격으로 셸에 로그인하며 명령을 지정할 수 있습니다"
 
-#: src/parse_args.c:790
+#: src/parse_args.c:816
 msgid "remove timestamp file completely"
 msgstr "타임스탬프 파일을 완전히 제거합니다"
 
-#: src/parse_args.c:792
+#: src/parse_args.c:818
 msgid "invalidate timestamp file"
 msgstr "타임스탬프 파일을 초기화합니다"
 
-#: src/parse_args.c:794
+#: src/parse_args.c:820
 msgid "list user's privileges or check a specific command; use twice for longer format"
 msgstr "사용자 권한을 보여주거나 지정 명령을 확인합니다. 긴 형식으로 보려면 옵션을 두 번 사용하십시오"
 
-#: src/parse_args.c:796
+#: src/parse_args.c:822
 msgid "non-interactive mode, no prompts are used"
 msgstr "비대화형 모드. 프롬프트를 사용하지 않습니다"
 
-#: src/parse_args.c:798
+#: src/parse_args.c:824
 msgid "preserve group vector instead of setting to target's"
 msgstr "대상을 설정하는 대신 그룹 벡터를 유지합니다"
 
-#: src/parse_args.c:800
+#: src/parse_args.c:826
 msgid "use the specified password prompt"
 msgstr "지정 암호 프롬프트를 활용합니다"
 
-#: src/parse_args.c:803
+#: src/parse_args.c:828
+msgid "change the root directory before running command"
+msgstr "명령 실행 전 루트 디렉터리를 바꿉니다"
+
+#: src/parse_args.c:831
 msgid "create SELinux security context with specified role"
 msgstr "지정 역할을 지닌 SELinux 보안 컨텍스트를 만듭니다"
 
-#: src/parse_args.c:806
+#: src/parse_args.c:834
 msgid "read password from standard input"
 msgstr "표준 입력으로 암호를 입력 받습니다"
 
-#: src/parse_args.c:808
+#: src/parse_args.c:836
 msgid "run shell as the target user; a command may also be specified"
 msgstr "셸을 대상 사용자 명의로 실행하며 명령을 지정할 수 있습니다"
 
-#: src/parse_args.c:811
+#: src/parse_args.c:839
 msgid "create SELinux security context with specified type"
 msgstr "지정 유형의 SELinux 보안 컨텍스트를 만듭니다"
 
-#: src/parse_args.c:814
+#: src/parse_args.c:842
 msgid "terminate command after the specified time limit"
 msgstr "지정 제한 시간 이후로 명령 실행을 멈춥니다"
 
-#: src/parse_args.c:816
+#: src/parse_args.c:844
 msgid "in list mode, display privileges for user"
 msgstr "목록 모드에서 사용자 권한을 보여줍니다"
 
-#: src/parse_args.c:818
+#: src/parse_args.c:846
 msgid "run command (or edit file) as specified user name or ID"
 msgstr "지정한 사용자 이름 또는 ID로 명령을 실행(또는 파일 편집)"
 
-#: src/parse_args.c:820
+#: src/parse_args.c:848
 msgid "display version information and exit"
 msgstr "버전 정보를 보여주고 나갑니다"
 
-#: src/parse_args.c:822
+#: src/parse_args.c:850
 msgid "update user's timestamp without running a command"
 msgstr "명령을 실행하지 않고 사용자 타임스탬프를 업데이트합니다"
 
-#: src/parse_args.c:824
+#: src/parse_args.c:852
 msgid "stop processing command line arguments"
 msgstr "명령행 인자 처리를 멈춥니다"
 
@@ -683,16 +700,16 @@ msgstr "exec 컨텍스트를 %s(으)로 설정할 수 없습니다"
 msgid "unable to set key creation context to %s"
 msgstr "키 생성 컨텍스트를 %s(으)로 설정할 수 없습니다"
 
-#: src/sesh.c:78
+#: src/sesh.c:77
 msgid "requires at least one argument"
 msgstr "최소한 하나의 인자가 필요합니다"
 
-#: src/sesh.c:107
+#: src/sesh.c:106
 #, c-format
 msgid "invalid file descriptor number: %s"
 msgstr "잘못된 파일 서술자 번호: %s"
 
-#: src/sesh.c:121
+#: src/sesh.c:120
 #, c-format
 msgid "unable to run %s as a login shell"
 msgstr "%s(을)를 로그인 쉘로 실행할 수 없습니다"
@@ -745,124 +762,124 @@ msgstr "\"%s\" 프로젝트에서 setproject에 실패했습니다"
 msgid "warning, resource control assignment failed for project \"%s\""
 msgstr "경고! \"%s\" 프로젝트에 자원 처리 할당에 실패했습니다"
 
-#: src/sudo.c:219
+#: src/sudo.c:220
 #, c-format
 msgid "Sudo version %s\n"
 msgstr "sudo 버전 %s\n"
 
-#: src/sudo.c:221
+#: src/sudo.c:222
 #, c-format
 msgid "Configure options: %s\n"
 msgstr "설정 옵션: %s\n"
 
-#: src/sudo.c:230
+#: src/sudo.c:231
 msgid "fatal error, unable to load plugins"
 msgstr "치명적인 오류. 플러그인을 불러올 수 없습니다"
 
-#: src/sudo.c:275
+#: src/sudo.c:277
 msgid "plugin did not return a command to execute"
 msgstr "플러그인에서 실행할 명령을 반환하지 않았습니다"
 
-#: src/sudo.c:310
+#: src/sudo.c:312
 #, c-format
 msgid "unexpected sudo mode 0x%x"
 msgstr "예상치 못한 sudo 모드 0x%x"
 
-#: src/sudo.c:543
+#: src/sudo.c:546
 #, c-format
 msgid "you do not exist in the %s database"
 msgstr "%s 데이터베이스에 없는 사용자입니다"
 
-#: src/sudo.c:600
+#: src/sudo.c:603
 msgid "unable to determine tty"
 msgstr "tty를 지정할 수 없습니다"
 
-#: src/sudo.c:905
+#: src/sudo.c:913
 #, c-format
 msgid "%s must be owned by uid %d and have the setuid bit set"
 msgstr "%s은(는) %d uid를 소유해야 하며 setuid 비트를 설정해야 합니다"
 
-#: src/sudo.c:908
+#: src/sudo.c:916
 #, 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:914
+#: src/sudo.c:922
 #, c-format
 msgid "effective uid is not %d, is sudo installed setuid root?"
 msgstr "%d은(는) 유효한 uid가 아닙니다. sudo에 setuid root를 설치했습니까?"
 
-#: src/sudo.c:930
+#: src/sudo.c:938
 msgid "unable to set supplementary group IDs"
 msgstr "추가 그룹 ID를 설정할 수 없습니다"
 
-#: src/sudo.c:937
+#: src/sudo.c:945
 #, c-format
 msgid "unable to set effective gid to runas gid %u"
 msgstr "유효한 gid를 %u 실행 gid로 설정할 수 없습니다"
 
-#: src/sudo.c:943
+#: src/sudo.c:951
 #, c-format
 msgid "unable to set gid to runas gid %u"
 msgstr "gid를 실행 gid %u(으)로 설정할 수 없습니다"
 
-#: src/sudo.c:986
+#: src/sudo.c:994
 #, c-format
 msgid "unexpected child termination condition: %d"
 msgstr "예상치 못한 하위 프로세스 중단 상태: %d"
 
-#: src/sudo.c:1095
+#: src/sudo.c:1103
 msgid "unable to initialize policy plugin"
 msgstr "정책 플러그인을 초기화할 수 없습니다"
 
-#: src/sudo.c:1158
+#: src/sudo.c:1166
 #, c-format
 msgid "policy plugin %s is missing the \"check_policy\" method"
 msgstr "%s 정책 플러그인에 \"check_policy\" 메서드가 빠졌습니다"
 
-#: src/sudo.c:1173 src/sudo.c:1226 src/sudo.c:1270
+#: src/sudo.c:1181 src/sudo.c:1234 src/sudo.c:1278
 msgid "command rejected by policy"
 msgstr "정책을 통해 명령을 거부 했습니다"
 
-#: src/sudo.c:1178 src/sudo.c:1231 src/sudo.c:1275
+#: src/sudo.c:1186 src/sudo.c:1239 src/sudo.c:1283
 msgid "policy plugin error"
 msgstr "정책 플러그인 오류"
 
-#: src/sudo.c:1212
+#: src/sudo.c:1220
 #, c-format
 msgid "policy plugin %s does not support listing privileges"
 msgstr "%s 정책 플러그인에서 권한 조회를 지원하지 않습니다"
 
-#: src/sudo.c:1256
+#: src/sudo.c:1264
 #, c-format
 msgid "policy plugin %s does not support the -v option"
 msgstr "%s 정책 플러그인에서 -v 옵션을 지원하지 않습니다"
 
-#: src/sudo.c:1294
+#: src/sudo.c:1302
 #, c-format
 msgid "policy plugin %s does not support the -k/-K options"
 msgstr "%s 정책 플러그인에서 -k/-K 옵션을 지원하지 않습니다"
 
-#: src/sudo.c:1423
+#: src/sudo.c:1431
 #, c-format
 msgid "error initializing I/O plugin %s"
 msgstr "%s 입출력 플러그인 초기화 오류"
 
-#: src/sudo.c:1577
+#: src/sudo.c:1585
 #, c-format
 msgid "error initializing audit plugin %s"
 msgstr "%s 감사 플러그인 초기화 오류"
 
-#: src/sudo.c:1755
+#: src/sudo.c:1763
 #, c-format
 msgid "error initializing approval plugin %s"
 msgstr "%s 승인 플러그인 초기화 오류"
 
-#: src/sudo.c:1831
+#: src/sudo.c:1839
 msgid "command rejected by approver"
 msgstr "승인자가 명령을 거부했습니다"
 
-#: src/sudo.c:1840
+#: src/sudo.c:1848
 msgid "approval plugin error"
 msgstr "승인 플러그인 오류"
 
@@ -899,7 +916,7 @@ msgstr "%s 수정하지 않은 상태로 남음"
 msgid "%s unchanged"
 msgstr "%s 바꾸지 않음"
 
-#: src/sudo_edit.c:706 src/sudo_edit.c:907
+#: src/sudo_edit.c:706 src/sudo_edit.c:909
 #, c-format
 msgid "contents of edit session left in %s"
 msgstr "%s에 편집 세션 내용 남음"
@@ -912,33 +929,33 @@ msgstr "sesh: 내부 오류: 경로에 잘못된 파일"
 msgid "sesh: unable to create temporary files"
 msgstr "sesh: 임시 파일을 만들 수 없습니다"
 
-#: src/sudo_edit.c:818 src/sudo_edit.c:900
+#: src/sudo_edit.c:818 src/sudo_edit.c:902
 msgid "sesh: killed by a signal"
 msgstr "sesh: 시그널을 받아 죽음"
 
-#: src/sudo_edit.c:820 src/sudo_edit.c:903
+#: src/sudo_edit.c:820 src/sudo_edit.c:905
 #, c-format
 msgid "sesh: unknown error %d"
 msgstr "sesh: 잘못된 오류 %d"
 
-#: src/sudo_edit.c:894
+#: src/sudo_edit.c:895
 msgid "unable to copy temporary files back to their original location"
 msgstr "원위치에 임시 파일을 복사할 수 없습니다"
 
-#: src/sudo_edit.c:897
+#: src/sudo_edit.c:899
 msgid "unable to copy some of the temporary files back to their original location"
 msgstr "원 위치에 임시 파일 일부를 복사할 수 없습니다"
 
-#: src/sudo_edit.c:941
+#: src/sudo_edit.c:943
 #, c-format
 msgid "unable to change uid to root (%u)"
 msgstr "uid를 루트로 바꿀 수 없습니다(%u)"
 
-#: src/sudo_edit.c:958
+#: src/sudo_edit.c:960
 msgid "plugin error: missing file list for sudoedit"
 msgstr "플러그인 오류: sudoedit에 파일 목록이 빠짐"
 
-#: src/sudo_edit.c:1009 src/sudo_edit.c:1022
+#: src/sudo_edit.c:1011 src/sudo_edit.c:1024
 msgid "unable to read the clock"
 msgstr "클록을 읽을 수 없습니다"
 
@@ -954,25 +971,25 @@ msgstr "암호를 입력하지 않았습니다"
 msgid "unable to read password"
 msgstr "암호를 읽을 수 없습니다"
 
-#: src/tgetpass.c:140
+#: src/tgetpass.c:141
 msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper"
 msgstr "암호를 읽으려면 터미널이 필요합니다. -S 옵션을 사용하여 표준 입력으로 암호를 받거나 askpass 도우미를 설정하십시오"
 
-#: src/tgetpass.c:150
+#: src/tgetpass.c:152
 msgid "no askpass program specified, try setting SUDO_ASKPASS"
 msgstr "askpass 프로그램을 지정하지 않았습니다. SUDO_ASKPASS를 설정해보십시오"
 
-#: src/tgetpass.c:325
+#: src/tgetpass.c:327
 #, c-format
 msgid "unable to set gid to %u"
 msgstr "gid를 %u(으)로 설정할 수 없습니다"
 
-#: src/tgetpass.c:329
+#: src/tgetpass.c:331
 #, c-format
 msgid "unable to set uid to %u"
 msgstr "uid를 %u(으)로 설정할 수 없습니다"
 
-#: src/tgetpass.c:334
+#: src/tgetpass.c:336
 #, c-format
 msgid "unable to run %s"
 msgstr "%s을(를) 실행할 수 없습니다"
index 5ce35e0..5549041 100644 (file)
Binary files a/po/sr.mo and b/po/sr.mo differ
index ae06deb..4f305b8 100644 (file)
--- a/po/sr.po
+++ b/po/sr.po
@@ -3,10 +3,10 @@
 # Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011—2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: sudo-1.9.2rc1\n"
+"Project-Id-Version: sudo-1.9.3b1\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-06-24 05:35-0600\n"
-"PO-Revision-Date: 2020-08-04 11:50+0200\n"
+"POT-Creation-Date: 2020-09-12 08:28-0600\n"
+"PO-Revision-Date: 2020-12-11 07:41+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <(nothing)>\n"
 "Language: sr\n"
@@ -14,7 +14,6 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Virtaal 0.7.1\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
 #: lib/util/aix.c:89 lib/util/aix.c:169
@@ -50,17 +49,17 @@ msgstr "не могу да повратим регистар"
 #: 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:462 src/load_plugins.c:468
-#: src/parse_args.c:176 src/parse_args.c:197 src/parse_args.c:270
-#: src/parse_args.c:593 src/parse_args.c:615 src/parse_args.c:640
+#: 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:485 src/selinux.c:494 src/sesh.c:116
-#: src/sudo.c:624 src/sudo.c:693 src/sudo.c:703 src/sudo.c:724 src/sudo.c:743
-#: src/sudo.c:752 src/sudo.c:761 src/sudo.c:778 src/sudo.c:820 src/sudo.c:830
-#: src/sudo.c:859 src/sudo.c:1045 src/sudo.c:1067 src/sudo.c:1365
-#: src/sudo.c:1538 src/sudo.c:1732 src/sudo.c:2076 src/sudo_edit.c:263
-#: src/sudo_edit.c:770 src/sudo_edit.c:854 src/sudo_edit.c:974
-#: src/sudo_edit.c:994
+#: 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
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
@@ -83,20 +82,20 @@ msgstr "%s: %s"
 #: 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:462 src/load_plugins.c:468
-#: src/parse_args.c:176 src/parse_args.c:198 src/parse_args.c:270
-#: src/parse_args.c:593 src/parse_args.c:615 src/parse_args.c:640
+#: 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:485 src/selinux.c:494 src/sesh.c:116
-#: src/sudo.c:234 src/sudo.c:624 src/sudo.c:859 src/sudo.c:1045
-#: src/sudo.c:1067 src/sudo.c:1365 src/sudo.c:1538 src/sudo.c:1732
-#: src/sudo.c:2076 src/sudo_edit.c:263 src/sudo_edit.c:770 src/sudo_edit.c:854
-#: src/sudo_edit.c:974 src/sudo_edit.c:994
+#: 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
 msgid "unable to allocate memory"
 msgstr "не могу да доделим меморију"
 
 #: lib/util/mkdir_parents.c:69 lib/util/sudo_conf.c:614 src/selinux.c:234
-#: src/selinux.c:264 src/sudo.c:367
+#: src/selinux.c:264 src/sudo.c:369
 #, c-format
 msgid "unable to open %s"
 msgstr "не могу да отворим %s"
@@ -173,12 +172,22 @@ msgstr "%s је светски уписив"
 msgid "%s is group writable"
 msgstr "%s је групно уписив"
 
-#: src/copy_file.c:118
+#: src/copy_file.c:91
+#, c-format
+msgid "%s: truncate %s to zero bytes? (y/n) [n] "
+msgstr "%s: да скратим „%s“ на нула бајта? (y/n) [n] "
+
+#: src/copy_file.c:95
+#, c-format
+msgid "not overwriting %s"
+msgstr "не преписујем „%s“"
+
+#: src/copy_file.c:117
 #, c-format
 msgid "unable to read from %s"
 msgstr "не могу да читам из „%s“"
 
-#: src/copy_file.c:122 src/sudo_edit.c:695
+#: src/copy_file.c:134 src/sudo_edit.c:695
 #, c-format
 msgid "unable to write to %s"
 msgstr "не могу да упишем у %s"
@@ -259,7 +268,7 @@ msgid "unable to set controlling tty"
 msgstr "не могу да подесим контролисање 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:304
+#: src/exec_pty.c:1486 src/exec_pty.c:1506 src/tgetpass.c:306
 msgid "unable to create pipe"
 msgstr "не могу да направим спојку"
 
@@ -268,7 +277,7 @@ msgid "unable to receive message from parent"
 msgstr "не могу да примим поруку од родитеља"
 
 #: src/exec_monitor.c:612 src/exec_nopty.c:387 src/exec_pty.c:1544
-#: src/sudo_edit.c:735 src/tgetpass.c:308
+#: src/sudo_edit.c:735 src/tgetpass.c:310
 msgid "unable to fork"
 msgstr "не могу да поделим"
 
@@ -276,7 +285,7 @@ msgstr "не могу да поделим"
 msgid "unable to restore tty label"
 msgstr "не могу да повратим tty натпис"
 
-#: src/exec_monitor.c:632 src/sesh.c:126 src/sudo.c:1123
+#: src/exec_monitor.c:632 src/sesh.c:125 src/sudo.c:1131
 #, c-format
 msgid "unable to execute %s"
 msgstr "не могу да извршим %s"
@@ -327,7 +336,7 @@ msgstr "не могу да пошаљем поруку процесу праће
 #: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85
 #: src/load_plugins.c:115 src/load_plugins.c: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:353
+#: src/load_plugins.c:354
 #, c-format
 msgid "error in %s, line %d while loading plugin \"%s\""
 msgstr "грешка у „%s“, %d. ред приликом учитавања прикључка „%s“"
@@ -372,67 +381,67 @@ msgstr "пронађено је несагласно главно издање 
 msgid "ignoring policy plugin \"%s\" in %s, line %d"
 msgstr "занемарујем прикључак сигурности „%s“ у %s, %d. ред"
 
-#: src/load_plugins.c:329
+#: src/load_plugins.c:330
 msgid "only a single policy plugin may be specified"
 msgstr "може бити наведен само један прикључак сигурности"
 
-#: src/load_plugins.c:355
+#: src/load_plugins.c:356
 #, c-format
 msgid "unknown plugin type %d found in %s"
 msgstr "нађох непознату врсту прикључка %d у „%s“"
 
-#: src/load_plugins.c:541
+#: src/load_plugins.c:552
 #, c-format
 msgid "policy plugin %s does not include a check_policy method"
 msgstr "прикључак сигурности %s не садржи метод провере_сигурности"
 
-#: src/net_ifs.c:178 src/net_ifs.c:195 src/net_ifs.c:340 src/sudo.c:477
+#: 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 "унутрашња грешка, прекорачење функције „%s“"
 
-#: src/parse_args.c:218
+#: src/parse_args.c:223
 #, c-format
 msgid "invalid environment variable name: %s"
 msgstr "неисправан назив променљиве окружења: %s"
 
-#: src/parse_args.c:319
+#: src/parse_args.c:325
 msgid "the argument to -C must be a number greater than or equal to 3"
 msgstr "аргумент уз -C мора бити број већи или једнак 3"
 
-#: src/parse_args.c:532
+#: src/parse_args.c:552
 msgid "you may not specify both the -i and -s options"
 msgstr "не можете да наведете обе опције „-i“ и „-s“"
 
-#: src/parse_args.c:536
+#: src/parse_args.c:557
 msgid "you may not specify both the -i and -E options"
 msgstr "не можете да наведете обе опције „-i“ и „-E“"
 
-#: src/parse_args.c:546
+#: src/parse_args.c:567
 msgid "the -E option is not valid in edit mode"
 msgstr "опција „-E“ није исправна у режиму уређивања"
 
-#: src/parse_args.c:548
+#: src/parse_args.c:570
 msgid "you may not specify environment variables in edit mode"
 msgstr "не можете да одредите променљиве окружења у режиму уређивања"
 
-#: src/parse_args.c:557
+#: src/parse_args.c:580
 msgid "the -U option may only be used with the -l option"
 msgstr "опција „-U“ може бити коришћена само са опцијом „-l“"
 
-#: src/parse_args.c:561
+#: src/parse_args.c:584
 msgid "the -A and -S options may not be used together"
 msgstr "опције „-A“ и „-S“ не могу бити коришћене заједно"
 
-#: src/parse_args.c:654
+#: src/parse_args.c:677
 msgid "sudoedit is not supported on this platform"
 msgstr "„sudoedit“ није подржано на овој платформи"
 
-#: src/parse_args.c:735
+#: src/parse_args.c:759
 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:749
+#: src/parse_args.c:773
 #, c-format
 msgid ""
 "%s - edit files as another user\n"
@@ -441,7 +450,7 @@ msgstr ""
 "%s — уредите датотеке као други корисник\n"
 "\n"
 
-#: src/parse_args.c:751
+#: src/parse_args.c:775
 #, c-format
 msgid ""
 "%s - execute a command as another user\n"
@@ -450,8 +459,7 @@ msgstr ""
 "%s — извршите наредбу као други корисник\n"
 "\n"
 
-#: src/parse_args.c:756
-#, c-format
+#: src/parse_args.c:780
 msgid ""
 "\n"
 "Options:\n"
@@ -459,123 +467,131 @@ msgstr ""
 "\n"
 "Опције:\n"
 
-#: src/parse_args.c:758
+#: src/parse_args.c:782
 msgid "use a helper program for password prompting"
 msgstr "користи програм испомоћи за упит лозинке"
 
-#: src/parse_args.c:761
+#: src/parse_args.c:785
 msgid "use specified BSD authentication type"
 msgstr "користи наведену врсту БСД потврде идентитета"
 
-#: src/parse_args.c:764
+#: src/parse_args.c:788
 msgid "run command in the background"
 msgstr "покреће наредбу у позадини"
 
-#: src/parse_args.c:766
+#: src/parse_args.c:790
 msgid "ring bell when prompting"
 msgstr "звони приликом постављања упита"
 
-#: src/parse_args.c:768
+#: src/parse_args.c:792
 msgid "close all file descriptors >= num"
 msgstr "затвара све описнике датотеке >= fd"
 
-#: src/parse_args.c:771
+#: src/parse_args.c:795
 msgid "run command with the specified BSD login class"
 msgstr "покреће наредбу са наведеним разредом БСД пријаве"
 
-#: src/parse_args.c:774
+#: src/parse_args.c:798
+msgid "change the working directory before running command"
+msgstr "мења радни директоријум пре покретања наредбе"
+
+#: src/parse_args.c:800
 msgid "preserve user environment when running command"
 msgstr "чува корисничко окружење приликом покретања наредбе"
 
-#: src/parse_args.c:776
+#: src/parse_args.c:802
 msgid "preserve specific environment variables"
 msgstr "чува нарочите променљиве окружења"
 
-#: src/parse_args.c:778
+#: src/parse_args.c:804
 msgid "edit files instead of running a command"
 msgstr "уређује датотеке уместо да изврши наредбу"
 
-#: src/parse_args.c:780
+#: src/parse_args.c:806
 msgid "run command as the specified group name or ID"
 msgstr "извршава наредбу као наведени назив групе или ИБ"
 
-#: src/parse_args.c:782
+#: src/parse_args.c:808
 msgid "set HOME variable to target user's home dir"
 msgstr "подешава променљиву ЛИЧНО у циљну корисничку личну фасциклу"
 
-#: src/parse_args.c:784
+#: src/parse_args.c:810
 msgid "display help message and exit"
 msgstr "приказује поруку помоћи и излази"
 
-#: src/parse_args.c:786
+#: src/parse_args.c:812
 msgid "run command on host (if supported by plugin)"
 msgstr "покреће наредбу на домаћину (ако је подржано прикључком)"
 
-#: src/parse_args.c:788
+#: src/parse_args.c:814
 msgid "run login shell as the target user; a command may also be specified"
 msgstr "покреће љуску пријаве као крајњи корисник; наредба може такође бити наведена"
 
-#: src/parse_args.c:790
+#: src/parse_args.c:816
 msgid "remove timestamp file completely"
 msgstr "потпуно уклања датотеку записа датума и времена"
 
-#: src/parse_args.c:792
+#: src/parse_args.c:818
 msgid "invalidate timestamp file"
 msgstr "чини неисправном датотеку датума и времена"
 
-#: src/parse_args.c:794
+#: src/parse_args.c:820
 msgid "list user's privileges or check a specific command; use twice for longer format"
 msgstr "исписује привилегије корисника или проверава посебну наредбу; користи се двапута за дуже записе"
 
-#: src/parse_args.c:796
+#: src/parse_args.c:822
 msgid "non-interactive mode, no prompts are used"
 msgstr "немеђудејствени режим, не користи упите"
 
-#: src/parse_args.c:798
+#: src/parse_args.c:824
 msgid "preserve group vector instead of setting to target's"
 msgstr "чува вектор групе уместо да подеси на циљеве"
 
-#: src/parse_args.c:800
+#: src/parse_args.c:826
 msgid "use the specified password prompt"
 msgstr "користи упит наведене лозинке"
 
-#: src/parse_args.c:803
+#: src/parse_args.c:828
+msgid "change the root directory before running command"
+msgstr "мења корени директоријум пре покретања наредбе"
+
+#: src/parse_args.c:831
 msgid "create SELinux security context with specified role"
 msgstr "ствара СЕЛинукс сигурносни контекст са наведеном улогом"
 
-#: src/parse_args.c:806
+#: src/parse_args.c:834
 msgid "read password from standard input"
 msgstr "чита лозинку са стандардног улаза"
 
-#: src/parse_args.c:808
+#: src/parse_args.c:836
 msgid "run shell as the target user; a command may also be specified"
 msgstr "покреће љуску као крајњи корисник; наредба такође може бити наведена"
 
-#: src/parse_args.c:811
+#: src/parse_args.c:839
 msgid "create SELinux security context with specified type"
 msgstr "ствара СЕЛинукс сигурносни контекст са наведеном улогом"
 
-#: src/parse_args.c:814
+#: src/parse_args.c:842
 msgid "terminate command after the specified time limit"
 msgstr "окончава наредбу након наведеног временског ограничења"
 
-#: src/parse_args.c:816
+#: src/parse_args.c:844
 msgid "in list mode, display privileges for user"
 msgstr "у режиму списка, приказује привилегије за корисника"
 
-#: src/parse_args.c:818
+#: src/parse_args.c:846
 msgid "run command (or edit file) as specified user name or ID"
 msgstr "покреће наредбу (или уређује датотеку) као наведени корисник"
 
-#: src/parse_args.c:820
+#: src/parse_args.c:848
 msgid "display version information and exit"
 msgstr "приказује податке о издању и излази"
 
-#: src/parse_args.c:822
+#: src/parse_args.c:850
 msgid "update user's timestamp without running a command"
 msgstr "освежава кориснички запис датума и времена без покретања наредбе"
 
-#: src/parse_args.c:824
+#: src/parse_args.c:852
 msgid "stop processing command line arguments"
 msgstr "зауставља обрађивање аргумената линије наредби"
 
@@ -680,16 +696,16 @@ msgstr "не могу да подесим извршни контекст за %
 msgid "unable to set key creation context to %s"
 msgstr "не могу да подесим контекст стварања кључа за %s"
 
-#: src/sesh.c:78
+#: src/sesh.c:77
 msgid "requires at least one argument"
 msgstr "захтева барем један аргумент"
 
-#: src/sesh.c:107
+#: src/sesh.c:106
 #, c-format
 msgid "invalid file descriptor number: %s"
 msgstr "неисправан број описника датотеке: %s"
 
-#: src/sesh.c:121
+#: src/sesh.c:120
 #, c-format
 msgid "unable to run %s as a login shell"
 msgstr "не могу да покренем „%s“ као шкољку пријављивања"
@@ -742,124 +758,124 @@ msgstr "подешавање пројекта није успело за про
 msgid "warning, resource control assignment failed for project \"%s\""
 msgstr "упозорење, није успело додељивање контроле ресурса за пројекат „%s“"
 
-#: src/sudo.c:219
+#: src/sudo.c:220
 #, c-format
 msgid "Sudo version %s\n"
 msgstr "Судо издање %s\n"
 
-#: src/sudo.c:221
+#: src/sudo.c:222
 #, c-format
 msgid "Configure options: %s\n"
 msgstr "Опције подешавања: %s\n"
 
-#: src/sudo.c:230
+#: src/sudo.c:231
 msgid "fatal error, unable to load plugins"
 msgstr "кобна грешка, не могу да учитам прикључке"
 
-#: src/sudo.c:275
+#: src/sudo.c:277
 msgid "plugin did not return a command to execute"
 msgstr "прикључак није вратио наредбу за извршавање"
 
-#: src/sudo.c:310
+#: src/sudo.c:312
 #, c-format
 msgid "unexpected sudo mode 0x%x"
 msgstr "неочекивани судо режим 0x%x"
 
-#: src/sudo.c:543
+#: src/sudo.c:546
 #, c-format
 msgid "you do not exist in the %s database"
 msgstr "не постојите у „%s“ бази података"
 
-#: src/sudo.c:600
+#: src/sudo.c:603
 msgid "unable to determine tty"
 msgstr "не могу да одредим конзолу"
 
-#: src/sudo.c:905
+#: src/sudo.c:913
 #, c-format
 msgid "%s must be owned by uid %d and have the setuid bit set"
 msgstr "%s мора бити власништвo уида %d и треба да има подешен бит „setuid“"
 
-#: src/sudo.c:908
+#: src/sudo.c:916
 #, 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:914
+#: src/sudo.c:922
 #, c-format
 msgid "effective uid is not %d, is sudo installed setuid root?"
 msgstr "стварни уид није %d, већ сетуид администратор инсталиран судоом?"
 
-#: src/sudo.c:930
+#: src/sudo.c:938
 msgid "unable to set supplementary group IDs"
 msgstr "не могу да подесим додатне ИБ-ове групе"
 
-#: src/sudo.c:937
+#: src/sudo.c:945
 #, c-format
 msgid "unable to set effective gid to runas gid %u"
 msgstr "не могу да подесим ефективан гид да се покрене_као гид %u"
 
-#: src/sudo.c:943
+#: src/sudo.c:951
 #, c-format
 msgid "unable to set gid to runas gid %u"
 msgstr "не могу да подесим гид да се покрене као гид %u"
 
-#: src/sudo.c:986
+#: src/sudo.c:994
 #, c-format
 msgid "unexpected child termination condition: %d"
 msgstr "неочекивани услов завршетка потпроцеса: %d"
 
-#: src/sudo.c:1095
+#: src/sudo.c:1103
 msgid "unable to initialize policy plugin"
 msgstr "не могу да започнем прикључак сигурности"
 
-#: src/sudo.c:1158
+#: src/sudo.c:1166
 #, c-format
 msgid "policy plugin %s is missing the \"check_policy\" method"
 msgstr "прикључак сигурности %s не садржи метод „check_policy“"
 
-#: src/sudo.c:1173 src/sudo.c:1226 src/sudo.c:1270
+#: src/sudo.c:1181 src/sudo.c:1234 src/sudo.c:1278
 msgid "command rejected by policy"
 msgstr "наредба је одбачена политиком"
 
-#: src/sudo.c:1178 src/sudo.c:1231 src/sudo.c:1275
+#: src/sudo.c:1186 src/sudo.c:1239 src/sudo.c:1283
 msgid "policy plugin error"
 msgstr "грешка прикључка политике"
 
-#: src/sudo.c:1212
+#: src/sudo.c:1220
 #, c-format
 msgid "policy plugin %s does not support listing privileges"
 msgstr "прикључак сигурности %s не подржава привилегије исписивања"
 
-#: src/sudo.c:1256
+#: src/sudo.c:1264
 #, c-format
 msgid "policy plugin %s does not support the -v option"
 msgstr "прикључак сигурности %s не подржава опцију -v"
 
-#: src/sudo.c:1294
+#: src/sudo.c:1302
 #, c-format
 msgid "policy plugin %s does not support the -k/-K options"
 msgstr "прикључак сигурности %s не подржава опције -k/-K"
 
-#: src/sudo.c:1423
+#: src/sudo.c:1431
 #, c-format
 msgid "error initializing I/O plugin %s"
 msgstr "грешка приликом покретања У/И прикључка %s"
 
-#: src/sudo.c:1577
+#: src/sudo.c:1585
 #, c-format
 msgid "error initializing audit plugin %s"
 msgstr "грешка покретања аудит прикључка „%s“"
 
-#: src/sudo.c:1755
+#: src/sudo.c:1763
 #, c-format
 msgid "error initializing approval plugin %s"
 msgstr "грешка покретања прикључка одобравања „%s“"
 
-#: src/sudo.c:1831
+#: src/sudo.c:1839
 msgid "command rejected by approver"
 msgstr "наредбу је одбацио одобравач"
 
-#: src/sudo.c:1840
+#: src/sudo.c:1848
 msgid "approval plugin error"
 msgstr "грешка прикључка одобравања"
 
@@ -896,7 +912,7 @@ msgstr "%s је остао неизмењен"
 msgid "%s unchanged"
 msgstr "%s је непромењен"
 
-#: src/sudo_edit.c:706 src/sudo_edit.c:907
+#: src/sudo_edit.c:706 src/sudo_edit.c:909
 #, c-format
 msgid "contents of edit session left in %s"
 msgstr "садржај сесије уређивања је остао у %s"
@@ -909,33 +925,33 @@ msgstr "sesh: унутрашња грешка: непарн број путањ
 msgid "sesh: unable to create temporary files"
 msgstr "sesh: не могу да направим привремене датотеке"
 
-#: src/sudo_edit.c:818 src/sudo_edit.c:900
+#: src/sudo_edit.c:818 src/sudo_edit.c:902
 msgid "sesh: killed by a signal"
 msgstr "sesh: убијено сигналом"
 
-#: src/sudo_edit.c:820 src/sudo_edit.c:903
+#: src/sudo_edit.c:820 src/sudo_edit.c:905
 #, c-format
 msgid "sesh: unknown error %d"
 msgstr "sesh: непозната грешка „%d“"
 
-#: src/sudo_edit.c:894
+#: src/sudo_edit.c:895
 msgid "unable to copy temporary files back to their original location"
 msgstr "не могу да умножим привремене датотеке назад на њихова првобитна места"
 
-#: src/sudo_edit.c:897
+#: src/sudo_edit.c:899
 msgid "unable to copy some of the temporary files back to their original location"
 msgstr "не могу да умножим неке од привремених датотека назад на њихова првобитна места"
 
-#: src/sudo_edit.c:941
+#: src/sudo_edit.c:943
 #, c-format
 msgid "unable to change uid to root (%u)"
 msgstr "не могу да променим уид у администратора (%u)"
 
-#: src/sudo_edit.c:958
+#: src/sudo_edit.c:960
 msgid "plugin error: missing file list for sudoedit"
 msgstr "грешка прикључка: недостаје датотеа списка за уређивање судоа"
 
-#: src/sudo_edit.c:1009 src/sudo_edit.c:1022
+#: src/sudo_edit.c:1011 src/sudo_edit.c:1024
 msgid "unable to read the clock"
 msgstr "не могу да прочитам сат"
 
@@ -951,25 +967,25 @@ msgstr "лозинка није достављена"
 msgid "unable to read password"
 msgstr "не могу да прочитам лозинку"
 
-#: src/tgetpass.c:140
+#: src/tgetpass.c:141
 msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper"
 msgstr "терминал је потребан за читање лозинке; или користите опцију „-S“ да читате из стандардног улаза или подесите помоћника тражиоца пролаза"
 
-#: src/tgetpass.c:150
+#: src/tgetpass.c:152
 msgid "no askpass program specified, try setting SUDO_ASKPASS"
 msgstr "није наведен програм за пропуштање, покушајте да подесите SUDO_ASKPASS"
 
-#: src/tgetpass.c:325
+#: src/tgetpass.c:327
 #, c-format
 msgid "unable to set gid to %u"
 msgstr "не могу да подесим гид у %u"
 
-#: src/tgetpass.c:329
+#: src/tgetpass.c:331
 #, c-format
 msgid "unable to set uid to %u"
 msgstr "не могу да подесим уид у %u"
 
-#: src/tgetpass.c:334
+#: src/tgetpass.c:336
 #, c-format
 msgid "unable to run %s"
 msgstr "не могу да покренем %s"
index b94d7c5..f08c0d7 100644 (file)
@@ -5,9 +5,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: sudo 1.9.3\n"
+"Project-Id-Version: sudo 1.9.5\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-09-12 08:28-0600\n"
+"POT-Creation-Date: 2021-01-09 12:59-0700\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,8 +30,8 @@ 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: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
+#: lib/util/json.c:54 lib/util/json.c:183 lib/util/sudo_conf.c:198
+#: lib/util/sudo_conf.c:284 lib/util/sudo_conf.c:361 lib/util/sudo_conf.c:647
 #: 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
@@ -42,30 +42,32 @@ msgstr ""
 #: 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/exec_pty.c:834 src/exec_pty.c:843 src/exec_pty.c:900 src/exec_pty.c:1053
+#: src/exec_pty.c:1225 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:1297 src/exec_pty.c:1305
+#: src/exec_pty.c:1747 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/load_plugins.c:455 src/load_plugins.c:461 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
+#: src/selinux.c:498 src/sesh.c:110 src/sesh.c:143 src/sesh.c:149
+#: src/sesh.c:156 src/sesh.c:162 src/sesh.c:407 src/sudo.c:632 src/sudo.c:702
+#: src/sudo.c:712 src/sudo.c:733 src/sudo.c:752 src/sudo.c:761 src/sudo.c:770
+#: src/sudo.c:787 src/sudo.c:829 src/sudo.c:839 src/sudo.c:868 src/sudo.c:1054
+#: src/sudo.c:1076 src/sudo.c:1378 src/sudo.c:1551 src/sudo.c:1776
+#: src/sudo.c:2120 src/sudo_edit.c:89 src/sudo_edit.c:151 src/sudo_edit.c:431
+#: src/sudo_edit.c:440 src/sudo_edit.c:539 src/sudo_edit.c:546
+#: src/sudo_edit.c:682 src/sudo_edit.c:702
 #, 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: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
+#: lib/util/json.c:184 lib/util/sudo_conf.c:199 lib/util/sudo_conf.c:284
+#: lib/util/sudo_conf.c:361 lib/util/sudo_conf.c:647 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
@@ -75,26 +77,27 @@ msgstr ""
 #: 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/exec_pty.c:834 src/exec_pty.c:843 src/exec_pty.c:900 src/exec_pty.c:1225
+#: 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:1297 src/exec_pty.c:1305 src/exec_pty.c:1747
 #: 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/load_plugins.c:455 src/load_plugins.c:461 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
+#: src/selinux.c:498 src/sesh.c:110 src/sesh.c:408 src/sudo.c:236
+#: src/sudo.c:632 src/sudo.c:868 src/sudo.c:1054 src/sudo.c:1076
+#: src/sudo.c:1378 src/sudo.c:1551 src/sudo.c:1776 src/sudo.c:2120
+#: src/sudo_edit.c:89 src/sudo_edit.c:151 src/sudo_edit.c:431
+#: src/sudo_edit.c:440 src/sudo_edit.c:539 src/sudo_edit.c:546
+#: src/sudo_edit.c:682 src/sudo_edit.c:702
 msgid "unable to allocate memory"
 msgstr ""
 
-#: 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:69 lib/util/sudo_conf.c:686 src/selinux.c:234
+#: src/selinux.c:264 src/sudo.c:367 src/sudo_edit.c:496 src/sudo_edit.c:559
 #, c-format
 msgid "unable to open %s"
 msgstr ""
@@ -104,7 +107,7 @@ msgstr ""
 msgid "unable to mkdir %s"
 msgstr ""
 
-#: lib/util/mkdir_parents.c:93 lib/util/sudo_conf.c:591
+#: lib/util/mkdir_parents.c:93 lib/util/sudo_conf.c:663 src/copy_file.c:150
 #, c-format
 msgid "unable to stat %s"
 msgstr ""
@@ -119,7 +122,7 @@ msgid "Unknown signal"
 msgstr ""
 
 #: lib/util/strtoid.c:87 lib/util/strtomode.c:52 lib/util/strtonum.c:148
-#: lib/util/strtonum.c:187
+#: lib/util/strtonum.c:187 src/sesh.c:143 src/sesh.c:156
 msgid "invalid value"
 msgstr ""
 
@@ -131,66 +134,80 @@ msgstr ""
 msgid "value too small"
 msgstr ""
 
-#: lib/util/sudo_conf.c:205
+#: lib/util/sudo_conf.c:217
 #, c-format
 msgid "invalid Path value \"%s\" in %s, line %u"
 msgstr ""
 
-#: lib/util/sudo_conf.c:371 lib/util/sudo_conf.c:387 lib/util/sudo_conf.c:440
+#: lib/util/sudo_conf.c:383 lib/util/sudo_conf.c:399 lib/util/sudo_conf.c:452
 #, c-format
 msgid "invalid value for %s \"%s\" in %s, line %u"
 msgstr ""
 
-#: lib/util/sudo_conf.c:408
+#: lib/util/sudo_conf.c:420
 #, c-format
 msgid "unsupported group source \"%s\" in %s, line %u"
 msgstr ""
 
-#: lib/util/sudo_conf.c:424
+#: lib/util/sudo_conf.c:436
 #, c-format
 msgid "invalid max groups \"%s\" in %s, line %u"
 msgstr ""
 
-#: lib/util/sudo_conf.c:594
+#: lib/util/sudo_conf.c:666
 #, c-format
 msgid "%s is not a regular file"
 msgstr ""
 
-#: lib/util/sudo_conf.c:597
+#: lib/util/sudo_conf.c:669 src/copy_file.c:162
 #, c-format
 msgid "%s is owned by uid %u, should be %u"
 msgstr ""
 
-#: lib/util/sudo_conf.c:601
+#: lib/util/sudo_conf.c:673
 #, c-format
 msgid "%s is world writable"
 msgstr ""
 
-#: lib/util/sudo_conf.c:604
+#: lib/util/sudo_conf.c:676
 #, c-format
 msgid "%s is group writable"
 msgstr ""
 
-#: src/copy_file.c:91
+#: src/copy_file.c:93
 #, c-format
 msgid "%s: truncate %s to zero bytes? (y/n) [n] "
 msgstr ""
 
-#: src/copy_file.c:95
+#: src/copy_file.c:97
 #, c-format
 msgid "not overwriting %s"
 msgstr ""
 
-#: src/copy_file.c:117
+#: src/copy_file.c:119
 #, c-format
 msgid "unable to read from %s"
 msgstr ""
 
-#: src/copy_file.c:134 src/sudo_edit.c:695
+#: src/copy_file.c:136 src/sudo_edit.c:322
 #, c-format
 msgid "unable to write to %s"
 msgstr ""
 
+#: src/copy_file.c:154 src/sesh.c:215 src/sudo_edit.c:199
+#, c-format
+msgid "%s: not a regular file"
+msgstr ""
+
+#: src/copy_file.c:158
+#, c-format
+msgid "%s: bad file mode: 0%o"
+msgstr ""
+
+#: src/edit_open.c:265
+msgid "unable to restore current working directory"
+msgstr ""
+
 #: src/exec.c:128
 #, c-format
 msgid "unknown login class %s"
@@ -225,8 +242,8 @@ msgid "starting from %s"
 msgstr ""
 
 #: 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_nopty.c:531 src/exec_pty.c:575 src/exec_pty.c:1393
+#: src/exec_pty.c:1395 src/signal.c:139 src/signal.c:153
 #, c-format
 msgid "unable to set handler for signal %d"
 msgstr ""
@@ -251,14 +268,14 @@ msgstr ""
 #: 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
+#: src/exec_nopty.c:293 src/exec_nopty.c:301 src/exec_pty.c:700
+#: src/exec_pty.c:705 src/exec_pty.c:802 src/exec_pty.c:809 src/exec_pty.c:906
+#: src/exec_pty.c:1227 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:1299 src/exec_pty.c:1700
+#: src/exec_pty.c:1710 src/exec_pty.c:1755 src/exec_pty.c:1762
+#: src/exec_pty.c:1789
 msgid "unable to add event to queue"
 msgstr ""
 
@@ -266,8 +283,8 @@ msgstr ""
 msgid "unable to set controlling tty"
 msgstr ""
 
-#: 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:590 src/exec_nopty.c:358 src/exec_pty.c:1472
+#: src/exec_pty.c:1493 src/exec_pty.c:1513 src/tgetpass.c:306
 msgid "unable to create pipe"
 msgstr ""
 
@@ -275,8 +292,8 @@ msgstr ""
 msgid "unable to receive message from parent"
 msgstr ""
 
-#: 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:612 src/exec_nopty.c:387 src/exec_pty.c:1551
+#: src/sudo_edit.c:363 src/tgetpass.c:310
 msgid "unable to fork"
 msgstr ""
 
@@ -284,20 +301,20 @@ msgstr ""
 msgid "unable to restore tty label"
 msgstr ""
 
-#: src/exec_monitor.c:632 src/sesh.c:125 src/sudo.c:1131
+#: src/exec_monitor.c:632 src/sesh.c:120 src/sudo.c:1132
 #, c-format
 msgid "unable to execute %s"
 msgstr ""
 
-#: src/exec_nopty.c:352 src/exec_pty.c:1395
+#: src/exec_nopty.c:352 src/exec_pty.c:1402
 msgid "policy plugin failed session initialization"
 msgstr ""
 
-#: src/exec_nopty.c:429 src/exec_pty.c:1632
+#: src/exec_nopty.c:429 src/exec_pty.c:1639
 msgid "error in event loop"
 msgstr ""
 
-#: src/exec_nopty.c:539 src/exec_pty.c:606 src/signal.c:101
+#: src/exec_nopty.c:539 src/exec_pty.c:613 src/signal.c:101
 #, c-format
 msgid "unable to restore handler for signal %d"
 msgstr ""
@@ -306,36 +323,36 @@ msgstr ""
 msgid "unable to allocate pty"
 msgstr ""
 
-#: 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
+#: src/exec_pty.c:216 src/exec_pty.c:256 src/exec_pty.c:296 src/exec_pty.c:347
+#: src/exec_pty.c:398
 msgid "I/O plugin error"
 msgstr ""
 
-#: 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
+#: src/exec_pty.c:220 src/exec_pty.c:260 src/exec_pty.c:300 src/exec_pty.c:351
+#: src/exec_pty.c:402
 msgid "command rejected by I/O plugin"
 msgstr ""
 
-#: src/exec_pty.c:444
+#: src/exec_pty.c:449
 msgid "error logging suspend"
 msgstr ""
 
-#: src/exec_pty.c:477
+#: src/exec_pty.c:483
 msgid "error changing window size"
 msgstr ""
 
-#: src/exec_pty.c:1375
+#: src/exec_pty.c:1382
 msgid "unable to create sockets"
 msgstr ""
 
-#: src/exec_pty.c:1587
+#: src/exec_pty.c:1594
 msgid "unable to send message to monitor process"
 msgstr ""
 
 #: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85
 #: src/load_plugins.c:115 src/load_plugins.c: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:283 src/load_plugins.c:293 src/load_plugins.c:303
+#: src/load_plugins.c:350
 #, c-format
 msgid "error in %s, line %d while loading plugin \"%s\""
 msgstr ""
@@ -355,46 +372,47 @@ msgstr ""
 msgid "%s must be only be writable by owner"
 msgstr ""
 
-#: src/load_plugins.c:247 src/load_plugins.c:322
+#: src/load_plugins.c:247 src/load_plugins.c:318
 #, c-format
 msgid "ignoring duplicate plugin \"%s\" in %s, line %d"
 msgstr ""
 
-#: src/load_plugins.c:289
+#: src/load_plugins.c:285
 #, c-format
 msgid "unable to load %s: %s"
 msgstr ""
 
-#: src/load_plugins.c:299
+#: src/load_plugins.c:295
 #, c-format
 msgid "unable to find symbol \"%s\" in %s"
 msgstr ""
 
-#: src/load_plugins.c:309
+#: src/load_plugins.c:305
 #, c-format
 msgid "incompatible plugin major version %d (expected %d) found in %s"
 msgstr ""
 
-#: src/load_plugins.c:327
+#: src/load_plugins.c:323
 #, c-format
 msgid "ignoring policy plugin \"%s\" in %s, line %d"
 msgstr ""
 
-#: src/load_plugins.c:330
+#: src/load_plugins.c:326
 msgid "only a single policy plugin may be specified"
 msgstr ""
 
-#: src/load_plugins.c:356
+#: src/load_plugins.c:352
 #, c-format
 msgid "unknown plugin type %d found in %s"
 msgstr ""
 
-#: src/load_plugins.c:552
+#: src/load_plugins.c:535
 #, c-format
 msgid "policy plugin %s does not include a check_policy method"
 msgstr ""
 
-#: src/net_ifs.c:178 src/net_ifs.c:195 src/net_ifs.c:340 src/sudo.c:479
+#: src/net_ifs.c:179 src/net_ifs.c:197 src/net_ifs.c:343 src/sudo.c:479
+#: src/sudo_edit.c:400 src/sudo_edit.c:408
 #, c-format
 msgid "internal error, %s overflow"
 msgstr ""
@@ -692,20 +710,40 @@ msgstr ""
 msgid "unable to set key creation context to %s"
 msgstr ""
 
-#: src/sesh.c:77
+#: src/sesh.c:72
 msgid "requires at least one argument"
 msgstr ""
 
-#: src/sesh.c:106
+#: src/sesh.c:101
 #, c-format
 msgid "invalid file descriptor number: %s"
 msgstr ""
 
-#: src/sesh.c:120
+#: src/sesh.c:115
 #, c-format
 msgid "unable to run %s as a login shell"
 msgstr ""
 
+#: src/sesh.c:197 src/sesh.c:297 src/sudo_edit.c:206
+#, c-format
+msgid "%s: editing symbolic links is not permitted"
+msgstr ""
+
+#: src/sesh.c:200 src/sesh.c:300 src/sudo_edit.c:209
+#, c-format
+msgid "%s: editing files in a writable directory is not permitted"
+msgstr ""
+
+#: src/sesh.c:284 src/sesh.c:305 src/sesh.c:314 src/sesh.c:322
+#: src/sudo_edit.c:333
+#, c-format
+msgid "contents of edit session left in %s"
+msgstr ""
+
+#: src/sesh.c:412 src/sudo_edit.c:93
+msgid "unable to get group list"
+msgstr ""
+
 #: src/signal.c:79
 #, c-format
 msgid "unable to save handler for signal %d"
@@ -754,25 +792,25 @@ msgstr ""
 msgid "warning, resource control assignment failed for project \"%s\""
 msgstr ""
 
-#: src/sudo.c:220
+#: src/sudo.c:222
 #, c-format
 msgid "Sudo version %s\n"
 msgstr ""
 
-#: src/sudo.c:222
+#: src/sudo.c:224
 #, c-format
 msgid "Configure options: %s\n"
 msgstr ""
 
-#: src/sudo.c:231
+#: src/sudo.c:232
 msgid "fatal error, unable to load plugins"
 msgstr ""
 
-#: src/sudo.c:277
+#: src/sudo.c:278
 msgid "plugin did not return a command to execute"
 msgstr ""
 
-#: src/sudo.c:312
+#: src/sudo.c:310
 #, c-format
 msgid "unexpected sudo mode 0x%x"
 msgstr ""
@@ -786,171 +824,166 @@ msgstr ""
 msgid "unable to determine tty"
 msgstr ""
 
-#: src/sudo.c:913
+#: src/sudo.c:914
 #, c-format
 msgid "%s must be owned by uid %d and have the setuid bit set"
 msgstr ""
 
-#: src/sudo.c:916
+#: src/sudo.c:917
 #, 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:922
+#: src/sudo.c:923
 #, c-format
 msgid "effective uid is not %d, is sudo installed setuid root?"
 msgstr ""
 
-#: src/sudo.c:938
+#: src/sudo.c:939
 msgid "unable to set supplementary group IDs"
 msgstr ""
 
-#: src/sudo.c:945
+#: src/sudo.c:946
 #, c-format
 msgid "unable to set effective gid to runas gid %u"
 msgstr ""
 
-#: src/sudo.c:951
+#: src/sudo.c:952
 #, c-format
 msgid "unable to set gid to runas gid %u"
 msgstr ""
 
-#: src/sudo.c:994
+#: src/sudo.c:995
 #, c-format
 msgid "unexpected child termination condition: %d"
 msgstr ""
 
-#: src/sudo.c:1103
+#: src/sudo.c:1104
 msgid "unable to initialize policy plugin"
 msgstr ""
 
-#: src/sudo.c:1166
+#: src/sudo.c:1167
 #, c-format
 msgid "policy plugin %s is missing the \"check_policy\" method"
 msgstr ""
 
-#: src/sudo.c:1181 src/sudo.c:1234 src/sudo.c:1278
+#: src/sudo.c:1182 src/sudo.c:1235 src/sudo.c:1279
 msgid "command rejected by policy"
 msgstr ""
 
-#: src/sudo.c:1186 src/sudo.c:1239 src/sudo.c:1283
+#: src/sudo.c:1187 src/sudo.c:1240 src/sudo.c:1284 src/sudo.c:1358
 msgid "policy plugin error"
 msgstr ""
 
-#: src/sudo.c:1220
+#: src/sudo.c:1221
 #, c-format
 msgid "policy plugin %s does not support listing privileges"
 msgstr ""
 
-#: src/sudo.c:1264
+#: src/sudo.c:1265
 #, c-format
 msgid "policy plugin %s does not support the -v option"
 msgstr ""
 
-#: src/sudo.c:1302
+#: src/sudo.c:1303
 #, c-format
 msgid "policy plugin %s does not support the -k/-K options"
 msgstr ""
 
-#: src/sudo.c:1431
+#: src/sudo.c:1436
 #, c-format
 msgid "error initializing I/O plugin %s"
 msgstr ""
 
-#: src/sudo.c:1585
+#: src/sudo.c:1590
 #, c-format
 msgid "error initializing audit plugin %s"
 msgstr ""
 
-#: src/sudo.c:1763
+#: src/sudo.c:1668
 #, c-format
-msgid "error initializing approval plugin %s"
+msgid "%s: unable to log error event%s%s"
 msgstr ""
 
-#: src/sudo.c:1839
-msgid "command rejected by approver"
+#: src/sudo.c:1703
+#, c-format
+msgid "%s: unable to log accept event%s%s"
 msgstr ""
 
-#: src/sudo.c:1848
-msgid "approval plugin error"
+#: src/sudo.c:1708 src/sudo.c:1746
+msgid "audit plugin error"
 msgstr ""
 
-#: src/sudo_edit.c:226
-msgid "no writable temporary directory found"
+#: src/sudo.c:1741
+#, c-format
+msgid "%s: unable to log reject event%s%s"
 msgstr ""
 
-#: src/sudo_edit.c:351
-msgid "unable to restore current working directory"
+#: src/sudo.c:1799
+#, c-format
+msgid "error initializing approval plugin %s"
 msgstr ""
 
-#: src/sudo_edit.c:566 src/sudo_edit.c:666
-#, c-format
-msgid "%s: not a regular file"
+#: src/sudo.c:1875
+msgid "command rejected by approver"
 msgstr ""
 
-#: src/sudo_edit.c:573
-#, c-format
-msgid "%s: editing symbolic links is not permitted"
+#: src/sudo.c:1884
+msgid "approval plugin error"
 msgstr ""
 
-#: src/sudo_edit.c:576
-#, c-format
-msgid "%s: editing files in a writable directory is not permitted"
+#: src/sudo_edit.c:112
+msgid "no writable temporary directory found"
 msgstr ""
 
-#: src/sudo_edit.c:667
+#: src/sudo_edit.c:293
 #, c-format
 msgid "%s left unmodified"
 msgstr ""
 
-#: src/sudo_edit.c:680 src/sudo_edit.c:871
+#: src/sudo_edit.c:306 src/sudo_edit.c:571
 #, c-format
 msgid "%s unchanged"
 msgstr ""
 
-#: src/sudo_edit.c:706 src/sudo_edit.c:909
-#, c-format
-msgid "contents of edit session left in %s"
-msgstr ""
-
-#: src/sudo_edit.c:814
+#: src/sudo_edit.c:483
 msgid "sesh: internal error: odd number of paths"
 msgstr ""
 
-#: src/sudo_edit.c:816
+#: src/sudo_edit.c:485
 msgid "sesh: unable to create temporary files"
 msgstr ""
 
-#: src/sudo_edit.c:818 src/sudo_edit.c:902
+#: src/sudo_edit.c:487 src/sudo_edit.c:605
 msgid "sesh: killed by a signal"
 msgstr ""
 
-#: src/sudo_edit.c:820 src/sudo_edit.c:905
+#: src/sudo_edit.c:489 src/sudo_edit.c:608
 #, c-format
 msgid "sesh: unknown error %d"
 msgstr ""
 
-#: src/sudo_edit.c:895
+#: src/sudo_edit.c:598
 msgid "unable to copy temporary files back to their original location"
 msgstr ""
 
-#: src/sudo_edit.c:899
+#: src/sudo_edit.c:602
 msgid ""
 "unable to copy some of the temporary files back to their original location"
 msgstr ""
 
-#: src/sudo_edit.c:943
+#: src/sudo_edit.c:645
 #, c-format
 msgid "unable to change uid to root (%u)"
 msgstr ""
 
-#: src/sudo_edit.c:960
+#: src/sudo_edit.c:666
 msgid "plugin error: missing file list for sudoedit"
 msgstr ""
 
-#: src/sudo_edit.c:1011 src/sudo_edit.c:1024
+#: src/sudo_edit.c:717 src/sudo_edit.c:725
 msgid "unable to read the clock"
 msgstr ""
 
index 378521a..115cc14 100644 (file)
Binary files a/po/sv.mo and b/po/sv.mo differ
index b94579f..396e63a 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -6,19 +6,19 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: sudo 1.9.1b1\n"
+"Project-Id-Version: sudo 1.9.3b1\n"
 "Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n"
-"POT-Creation-Date: 2020-06-05 10:24-0600\n"
-"PO-Revision-Date: 2020-06-07 19:16+0800\n"
+"POT-Creation-Date: 2020-09-12 08:28-0600\n"
+"PO-Revision-Date: 2020-12-26 03:44+0100\n"
 "Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
-"Language-Team: Swedish <tp-sv-list@lists.sourceforge.net>\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.3.1\n"
+"X-Generator: Poedit 2.4.2\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
@@ -54,17 +54,17 @@ msgstr "kunde inte återställa registret"
 #: 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:462 src/load_plugins.c:468
-#: src/parse_args.c:176 src/parse_args.c:197 src/parse_args.c:270
-#: src/parse_args.c:593 src/parse_args.c:615 src/parse_args.c:640
+#: 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:485 src/selinux.c:494 src/sesh.c:116
-#: src/sudo.c:624 src/sudo.c:693 src/sudo.c:703 src/sudo.c:724 src/sudo.c:743
-#: src/sudo.c:752 src/sudo.c:761 src/sudo.c:778 src/sudo.c:820 src/sudo.c:830
-#: src/sudo.c:859 src/sudo.c:1045 src/sudo.c:1067 src/sudo.c:1365
-#: src/sudo.c:1538 src/sudo.c:1732 src/sudo.c:2076 src/sudo_edit.c:263
-#: src/sudo_edit.c:767 src/sudo_edit.c:851 src/sudo_edit.c:971
-#: src/sudo_edit.c:991
+#: 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
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
@@ -87,20 +87,20 @@ msgstr "%s: %s"
 #: 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:462 src/load_plugins.c:468
-#: src/parse_args.c:176 src/parse_args.c:198 src/parse_args.c:270
-#: src/parse_args.c:593 src/parse_args.c:615 src/parse_args.c:640
+#: 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:485 src/selinux.c:494 src/sesh.c:116
-#: src/sudo.c:234 src/sudo.c:624 src/sudo.c:859 src/sudo.c:1045
-#: src/sudo.c:1067 src/sudo.c:1365 src/sudo.c:1538 src/sudo.c:1732
-#: src/sudo.c:2076 src/sudo_edit.c:263 src/sudo_edit.c:767 src/sudo_edit.c:851
-#: src/sudo_edit.c:971 src/sudo_edit.c:991
+#: 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
 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:367
+#: src/selinux.c:264 src/sudo.c:369
 #, c-format
 msgid "unable to open %s"
 msgstr "kunde inte öppna %s"
@@ -177,12 +177,22 @@ msgstr "%s är skrivbar för alla"
 msgid "%s is group writable"
 msgstr "%s är skrivbar för gruppen"
 
-#: src/copy_file.c:118
+#: src/copy_file.c:91
+#, 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
+#, c-format
+msgid "not overwriting %s"
+msgstr "skriver inte över %s"
+
+#: src/copy_file.c:117
 #, c-format
 msgid "unable to read from %s"
 msgstr "kunde inte läsa från %s"
 
-#: src/copy_file.c:122 src/sudo_edit.c:695
+#: src/copy_file.c:134 src/sudo_edit.c:695
 #, c-format
 msgid "unable to write to %s"
 msgstr "kunde inte skriva till %s"
@@ -263,7 +273,7 @@ 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:304
+#: src/exec_pty.c:1486 src/exec_pty.c:1506 src/tgetpass.c:306
 msgid "unable to create pipe"
 msgstr "kunde inte skapa rör"
 
@@ -272,7 +282,7 @@ 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:732 src/tgetpass.c:308
+#: src/sudo_edit.c:735 src/tgetpass.c:310
 msgid "unable to fork"
 msgstr "kunde inte grena process"
 
@@ -280,7 +290,7 @@ msgstr "kunde inte grena process"
 msgid "unable to restore tty label"
 msgstr "kan inte återställa tty-etikett"
 
-#: src/exec_monitor.c:632 src/sesh.c:126 src/sudo.c:1123
+#: src/exec_monitor.c:632 src/sesh.c:125 src/sudo.c:1131
 #, c-format
 msgid "unable to execute %s"
 msgstr "kunde inte köra %s"
@@ -331,7 +341,7 @@ 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:353
+#: src/load_plugins.c:354
 #, c-format
 msgid "error in %s, line %d while loading plugin \"%s\""
 msgstr "fel i %s, rad %d under inläsning av insticksmodul ”%s”"
@@ -376,67 +386,67 @@ msgstr "inkompatibel huvudversion %d för insticksmodul (%d förväntades) hitta
 msgid "ignoring policy plugin \"%s\" in %s, line %d"
 msgstr "ignorerar policyinsticksmodul ”%s” i %s, rad %d"
 
-#: src/load_plugins.c:329
+#: src/load_plugins.c:330
 msgid "only a single policy plugin may be specified"
 msgstr "bara en policyinsticksmodul kan anges"
 
-#: src/load_plugins.c:355
+#: src/load_plugins.c:356
 #, c-format
 msgid "unknown plugin type %d found in %s"
 msgstr "okänd insticksmodulstyp %d hittad i %s"
 
-#: src/load_plugins.c:541
+#: src/load_plugins.c:552
 #, 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:477
+#: 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:218
+#: src/parse_args.c:223
 #, c-format
 msgid "invalid environment variable name: %s"
 msgstr "ogiltigt namn på miljövariabel: %s"
 
-#: src/parse_args.c:319
+#: src/parse_args.c:325
 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:532
-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:552
+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:536
-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:557
+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:546
-msgid "the `-E' option is not valid in edit mode"
-msgstr "flaggan ”-E” är inte giltig i redigeringsläget"
+#: src/parse_args.c:567
+msgid "the -E option is not valid in edit mode"
+msgstr "flaggan -E är inte giltig i redigeringsläget"
 
-#: src/parse_args.c:548
+#: src/parse_args.c:570
 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:557
-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:580
+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:561
-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:584
+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:654
+#: src/parse_args.c:677
 msgid "sudoedit is not supported on this platform"
 msgstr "sudoedit stöds inte på denna plattform"
 
-#: src/parse_args.c:735
+#: src/parse_args.c:759
 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:749
+#: src/parse_args.c:773
 #, c-format
 msgid ""
 "%s - edit files as another user\n"
@@ -445,7 +455,7 @@ msgstr ""
 "%s - redigera filer som en annan användare\n"
 "\n"
 
-#: src/parse_args.c:751
+#: src/parse_args.c:775
 #, c-format
 msgid ""
 "%s - execute a command as another user\n"
@@ -454,8 +464,7 @@ msgstr ""
 "%s - kör ett kommando som en annan användare\n"
 "\n"
 
-#: src/parse_args.c:756
-#, c-format
+#: src/parse_args.c:780
 msgid ""
 "\n"
 "Options:\n"
@@ -463,123 +472,131 @@ msgstr ""
 "\n"
 "Flaggor:\n"
 
-#: src/parse_args.c:758
+#: src/parse_args.c:782
 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:761
+#: src/parse_args.c:785
 msgid "use specified BSD authentication type"
 msgstr "använd angiven BSD-autentiseringstyp"
 
-#: src/parse_args.c:764
+#: src/parse_args.c:788
 msgid "run command in the background"
 msgstr "kör kommando i bakgrunden"
 
-#: src/parse_args.c:766
+#: src/parse_args.c:790
 msgid "ring bell when prompting"
 msgstr "ring i klockan vid fråga"
 
-#: src/parse_args.c:768
+#: src/parse_args.c:792
 msgid "close all file descriptors >= num"
 msgstr "stäng alla fildeskriptorer >= num"
 
-#: src/parse_args.c:771
+#: src/parse_args.c:795
 msgid "run command with the specified BSD login class"
 msgstr "kör kommando med den angivna BSD-inloggningsklassen"
 
-#: src/parse_args.c:774
+#: src/parse_args.c:798
+msgid "change the working directory before running command"
+msgstr "ändra arbetskatalog innan kommando körs"
+
+#: src/parse_args.c:800
 msgid "preserve user environment when running command"
 msgstr "bevara användarens miljö när kommandot körs"
 
-#: src/parse_args.c:776
+#: src/parse_args.c:802
 msgid "preserve specific environment variables"
 msgstr "bevara specifika miljövariabler"
 
-#: src/parse_args.c:778
+#: src/parse_args.c:804
 msgid "edit files instead of running a command"
 msgstr "redigera filer istället för att köra ett kommando"
 
-#: src/parse_args.c:780
+#: src/parse_args.c:806
 msgid "run command as the specified group name or ID"
 msgstr "kör kommando som angivet gruppnamn eller ID"
 
-#: src/parse_args.c:782
+#: src/parse_args.c:808
 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:784
+#: src/parse_args.c:810
 msgid "display help message and exit"
 msgstr "visa hjälpmeddelande och avsluta"
 
-#: src/parse_args.c:786
+#: src/parse_args.c:812
 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:788
+#: src/parse_args.c:814
 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:790
+#: src/parse_args.c:816
 msgid "remove timestamp file completely"
 msgstr "ta bort tidsstämpelfil helt"
 
-#: src/parse_args.c:792
+#: src/parse_args.c:818
 msgid "invalidate timestamp file"
 msgstr "ogiltigförklara tidsstämpelfil"
 
-#: src/parse_args.c:794
+#: src/parse_args.c:820
 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:796
+#: src/parse_args.c:822
 msgid "non-interactive mode, no prompts are used"
 msgstr "icke-interaktivt läge, inga frågor ställs"
 
-#: src/parse_args.c:798
+#: src/parse_args.c:824
 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:800
+#: src/parse_args.c:826
 msgid "use the specified password prompt"
 msgstr "använd angiven lösenordsprompt"
 
-#: src/parse_args.c:803
+#: src/parse_args.c:828
+msgid "change the root directory before running command"
+msgstr "ändra rotkatalog innan kommando körs"
+
+#: src/parse_args.c:831
 msgid "create SELinux security context with specified role"
 msgstr "skapa SELinux-säkerhetskontext med angiven roll"
 
-#: src/parse_args.c:806
+#: src/parse_args.c:834
 msgid "read password from standard input"
 msgstr "läs lösenord från standard in"
 
-#: src/parse_args.c:808
+#: src/parse_args.c:836
 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:811
+#: src/parse_args.c:839
 msgid "create SELinux security context with specified type"
 msgstr "skapa SELinux-säkerhetskontext med angiven typ"
 
-#: src/parse_args.c:814
+#: src/parse_args.c:842
 msgid "terminate command after the specified time limit"
 msgstr "avsluta kommando efter den angivna tidsgränsen"
 
-#: src/parse_args.c:816
+#: src/parse_args.c:844
 msgid "in list mode, display privileges for user"
 msgstr "i listläge, visa rättigheter för användaren"
 
-#: src/parse_args.c:818
+#: src/parse_args.c:846
 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:820
+#: src/parse_args.c:848
 msgid "display version information and exit"
 msgstr "visa versionsinformation och avsluta"
 
-#: src/parse_args.c:822
+#: src/parse_args.c:850
 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:824
+#: src/parse_args.c:852
 msgid "stop processing command line arguments"
 msgstr "sluta behandla kommandoradsargument"
 
@@ -684,16 +701,16 @@ msgstr "kunde inte ställa in körkontext till %s"
 msgid "unable to set key creation context to %s"
 msgstr "kan inte ställa in kontext för nyckelskapande till %s"
 
-#: src/sesh.c:78
+#: src/sesh.c:77
 msgid "requires at least one argument"
 msgstr "kräver minst ett argument"
 
-#: src/sesh.c:107
+#: src/sesh.c:106
 #, c-format
 msgid "invalid file descriptor number: %s"
 msgstr "ogiltigt fildeskriptornummer: %s"
 
-#: src/sesh.c:121
+#: src/sesh.c:120
 #, c-format
 msgid "unable to run %s as a login shell"
 msgstr "kunde inte köra %s som ett inloggningsskal"
@@ -721,149 +738,149 @@ msgstr "den startande uppgiften är den sista"
 msgid "could not join project \"%s\""
 msgstr "kunde inte gå med i projekt ”%s”"
 
-#: src/solaris.c:87
+#: src/solaris.c:89
 #, c-format
 msgid "no resource pool accepting default bindings exists for project \"%s\""
 msgstr "ingen resurspool som accepterar standardbindningar existerar för projekt ”%s”"
 
-#: src/solaris.c:91
+#: src/solaris.c:93
 #, c-format
 msgid "specified resource pool does not exist for project \"%s\""
 msgstr "angiven resurspool finns inte för projekt ”%s”"
 
-#: src/solaris.c:95
+#: src/solaris.c:97
 #, c-format
 msgid "could not bind to default resource pool for project \"%s\""
 msgstr "kunde inte binda till standardresurspool för projekt ”%s”"
 
-#: src/solaris.c:101
+#: src/solaris.c:104
 #, c-format
 msgid "setproject failed for project \"%s\""
 msgstr "setproject misslyckades för projekt ”%s”"
 
-#: src/solaris.c:103
+#: src/solaris.c:106
 #, c-format
 msgid "warning, resource control assignment failed for project \"%s\""
 msgstr "varning, tilldelning av resurskontroll misslyckades för projekt ”%s”"
 
-#: src/sudo.c:219
+#: src/sudo.c:220
 #, c-format
 msgid "Sudo version %s\n"
 msgstr "Sudo version %s\n"
 
-#: src/sudo.c:221
+#: src/sudo.c:222
 #, c-format
 msgid "Configure options: %s\n"
 msgstr "Konfigurationsflaggor: %s\n"
 
-#: src/sudo.c:230
+#: src/sudo.c:231
 msgid "fatal error, unable to load plugins"
 msgstr "ödesdigert fel, kunde inte läsa in insticksmoduler"
 
-#: src/sudo.c:275
+#: src/sudo.c:277
 msgid "plugin did not return a command to execute"
 msgstr "insticksmodul returnerade ett kommando att exekvera"
 
-#: src/sudo.c:310
+#: src/sudo.c:312
 #, c-format
 msgid "unexpected sudo mode 0x%x"
 msgstr "oväntat sudo-läge 0x%x"
 
-#: src/sudo.c:543
+#: src/sudo.c:546
 #, c-format
 msgid "you do not exist in the %s database"
 msgstr "du existerar inte i %s-databasen"
 
-#: src/sudo.c:600
+#: src/sudo.c:603
 msgid "unable to determine tty"
 msgstr "kan inte detektera tty"
 
-#: src/sudo.c:905
+#: src/sudo.c:913
 #, 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:908
+#: src/sudo.c:916
 #, 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:914
+#: src/sudo.c:922
 #, 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:930
+#: src/sudo.c:938
 msgid "unable to set supplementary group IDs"
 msgstr "kan inte ställa in kompletterande grupp-ID:n"
 
-#: src/sudo.c:937
+#: src/sudo.c:945
 #, 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:943
+#: src/sudo.c:951
 #, 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:986
+#: src/sudo.c:994
 #, c-format
 msgid "unexpected child termination condition: %d"
 msgstr "oväntat barnavslutsvillkor: %d"
 
-#: src/sudo.c:1095
+#: src/sudo.c:1103
 msgid "unable to initialize policy plugin"
 msgstr "kan inte initiera policy-instick"
 
-#: src/sudo.c:1158
+#: src/sudo.c:1166
 #, c-format
-msgid "policy plugin %s is missing the `check_policy' method"
+msgid "policy plugin %s is missing the \"check_policy\" method"
 msgstr "policyinsticksmodul %s saknar metoden ”check_policy”"
 
-#: src/sudo.c:1173 src/sudo.c:1226 src/sudo.c:1270
+#: 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:1178 src/sudo.c:1231 src/sudo.c:1275
+#: src/sudo.c:1186 src/sudo.c:1239 src/sudo.c:1283
 msgid "policy plugin error"
 msgstr "fel i policyinsticksmodul"
 
-#: src/sudo.c:1212
+#: src/sudo.c:1220
 #, 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:1256
+#: src/sudo.c:1264
 #, 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:1294
+#: src/sudo.c:1302
 #, 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:1423
+#: src/sudo.c:1431
 #, c-format
 msgid "error initializing I/O plugin %s"
 msgstr "fel vid initiering av I/O-insticksmodul %s"
 
-#: src/sudo.c:1577
+#: src/sudo.c:1585
 #, c-format
 msgid "error initializing audit plugin %s"
 msgstr "fel vid initiering av granskningsinsticksmodul %s"
 
-#: src/sudo.c:1755
+#: src/sudo.c:1763
 #, c-format
 msgid "error initializing approval plugin %s"
 msgstr "fel vid initiering av godkänningsinsticksmodul %s"
 
-#: src/sudo.c:1831
+#: src/sudo.c:1839
 msgid "command rejected by approver"
 msgstr "kommando avböjt av godkännare"
 
-#: src/sudo.c:1840
+#: src/sudo.c:1848
 msgid "approval plugin error"
 msgstr "fel i godkänningsinsticksmodul"
 
@@ -895,51 +912,51 @@ msgstr "%s: att redigera filer i en skrivbar katalog är inte tillåtet"
 msgid "%s left unmodified"
 msgstr "%s lämnad oförändrad"
 
-#: src/sudo_edit.c:680 src/sudo_edit.c:868
+#: src/sudo_edit.c:680 src/sudo_edit.c:871
 #, c-format
 msgid "%s unchanged"
 msgstr "%s oförändrad"
 
-#: src/sudo_edit.c:703 src/sudo_edit.c:904
+#: 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:811
+#: src/sudo_edit.c:814
 msgid "sesh: internal error: odd number of paths"
 msgstr "sesh: internt fel: udda antal sökvägar"
 
-#: src/sudo_edit.c:813
+#: src/sudo_edit.c:816
 msgid "sesh: unable to create temporary files"
 msgstr "sesh: kunde inte skapa temporärfiler"
 
-#: src/sudo_edit.c:815 src/sudo_edit.c:897
+#: src/sudo_edit.c:818 src/sudo_edit.c:902
 msgid "sesh: killed by a signal"
-msgstr "sesh: dödad en signal"
+msgstr "sesh: dödad av en signal"
 
-#: src/sudo_edit.c:817 src/sudo_edit.c:900
+#: src/sudo_edit.c:820 src/sudo_edit.c:905
 #, c-format
 msgid "sesh: unknown error %d"
 msgstr "sesh: okänt fel %d"
 
-#: src/sudo_edit.c:891
+#: src/sudo_edit.c:895
 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:894
+#: src/sudo_edit.c:899
 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:938
+#: src/sudo_edit.c:943
 #, c-format
 msgid "unable to change uid to root (%u)"
 msgstr "kunde inte ändra uid till root (%u)"
 
-#: src/sudo_edit.c:955
+#: src/sudo_edit.c:960
 msgid "plugin error: missing file list for sudoedit"
 msgstr "insticksfel: fillista för sudoedit saknas"
 
-#: src/sudo_edit.c:1006 src/sudo_edit.c:1019
+#: src/sudo_edit.c:1011 src/sudo_edit.c:1024
 msgid "unable to read the clock"
 msgstr "kunde inte läsa klockan"
 
@@ -955,25 +972,25 @@ msgstr "inget lösenord angavs"
 msgid "unable to read password"
 msgstr "kan inte läsa lösenord"
 
-#: src/tgetpass.c:140
+#: src/tgetpass.c:141
 msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper"
 msgstr "en terminal krävs för att läsa lösenordet; använd antingen flaggan -S för att läsa från standard in, eller konfigurera en askpass-hjälpare"
 
-#: src/tgetpass.c:150
+#: src/tgetpass.c:152
 msgid "no askpass program specified, try setting SUDO_ASKPASS"
 msgstr "inget askpass-program angivet, prova att ställ in SUDO_ASKPASS"
 
-#: src/tgetpass.c:325
+#: src/tgetpass.c:327
 #, c-format
 msgid "unable to set gid to %u"
 msgstr "kunde inte ställa in gid till %u"
 
-#: src/tgetpass.c:329
+#: src/tgetpass.c:331
 #, c-format
 msgid "unable to set uid to %u"
 msgstr "kunde inte ställa in uid till %u"
 
-#: src/tgetpass.c:334
+#: src/tgetpass.c:336
 #, c-format
 msgid "unable to run %s"
 msgstr "kunde inte köra %s"
index 0423421..1d7d53d 100755 (executable)
@@ -116,7 +116,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_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 inet_ntop_lo inet_pton.lo isblank.lo memrchr.lo mksiglist.lo mksigname.lo mktemp.lo nanosleep.lo openat.lo pipe2.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 unlinkat.lo utimens.lo vsyslog.lo:;
+    $makefile =~ s:\@LTLIBOBJS\@:arc4random.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 inet_ntop_lo inet_pton.lo isblank.lo memrchr.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 unlinkat.lo utimens.lo vsyslog.lo:;
 
     # Parse OBJS lines
     my %objs;
index 7fbd86c..fb49d67 100644 (file)
@@ -1,7 +1,7 @@
 #
 # SPDX-License-Identifier: ISC
 #
-# Copyright (c) 2010-2018 Todd C. Miller <Todd.Miller@sudo.ws>
+# Copyright (c) 2010-2021
 #
 # Permission to use, copy, modify, and distribute this software for any
 # purpose with or without fee is hereby granted, provided that the above
@@ -77,7 +77,7 @@ SSP_CFLAGS = @SSP_CFLAGS@
 SSP_LDFLAGS = @SSP_LDFLAGS@
 
 # cppcheck options, usually set in the top-level Makefile
-CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
 
 # splint options, usually set in the top-level Makefile
 SPLINT_OPTS = -D__restrict= -checks
@@ -123,8 +123,8 @@ SHELL = @SHELL@
 
 PROGS = @PROGS@
 
-OBJS = conversation.o copy_file.o env_hooks.o exec.o exec_common.o \
-       exec_monitor.o exec_nopty.o exec_pty.o get_pty.o hooks.o \
+OBJS = conversation.o copy_file.o edit_open.o env_hooks.o exec.o \
+       exec_common.o exec_monitor.o exec_nopty.o exec_pty.o get_pty.o hooks.o \
        limits.o load_plugins.o net_ifs.o parse_args.o preserve_fds.o \
        signal.o sudo.o sudo_edit.o tcsetpgrp_nobg.o tgetpass.o \
        ttyname.o utmp.o @SUDO_OBJS@
@@ -133,7 +133,7 @@ IOBJS = $(OBJS:.o=.i) sesh.i
 
 POBJS = $(IOBJS:.i=.plog)
 
-SESH_OBJS = copy_file.o exec_common.o sesh.o
+SESH_OBJS = copy_file.o edit_open.o exec_common.o sesh.o
 
 CHECK_NOEXEC_OBJS = check_noexec.o exec_common.o
 
@@ -362,6 +362,24 @@ copy_file.i: $(srcdir)/copy_file.c $(incdir)/compat/stdbool.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 $@
+edit_open.o: $(srcdir)/edit_open.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_edit.h \
+             $(top_builddir)/config.h $(top_builddir)/pathnames.h
+       $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/edit_open.c
+edit_open.i: $(srcdir)/edit_open.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_edit.h \
+             $(top_builddir)/config.h $(top_builddir)/pathnames.h
+       $(CC) -E -o $@ $(CPPFLAGS) $<
+edit_open.plog: edit_open.i
+       rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/edit_open.c --i-file $< --output-file $@
 env_hooks.o: $(srcdir)/env_hooks.c $(incdir)/compat/stdbool.h \
              $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \
              $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \
@@ -641,16 +659,18 @@ selinux.i: $(srcdir)/selinux.c $(incdir)/compat/stdbool.h \
 selinux.plog: selinux.i
        rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/selinux.c --i-file $< --output-file $@
 sesh.o: $(srcdir)/sesh.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
-        $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \
-        $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \
-        $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/sudo_exec.h \
-        $(top_builddir)/config.h
+        $(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) $(SSP_CFLAGS) $(srcdir)/sesh.c
 sesh.i: $(srcdir)/sesh.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
-        $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \
-        $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \
-        $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/sudo_exec.h \
-        $(top_builddir)/config.h
+        $(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) -E -o $@ $(CPPFLAGS) $<
 sesh.plog: sesh.i
        rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sesh.c --i-file $< --output-file $@
@@ -711,16 +731,18 @@ sudo_edit.o: $(srcdir)/sudo_edit.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 $(srcdir)/sudo_exec.h \
-             $(top_builddir)/config.h $(top_builddir)/pathnames.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) $(SSP_CFLAGS) $(srcdir)/sudo_edit.c
 sudo_edit.i: $(srcdir)/sudo_edit.c $(incdir)/compat/stdbool.h \
              $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \
              $(incdir)/sudo_debug.h $(incdir)/sudo_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 \
-             $(top_builddir)/config.h $(top_builddir)/pathnames.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) -E -o $@ $(CPPFLAGS) $<
 sudo_edit.plog: sudo_edit.i
        rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_edit.c --i-file $< --output-file $@
index a90a374..1930e9e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2020-2021 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,8 @@
 
 #include <config.h>
 
+#include <sys/stat.h>
+
 #include <stdlib.h>
 #include <unistd.h>
 #include <errno.h>
@@ -134,3 +136,32 @@ write_error:
     sudo_warn(U_("unable to write to %s"), dst);
     debug_return_int(-1);
 }
+
+bool
+sudo_check_temp_file(int tfd, const char *tfile, uid_t uid, struct stat *sb)
+{
+    struct stat sbuf;
+    debug_decl(sudo_check_temp_file, SUDO_DEBUG_UTIL);
+
+    if (sb == NULL)
+       sb = &sbuf;
+
+    if (fstat(tfd, sb) == -1) {
+       sudo_warn(U_("unable to stat %s"), tfile);
+       debug_return_bool(false);
+    }
+    if (!S_ISREG(sb->st_mode)) {
+       sudo_warnx(U_("%s: not a regular file"), tfile);
+       debug_return_bool(false);
+    }
+    if ((sb->st_mode & ALLPERMS) != (S_IRUSR|S_IWUSR)) {
+       sudo_warnx(U_("%s: bad file mode: 0%o"), tfile, sb->st_mode & ALLPERMS);
+       debug_return_bool(false);
+    }
+    if (sb->st_uid != uid) {
+       sudo_warnx(U_("%s is owned by uid %u, should be %u"),
+           tfile, (unsigned int)sb->st_uid, (unsigned int)uid);
+       debug_return_bool(false);
+    }
+    debug_return_bool(true);
+}
diff --git a/src/edit_open.c b/src/edit_open.c
new file mode 100644 (file)
index 0000000..8795218
--- /dev/null
@@ -0,0 +1,456 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2015-2021 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/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <grp.h>
+#include <pwd.h>
+#include <fcntl.h>
+
+#include "sudo.h"
+#include "sudo_edit.h"
+
+#if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID)
+
+void
+switch_user(uid_t euid, gid_t egid, int ngroups, GETGROUPS_T *groups)
+{
+    int serrno = errno;
+    debug_decl(switch_user, SUDO_DEBUG_EDIT);
+
+    sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+       "set uid:gid to %u:%u(%u)", (unsigned int)euid, (unsigned int)egid,
+       ngroups > 0 ? (unsigned int)groups[0] : (unsigned int)egid);
+
+    /* When restoring root, change euid first; otherwise change it last. */
+    if (euid == ROOT_UID) {
+       if (seteuid(ROOT_UID) != 0)
+           sudo_fatal("seteuid(ROOT_UID)");
+    }
+    if (setegid(egid) != 0)
+       sudo_fatal("setegid(%d)", (int)egid);
+    if (ngroups != -1) {
+       if (sudo_setgroups(ngroups, groups) != 0)
+           sudo_fatal("setgroups");
+    }
+    if (euid != ROOT_UID) {
+       if (seteuid(euid) != 0)
+           sudo_fatal("seteuid(%u)", (unsigned int)euid);
+    }
+    errno = serrno;
+
+    debug_return;
+}
+
+#if defined(HAVE_FACCESSAT) && defined(AT_EACCESS)
+/*
+ * Returns true if the open directory fd is owned or writable by the user.
+ */
+int
+dir_is_writable(int dfd, struct sudo_cred *user_cred, struct sudo_cred *cur_cred)
+{
+    struct stat sb;
+    int rc;
+    debug_decl(dir_is_writable, SUDO_DEBUG_EDIT);
+
+    if (fstat(dfd, &sb) == -1)
+       debug_return_int(-1);
+
+    /* If the user owns the dir we always consider it writable. */
+    if (sb.st_uid == user_cred->uid) {
+       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+           "user uid %u matches directory uid %u",
+           (unsigned int)user_cred->uid, (unsigned int)sb.st_uid);
+       debug_return_int(true);
+    }
+
+    /* Change uid/gid/groups to invoking user, usually needs root perms. */
+    if (cur_cred->euid != ROOT_UID) {
+       if (seteuid(ROOT_UID) != 0)
+           sudo_fatal("seteuid(ROOT_UID)");
+    }
+    switch_user(user_cred->uid, user_cred->gid, user_cred->ngroups,
+       user_cred->groups);
+
+    /* Access checks are done using the euid/egid and group vector. */
+    rc = faccessat(dfd, ".", W_OK, AT_EACCESS);
+
+    /* Restore uid/gid/groups, may need root perms. */
+    if (user_cred->uid != ROOT_UID) {
+       if (seteuid(ROOT_UID) != 0)
+           sudo_fatal("seteuid(ROOT_UID)");
+    }
+    switch_user(cur_cred->euid, cur_cred->egid, cur_cred->ngroups,
+       cur_cred->groups);
+
+    if (rc == 0)
+       debug_return_int(true);
+    if (errno == EACCES || errno == EROFS)
+       debug_return_int(false);
+    debug_return_int(-1);
+}
+#else
+static bool
+group_matches(gid_t target, struct sudo_cred *cred)
+{
+    int i;
+    debug_decl(group_matches, SUDO_DEBUG_EDIT);
+
+    if (target == cred->gid) {
+       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+           "user gid %u matches directory gid %u", (unsigned int)cred->gid,
+           (unsigned int)target);
+       debug_return_bool(true);
+    }
+    for (i = 0; i < cred->ngroups; i++) {
+       if (target == cred->groups[i]) {
+           sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+               "user gid %u matches directory gid %u", cred->groups[i],
+               (unsigned int)target);
+           debug_return_bool(true);
+       }
+    }
+    debug_return_bool(false);
+}
+
+/*
+ * Returns true if the open directory fd is owned or writable by the user.
+ */
+int
+dir_is_writable(int dfd, struct sudo_cred *user_cred, struct sudo_cred *cur_cred)
+{
+    struct stat sb;
+    debug_decl(dir_is_writable, SUDO_DEBUG_EDIT);
+
+    if (fstat(dfd, &sb) == -1)
+       debug_return_int(-1);
+
+    /* If the user owns the dir we always consider it writable. */
+    if (sb.st_uid == user_cred->uid) {
+       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+           "user uid %u matches directory uid %u",
+           (unsigned int)user_cred->uid, (unsigned int)sb.st_uid);
+       debug_return_int(true);
+    }
+
+    /* Other writable? */
+    if (ISSET(sb.st_mode, S_IWOTH)) {
+       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+           "directory is writable by other");
+       debug_return_int(true);
+    }
+
+    /* Group writable? */
+    if (ISSET(sb.st_mode, S_IWGRP)) {
+       if (group_matches(sb.st_gid, user_cred)) {
+           sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+               "directory is writable by one of the user's groups");
+           debug_return_int(true);
+       }
+    }
+
+    errno = EACCES;
+    debug_return_int(false);
+}
+#endif /* HAVE_FACCESSAT && AT_EACCESS */
+
+#ifdef O_NOFOLLOW
+static int
+sudo_edit_openat_nofollow(int dfd, char *path, int oflags, mode_t mode)
+{
+    debug_decl(sudo_edit_openat_nofollow, SUDO_DEBUG_EDIT);
+
+    debug_return_int(openat(dfd, path, oflags|O_NOFOLLOW, mode));
+}
+#else
+/*
+ * Returns true if fd and path don't match or path is a symlink.
+ * Used on older systems without O_NOFOLLOW.
+ */
+static bool
+sudo_edit_is_symlink(int fd, char *path)
+{
+    struct stat sb1, sb2;
+    debug_decl(sudo_edit_is_symlink, SUDO_DEBUG_EDIT);
+
+    /*
+     * Treat [fl]stat() failure like there was a symlink.
+     */
+    if (fstat(fd, &sb1) == -1 || lstat(path, &sb2) == -1)
+       debug_return_bool(true);
+
+    /*
+     * Make sure we did not open a link and that what we opened
+     * matches what is currently on the file system.
+     */
+    if (S_ISLNK(sb2.st_mode) ||
+       sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) {
+       debug_return_bool(true);
+    }
+
+    debug_return_bool(false);
+}
+
+static int
+sudo_edit_openat_nofollow(int dfd, char *path, int oflags, mode_t mode)
+{
+    int fd = -1, odfd = -1;
+    struct stat sb;
+    debug_decl(sudo_edit_openat_nofollow, SUDO_DEBUG_EDIT);
+
+    /* Save cwd and chdir to dfd */
+    if ((odfd = open(".", O_RDONLY)) == -1)
+       debug_return_int(-1);
+    if (fchdir(dfd) == -1) {
+       close(odfd);
+       debug_return_int(-1);
+    }
+
+    /*
+     * Check if path is a symlink.  This is racey but we detect whether
+     * we lost the race in sudo_edit_is_symlink() after the open.
+     */
+    if (lstat(path, &sb) == -1 && errno != ENOENT)
+       goto done;
+    if (S_ISLNK(sb.st_mode)) {
+       errno = ELOOP;
+       goto done;
+    }
+
+    fd = open(path, oflags, mode);
+    if (fd == -1)
+       goto done;
+
+    /*
+     * Post-open symlink check.  This will leave a zero-length file if
+     * O_CREAT was specified but it is too dangerous to try and remove it.
+     */
+    if (sudo_edit_is_symlink(fd, path)) {
+       close(fd);
+       fd = -1;
+       errno = ELOOP;
+    }
+
+done:
+    /* Restore cwd */
+    if (odfd != -1) {
+       if (fchdir(odfd) == -1)
+           sudo_fatal("%s", U_("unable to restore current working directory"));
+       close(odfd);
+    }
+
+    debug_return_int(fd);
+}
+#endif /* O_NOFOLLOW */
+
+static int
+sudo_edit_open_nonwritable(char *path, int oflags, mode_t mode,
+    struct sudo_cred *user_cred, struct sudo_cred *cur_cred)
+{
+    const int dflags = DIR_OPEN_FLAGS;
+    int dfd, fd, is_writable;
+    debug_decl(sudo_edit_open_nonwritable, SUDO_DEBUG_EDIT);
+
+    if (path[0] == '/') {
+       dfd = open("/", dflags);
+       path++;
+    } else {
+       dfd = open(".", dflags);
+       if (path[0] == '.' && path[1] == '/')
+           path += 2;
+    }
+    if (dfd == -1)
+       debug_return_int(-1);
+
+    for (;;) {
+       char *slash;
+       int subdfd;
+
+       /*
+        * Look up one component at a time, avoiding symbolic links in
+        * writable directories.
+        */
+       is_writable = dir_is_writable(dfd, user_cred, cur_cred);
+       if (is_writable == -1) {
+           close(dfd);
+           debug_return_int(-1);
+       }
+
+       path += strspn(path, "/");
+       slash = strchr(path, '/');
+       if (slash == NULL)
+           break;
+       *slash = '\0';
+       if (is_writable)
+           subdfd = sudo_edit_openat_nofollow(dfd, path, dflags, 0);
+       else
+           subdfd = openat(dfd, path, dflags, 0);
+       *slash = '/';                   /* restore path */
+       close(dfd);
+       if (subdfd == -1)
+           debug_return_int(-1);
+       path = slash + 1;
+       dfd = subdfd;
+    }
+
+    if (is_writable) {
+       close(dfd);
+       errno = EISDIR;
+       debug_return_int(-1);
+    }
+
+    /*
+     * For "sudoedit /" we will receive ENOENT from openat() and sudoedit
+     * will try to create a file with an empty name.  We treat an empty
+     * path as the cwd so sudoedit can give a sensible error message.
+     */
+    fd = openat(dfd, *path ? path : ".", oflags, mode);
+    close(dfd);
+    debug_return_int(fd);
+}
+
+#ifdef O_NOFOLLOW
+int
+sudo_edit_open(char *path, int oflags, mode_t mode, int sflags,
+    struct sudo_cred *user_cred, struct sudo_cred *cur_cred)
+{
+    int fd;
+    debug_decl(sudo_edit_open, SUDO_DEBUG_EDIT);
+
+    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW))
+       oflags |= O_NOFOLLOW;
+    if (ISSET(sflags, CD_SUDOEDIT_CHECKDIR) && user_cred->uid != ROOT_UID) {
+       fd = sudo_edit_open_nonwritable(path, oflags|O_NONBLOCK, mode,
+           user_cred, cur_cred);
+    } else {
+       fd = open(path, oflags|O_NONBLOCK, mode);
+    }
+    if (fd != -1 && !ISSET(oflags, O_NONBLOCK))
+       (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
+    debug_return_int(fd);
+}
+#else
+int
+sudo_edit_open(char *path, int oflags, mode_t mode, int sflags,
+    struct sudo_cred *user_cred, struct sudo_cred *cur_cred)
+{
+    struct stat sb;
+    int fd;
+    debug_decl(sudo_edit_open, SUDO_DEBUG_EDIT);
+
+    /*
+     * Check if path is a symlink.  This is racey but we detect whether
+     * we lost the race in sudo_edit_is_symlink() after the file is opened.
+     */
+    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW)) {
+       if (lstat(path, &sb) == -1 && errno != ENOENT)
+           debug_return_int(-1);
+       if (S_ISLNK(sb.st_mode)) {
+           errno = ELOOP;
+           debug_return_int(-1);
+       }
+    }
+
+    if (ISSET(sflags, CD_SUDOEDIT_CHECKDIR) && user_cred->uid != ROOT_UID) {
+       fd = sudo_edit_open_nonwritable(path, oflags|O_NONBLOCK, mode,
+           user_cred, cur_cred);
+    } else {
+       fd = open(path, oflags|O_NONBLOCK, mode);
+    }
+    if (fd == -1)
+       debug_return_int(-1);
+    if (!ISSET(oflags, O_NONBLOCK))
+       (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
+
+    /*
+     * Post-open symlink check.  This will leave a zero-length file if
+     * O_CREAT was specified but it is too dangerous to try and remove it.
+     */
+    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW) && sudo_edit_is_symlink(fd, path)) {
+       close(fd);
+       fd = -1;
+       errno = ELOOP;
+    }
+
+    debug_return_int(fd);
+}
+#endif /* O_NOFOLLOW */
+
+/*
+ * Verify that the parent dir of a new file exists and is not writable
+ * by the user.  This fails early so the user knows ahead of time if the
+ * edit won't succeed.  Additional checks are performed when copying the
+ * temporary file back to the origin so there are no TOCTOU issues.
+ * Does not modify the value of errno.
+ */
+bool
+sudo_edit_parent_valid(char *path, int sflags, struct sudo_cred *user_cred,
+    struct sudo_cred *cur_cred)
+{
+    const int serrno = errno;
+    struct stat sb;
+    bool ret = false;
+    char *slash;
+    int dfd;
+    debug_decl(sudo_edit_parent_valid, SUDO_DEBUG_EDIT);
+
+    /* Get dirname of path (the slash is restored later). */
+    slash = strrchr(path, '/');
+    if (slash == NULL) {
+       /* cwd */
+       path = ".";
+    } else if (slash == path) {
+       path = "/";
+       slash = NULL;
+    } else {
+       *slash = '\0';
+    }
+
+    /*
+     * The parent directory is allowed to be a symbolic link unless
+     * *its* parent is writable and CD_SUDOEDIT_CHECK is set.
+     */
+    dfd = sudo_edit_open(path, DIR_OPEN_FLAGS, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH,
+       sflags|CD_SUDOEDIT_FOLLOW, user_cred, cur_cred);
+    if (dfd != -1) {
+       if (fstat(dfd, &sb) == 0 && S_ISDIR(sb.st_mode))
+           ret = true;
+       close(dfd);
+    }
+    if (slash != NULL)
+       *slash = '/';
+
+    /* Restore errno. */
+    errno = serrno;
+
+    debug_return_bool(ret);
+}
+
+#endif /* HAVE_SETRESUID || HAVE_SETREUID || HAVE_SETEUID */
index fb98f1c..ffee016 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 2009-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2021 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
@@ -179,22 +179,22 @@ exec_setup(struct command_details *details, int errfd)
     unlimit_nproc();
 
 #if defined(HAVE_SETRESUID)
-    if (setresuid(details->uid, details->euid, details->euid) != 0) {
+    if (setresuid(details->cred.uid, details->cred.euid, details->cred.euid) != 0) {
        sudo_warn(U_("unable to change to runas uid (%u, %u)"),
-           (unsigned int)details->uid, (unsigned int)details->euid);
+           (unsigned int)details->cred.uid, (unsigned int)details->cred.euid);
        goto done;
     }
 #elif defined(HAVE_SETREUID)
-    if (setreuid(details->uid, details->euid) != 0) {
+    if (setreuid(details->cred.uid, details->cred.euid) != 0) {
        sudo_warn(U_("unable to change to runas uid (%u, %u)"),
-           (unsigned int)details->uid, (unsigned int)details->euid);
+           (unsigned int)details->cred.uid, (unsigned int)details->cred.euid);
        goto done;
     }
 #else
     /* Cannot support real user-ID that is different from effective user-ID. */
-    if (setuid(details->euid) != 0) {
+    if (setuid(details->cred.euid) != 0) {
        sudo_warn(U_("unable to change to runas uid (%u, %u)"),
-           (unsigned int)details->euid, (unsigned int)details->euid);
+           (unsigned int)details->cred.euid, (unsigned int)details->cred.euid);
        goto done;
     }
 #endif /* !HAVE_SETRESUID && !HAVE_SETREUID */
@@ -345,7 +345,7 @@ direct_exec_allowed(struct command_details *details)
     debug_decl(direct_exec_allowed, SUDO_DEBUG_EXEC);
 
     /* Assumes sudo_needs_pty() was already checked. */
-    if (ISSET(details->flags, CD_SET_TIMEOUT|CD_SUDOEDIT) ||
+    if (ISSET(details->flags, CD_RBAC_ENABLED|CD_SET_TIMEOUT|CD_SUDOEDIT) ||
            policy_plugin.u.policy->close != NULL)
        debug_return_bool(false);
 
index 909d364..32834de 100644 (file)
@@ -99,7 +99,7 @@ preload_dso(char *envp[], const char *dso_file)
      * whether it was dynamically allocated. [TODO: plugin API]
      */
     if (preload_idx == -1 || !enabled) {
-       const int env_size = env_len + 1 + (preload_idx == -1) + enabled;
+       const int env_size = env_len + 1 + (preload_idx == -1) + enabled; // -V547
 
        char **nenvp = reallocarray(NULL, env_size, sizeof(*envp));
        if (nenvp == NULL)
index 40ddbeb..cfe4929 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 2009-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2021 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
@@ -148,7 +148,7 @@ pty_setup(struct command_details *details, const char *tty)
     }
 
     if (!get_pty(&io_fds[SFD_LEADER], &io_fds[SFD_FOLLOWER],
-       ptyname, sizeof(ptyname), details->euid))
+       ptyname, sizeof(ptyname), details->cred.euid))
        sudo_fatal("%s", U_("unable to allocate pty"));
 
     /* Update tty name in command details (used by SELinux and AIX). */
index 0bdeace..273ca9a 100644 (file)
@@ -119,7 +119,8 @@ get_net_ifs(char **addrinfo)
 #else
     char addrstr[INET_ADDRSTRLEN], maskstr[INET_ADDRSTRLEN];
 #endif
-    int ailen, len, num_interfaces = 0;
+    int len, num_interfaces = 0;
+    size_t ailen;
     char *cp;
     debug_decl(get_net_ifs, SUDO_DEBUG_NETIF);
 
@@ -172,13 +173,14 @@ get_net_ifs(char **addrinfo)
                if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL)
                    continue;
 
-               len = snprintf(cp, ailen - (*addrinfo - cp),
-                   "%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr);
-               if (len < 0 || len >= ailen - (*addrinfo - cp)) {
+               len = snprintf(cp, ailen, "%s%s/%s",
+                   cp == *addrinfo ? "" : " ", addrstr, maskstr);
+               if (len < 0 || (size_t)len >= ailen) {
                    sudo_warnx(U_("internal error, %s overflow"), __func__);
                    goto done;
                }
                cp += len;
+               ailen -= len;
                break;
 #ifdef HAVE_STRUCT_IN6_ADDR
            case AF_INET6:
@@ -189,13 +191,14 @@ get_net_ifs(char **addrinfo)
                if (inet_ntop(AF_INET6, &sin6->sin6_addr, maskstr, sizeof(maskstr)) == NULL)
                    continue;
 
-               len = snprintf(cp, ailen - (*addrinfo - cp),
-                   "%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr);
-               if (len < 0 || len >= ailen - (*addrinfo - cp)) {
+               len = snprintf(cp, ailen, "%s%s/%s",
+                   cp == *addrinfo ? "" : " ", addrstr, maskstr);
+               if (len < 0 || (size_t)len >= ailen) {
                    sudo_warnx(U_("internal error, %s overflow"), __func__);
                    goto done;
                }
                cp += len;
+               ailen -= len;
                break;
 #endif /* HAVE_STRUCT_IN6_ADDR */
        }
@@ -223,8 +226,8 @@ get_net_ifs(char **addrinfo)
     struct ifreq *ifr, *ifr_tmp = (struct ifreq *)ifr_tmpbuf;
     struct ifconf *ifconf;
     struct sockaddr_in *sin;
-    int ailen, i, len, n, sock, num_interfaces = 0;
-    size_t buflen = sizeof(struct ifconf) + BUFSIZ;
+    int i, len, n, sock, num_interfaces = 0;
+    size_t ailen, buflen = sizeof(struct ifconf) + BUFSIZ;
     char *cp, *previfname = "", *ifconf_buf = NULL;
     char addrstr[INET_ADDRSTRLEN], maskstr[INET_ADDRSTRLEN];
 #ifdef _ISC
@@ -334,13 +337,14 @@ get_net_ifs(char **addrinfo)
        if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL)
            continue;
 
-       len = snprintf(cp, ailen - (*addrinfo - cp),
-           "%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr);
-       if (len < 0 || len >= ailen - (*addrinfo - cp)) {
+       len = snprintf(cp, ailen, "%s%s/%s",
+           cp == *addrinfo ? "" : " ", addrstr, maskstr);
+       if (len < 0 || (size_t)len >= ailen) {
            sudo_warnx(U_("internal error, %s overflow"), __func__);
            goto done;
        }
        cp += len;
+       ailen -= len;
 
        /* Stash the name of the interface we saved. */
        previfname = ifr->ifr_name;
index 8241f13..f8f4654 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 2008, 2010-2018, 2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2008, 2010-2018, 2020-2021 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
 # include "compat/stdbool.h"
 #endif /* HAVE_STDBOOL_H */
 
-#include "sudo_compat.h"
-#include "sudo_conf.h"
-#include "sudo_debug.h"
+#include "sudo.h"
 #include "sudo_exec.h"
-#include "sudo_fatal.h"
-#include "sudo_gettext.h"
-#include "sudo_plugin.h"
-#include "sudo_util.h"
+#include "sudo_edit.h"
 
 sudo_dso_public int main(int argc, char *argv[], char *envp[]);
 
@@ -129,20 +124,242 @@ main(int argc, char *argv[], char *envp[])
     _exit(ret);
 }
 
+/*
+ * Destructively parse a string in the format:
+ *  uid:gid:groups,...
+ *
+ * On success, fills in ud and returns true, else false.
+ */
+static bool
+parse_user(char *userstr, struct sudo_cred *cred)
+{
+    char *cp, *ep;
+    const char *errstr;
+    debug_decl(parse_user, SUDO_DEBUG_EDIT);
+
+    /* UID */
+    cp = userstr;
+    if ((ep = strchr(cp, ':')) == NULL) {
+       sudo_warnx(U_("%s: %s"), cp, U_("invalid value"));
+       debug_return_bool(false);
+    }
+    *ep++ = '\0';
+    cred->uid = cred->euid = sudo_strtoid(cp, &errstr);
+    if (errstr != NULL) {
+       sudo_warnx(U_("%s: %s"), cp, errstr);
+       debug_return_bool(false);
+    }
+
+    /* GID */
+    cp = ep;
+    if ((ep = strchr(cp, ':')) == NULL) {
+       sudo_warnx(U_("%s: %s"), cp, U_("invalid value"));
+       debug_return_bool(false);
+    }
+    *ep++ = '\0';
+    cred->gid = cred->egid = sudo_strtoid(cp, &errstr);
+    if (errstr != NULL) {
+       sudo_warnx(U_("%s: %s"), cp, errstr);
+       debug_return_bool(false);
+    }
+
+    /* group vector */
+    cp = ep;
+    cred->ngroups = sudo_parse_gids(cp, NULL, &cred->groups);
+    if (cred->ngroups == -1)
+       debug_return_bool(false);
+
+    debug_return_bool(true);
+}
+
 static int
-sesh_sudoedit(int argc, char *argv[])
+sesh_edit_create_tfiles(int edit_flags, struct sudo_cred *user_cred,
+    struct sudo_cred *run_cred, int argc, char *argv[])
 {
-    int i, oflags_dst, post, ret = SESH_ERR_FAILURE;
-    int fd_src = -1, fd_dst = -1, follow = 0;
-    struct stat sb;
+    int i, fd_src = -1, fd_dst = -1;
     struct timespec times[2];
+    struct stat sb;
+    debug_decl(sesh_edit_create_tfiles, SUDO_DEBUG_EDIT);
+
+    for (i = 0; i < argc - 1; i += 2) {
+       char *path_src = argv[i];
+       const char *path_dst = argv[i + 1];
+
+       /*
+        * Try to open the source file for reading.
+        * If it doesn't exist, we'll create an empty destination file.
+        */
+       fd_src = sudo_edit_open(path_src, O_RDONLY,
+           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, edit_flags, user_cred, run_cred);
+       if (fd_src == -1) {
+           if (errno != ENOENT) {
+               if (errno == ELOOP) {
+                   sudo_warnx(U_("%s: editing symbolic links is not "
+                       "permitted"), path_src);
+               } else if (errno == EISDIR) {
+                   sudo_warnx(U_("%s: editing files in a writable directory "
+                       "is not permitted"), path_src);
+               } else {
+                   sudo_warn("%s", path_src);
+               }
+               goto cleanup;
+           }
+           /* New file, verify parent dir exists and is not writable. */
+           if (!sudo_edit_parent_valid(path_src, edit_flags, user_cred, run_cred))
+               goto cleanup;
+       }
+       if (fd_src == -1) {
+           /* New file. */
+           memset(&sb, 0, sizeof(sb));
+       } else if (fstat(fd_src, &sb) == -1 || !S_ISREG(sb.st_mode)) {
+           sudo_warnx(U_("%s: not a regular file"), path_src);
+           goto cleanup;
+       }
+
+       /*
+        * Create temporary file using O_EXCL to ensure that temporary
+        * files are created by us and that we do not open any symlinks.
+        */
+       fd_dst = open(path_dst, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
+       if (fd_dst == -1) {
+           sudo_warn("%s", path_dst);
+           goto cleanup;
+       }
+
+       if (fd_src != -1) {
+           if (sudo_copy_file(path_src, fd_src, -1, path_dst, fd_dst, -1) == -1)
+               goto cleanup;
+           close(fd_src);
+       }
+
+       /* Make mtime on temp file match src (sb filled in above). */
+       mtim_get(&sb, times[0]);
+       times[1].tv_sec = times[0].tv_sec;
+       times[1].tv_nsec = times[0].tv_nsec;
+       if (futimens(fd_dst, times) == -1) {
+           if (utimensat(AT_FDCWD, path_dst, times, 0) == -1)
+               sudo_warn("%s", path_dst);
+       }
+       close(fd_dst);
+       fd_dst = -1;
+    }
+    debug_return_int(SESH_SUCCESS);
+
+cleanup:
+    /* Remove temporary files. */
+    for (i = 0; i < argc - 1; i += 2)
+       unlink(argv[i + 1]);
+    if (fd_src != -1)
+       close(fd_src);
+    if (fd_dst != -1)
+       close(fd_dst);
+    debug_return_int(SESH_ERR_NO_FILES);
+}
+
+static int
+sesh_edit_copy_tfiles(int edit_flags, struct sudo_cred *user_cred,
+    struct sudo_cred *run_cred, int argc, char *argv[])
+{
+    int i, ret = SESH_SUCCESS;
+    int fd_src = -1, fd_dst = -1;
+    debug_decl(sesh_edit_copy_tfiles, SUDO_DEBUG_EDIT);
+
+    for (i = 0; i < argc - 1; i += 2) {
+       const char *path_src = argv[i];
+       char *path_dst = argv[i + 1];
+       off_t len_src, len_dst;
+       struct stat sb;
+
+       /* Open temporary file for reading. */
+       if (fd_src != -1)
+           close(fd_src);
+       fd_src = open(path_src, O_RDONLY|O_NONBLOCK|O_NOFOLLOW);
+       if (fd_src == -1) {
+           sudo_warn("%s", path_src);
+           ret = SESH_ERR_SOME_FILES;
+           continue;
+       }
+       /* Make sure the temporary file is safe and has the proper owner. */
+       if (!sudo_check_temp_file(fd_src, path_src, run_cred->uid, &sb)) {
+           sudo_warnx(U_("contents of edit session left in %s"), path_src);
+           ret = SESH_ERR_SOME_FILES;
+           continue;
+       }
+       (void) fcntl(fd_src, F_SETFL, fcntl(fd_src, F_GETFL, 0) & ~O_NONBLOCK);
+
+       /* Create destination file. */
+       if (fd_dst != -1)
+           close(fd_dst);
+       fd_dst = sudo_edit_open(path_dst, O_WRONLY|O_CREAT,
+           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, edit_flags, user_cred, run_cred);
+       if (fd_dst == -1) {
+           if (errno == ELOOP) {
+               sudo_warnx(U_("%s: editing symbolic links is not "
+                   "permitted"), path_dst);
+           } else if (errno == EISDIR) {
+               sudo_warnx(U_("%s: editing files in a writable directory "
+                   "is not permitted"), path_dst);
+           } else {
+               sudo_warn("%s", path_dst);
+           }
+           sudo_warnx(U_("contents of edit session left in %s"), path_src);
+           ret = SESH_ERR_SOME_FILES;
+           continue;
+       }
+
+       /* sudo_check_temp_file() filled in sb for us. */
+       len_src = sb.st_size;
+       if (fstat(fd_dst, &sb) != 0) {
+           sudo_warn("%s", path_dst);
+           sudo_warnx(U_("contents of edit session left in %s"), path_src);
+           ret = SESH_ERR_SOME_FILES;
+           continue;
+       }
+       len_dst = sb.st_size;
+
+       if (sudo_copy_file(path_src, fd_src, len_src, path_dst, fd_dst,
+               len_dst) == -1) {
+           sudo_warnx(U_("contents of edit session left in %s"), path_src);
+           ret = SESH_ERR_SOME_FILES;
+           continue;
+       }
+       unlink(path_src);
+    }
+    if (fd_src != -1)
+       close(fd_src);
+    if (fd_dst != -1)
+       close(fd_dst);
+
+    debug_return_int(ret);
+}
+
+static int
+sesh_sudoedit(int argc, char *argv[])
+{
+    int edit_flags, post, ret;
+    struct sudo_cred user_cred, run_cred;
     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 (strcmp(argv[2], "-h") == 0) {
+    if (argv[2] != NULL && strcmp(argv[2], "-h") == 0) {
        argv++;
        argc--;
-       follow = O_NOFOLLOW;
+       CLR(edit_flags, CD_SUDOEDIT_FOLLOW); // -V753
+    }
+
+    /* Check for -w flag (disallow directories writable by the user). */
+    if (argv[2] != NULL && 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)
@@ -173,109 +390,35 @@ sesh_sudoedit(int argc, char *argv[])
     if (argc & 1)
        debug_return_int(SESH_ERR_BAD_PATHS);
 
+    /* Masquerade as sudoedit so the user gets consistent error messages. */
+    setprogname("sudoedit");
+
     /*
-     * Use O_EXCL if we are not in the post editing stage
-     * so that it's ensured that the temporary files are
-     * created by us and that we are not opening any symlinks.
+     * sudoedit runs us with the effective user-ID and group-ID of
+     * the target user as well as with the target user's group list.
      */
-    oflags_dst = O_WRONLY|O_CREAT|(post ? follow : O_EXCL);
-    for (i = 0; i < argc - 1; i += 2) {
-       const char *path_src = argv[i];
-       const char *path_dst = argv[i + 1];
-       /*
-        * Try to open the source file for reading. If it
-        * doesn't exist, that's OK, we'll create an empty
-        * destination file.
-        */
-       if ((fd_src = open(path_src, O_RDONLY|follow, S_IRUSR|S_IWUSR)) < 0) {
-           if (errno != ENOENT) {
-               sudo_warn("%s", path_src);
-               if (post) {
-                   ret = SESH_ERR_SOME_FILES;
-                   goto nocleanup;
-               } else
-                   goto cleanup_0;
-           }
-       }
-
-       if ((fd_dst = open(path_dst, oflags_dst, post ?
-           (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) : (S_IRUSR|S_IWUSR))) < 0) {
-           /* error - cleanup */
-           sudo_warn("%s", path_dst);
-           if (post) {
-               ret = SESH_ERR_SOME_FILES;
-               goto nocleanup;
-           } else
-               goto cleanup_0;
-       }
-
-       if (fd_src != -1) {
-           off_t len_src = -1;
-           off_t len_dst = -1;
-
-           if (post) {
-               if (fstat(fd_src, &sb) != 0) {
-                   ret = SESH_ERR_SOME_FILES;
-                   goto nocleanup;
-               }
-               len_src = sb.st_size;
-               if (fstat(fd_dst, &sb) != 0) {
-                   ret = SESH_ERR_SOME_FILES;
-                   goto nocleanup;
-               }
-               len_dst = sb.st_size;
-           }
-
-           if (sudo_copy_file(path_src, fd_src, len_src, path_dst, fd_dst,
-                   len_dst) == -1) {
-               if (post) {
-                   ret = SESH_ERR_SOME_FILES;
-                   goto nocleanup;
-               } else {
-                   goto cleanup_0;
-               }
-           }
+    run_cred.uid = run_cred.euid = geteuid();
+    run_cred.gid = run_cred.egid = getegid();
+    run_cred.ngroups = getgroups(0, NULL); // -V575
+    if (run_cred.ngroups > 0) {
+       run_cred.groups = reallocarray(NULL, run_cred.ngroups,
+           sizeof(GETGROUPS_T));
+       if (run_cred.groups == NULL) {
+           sudo_warnx(U_("%s: %s"), __func__,
+               U_("unable to allocate memory"));
+           debug_return_int(SESH_ERR_FAILURE);
        }
-
-       if (!post) {
-           if (fd_src == -1 || fstat(fd_src, &sb) != 0)
-               memset(&sb, 0, sizeof(sb));
-           /* Make mtime on temp file match src. */
-           mtim_get(&sb, times[0]);
-           times[1].tv_sec = times[0].tv_sec;
-           times[1].tv_nsec = times[0].tv_nsec;
-           if (futimens(fd_dst, times) == -1) {
-               if (utimensat(AT_FDCWD, path_dst, times, 0) == -1)
-                   sudo_warn("%s", path_dst);
-           }
-       }
-       close(fd_dst);
-       fd_dst = -1;
-       if (fd_src != -1) {
-           close(fd_src);
-           fd_src = -1;
+       if (getgroups(run_cred.ngroups, run_cred.groups) < 0) {
+           sudo_warn("%s", U_("unable to get group list"));
+           debug_return_int(SESH_ERR_FAILURE);
        }
+    } else {
+       run_cred.ngroups = 0;
+       run_cred.groups = NULL;
     }
 
-    ret = SESH_SUCCESS;
-    if (post) {
-       /* Remove temporary files (post=1) */
-       for (i = 0; i < argc - 1; i += 2)
-           unlink(argv[i]);
-    }
-nocleanup:
-    if (fd_dst != -1)
-       close(fd_dst);
-    if (fd_src != -1)
-       close(fd_src);
-    return(ret);
-cleanup_0:
-    /* Remove temporary files (post=0) */
-    for (i = 0; i < argc - 1; i += 2)
-       unlink(argv[i + 1]);
-    if (fd_dst != -1)
-       close(fd_dst);
-    if (fd_src != -1)
-       close(fd_src);
-    return(SESH_ERR_NO_FILES);
+    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);
+    debug_return_int(ret);
 }
index 9d60e1b..4c6c60e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 2009-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2021 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
@@ -152,12 +152,14 @@ main(int argc, char *argv[], char *envp[])
     int nargc, status = 0;
     char **nargv, **env_add, **user_info;
     char **command_info = NULL, **argv_out = NULL, **user_env_out = NULL;
+    const char * const allowed_prognames[] = { "sudo", "sudoedit", NULL };
     struct sudo_settings *settings;
     int submit_optind;
     sigset_t mask;
     debug_decl_vars(main, SUDO_DEBUG_MAIN);
 
-    initprogname(argc > 0 ? argv[0] : "sudo");
+    /* Only allow "sudo" or "sudoedit" as the program name. */
+    initprogname2(argc > 0 ? argv[0] : "sudo", allowed_prognames);
 
     /* Crank resource limits to unlimited. */
     unlimit_sudo();
@@ -218,7 +220,7 @@ main(int argc, char *argv[], char *envp[])
     /* Print sudo version early, in case of plugin init failure. */
     if (ISSET(sudo_mode, MODE_VERSION)) {
        printf(_("Sudo version %s\n"), PACKAGE_VERSION);
-       if (user_details.uid == ROOT_UID)
+       if (user_details.cred.uid == ROOT_UID)
            (void) printf(_("Configure options: %s\n"), CONFIGURE_ARGS);
     }
 
@@ -240,12 +242,12 @@ main(int argc, char *argv[], char *envp[])
 
     switch (sudo_mode & MODE_MASK) {
        case MODE_VERSION:
-           policy_show_version(!user_details.uid);
-           iolog_show_version(!user_details.uid, settings, user_info,
+           policy_show_version(!user_details.cred.uid);
+           iolog_show_version(!user_details.cred.uid, settings, user_info,
                nargc, nargv, envp);
-           approval_show_version(!user_details.uid, settings, user_info,
+           approval_show_version(!user_details.cred.uid, settings, user_info,
                submit_optind, argv, envp);
-           audit_show_version(!user_details.uid);
+           audit_show_version(!user_details.cred.uid);
            break;
        case MODE_VALIDATE:
        case MODE_VALIDATE|MODE_INVALIDATE:
@@ -381,7 +383,7 @@ fix_fds(void)
  * Returns 0 on success and -1 on failure.
  */
 static int
-fill_group_list(struct user_details *ud)
+fill_group_list(const char *user, struct sudo_cred *cred)
 {
     int ret = -1;
     debug_decl(fill_group_list, SUDO_DEBUG_UTIL);
@@ -390,41 +392,41 @@ fill_group_list(struct user_details *ud)
      * If user specified a max number of groups, use it, otherwise let
      * sudo_getgrouplist2() allocate the group vector.
      */
-    ud->ngroups = sudo_conf_max_groups();
-    if (ud->ngroups > 0) {
-       ud->groups = reallocarray(NULL, ud->ngroups, sizeof(GETGROUPS_T));
-       if (ud->groups != NULL) {
+    cred->ngroups = sudo_conf_max_groups();
+    if (cred->ngroups > 0) {
+       cred->groups = reallocarray(NULL, cred->ngroups, sizeof(GETGROUPS_T));
+       if (cred->groups != NULL) {
            /* No error on insufficient space if user specified max_groups. */
-           (void)sudo_getgrouplist2(ud->username, ud->gid, &ud->groups,
-               &ud->ngroups);
+           (void)sudo_getgrouplist2(user, cred->gid,
+               &cred->groups, &cred->ngroups);
            ret = 0;
        }
     } else {
-       ud->groups = NULL;
-       ret = sudo_getgrouplist2(ud->username, ud->gid, &ud->groups,
-           &ud->ngroups);
+       cred->groups = NULL;
+       ret = sudo_getgrouplist2(user, cred->gid, &cred->groups,
+           &cred->ngroups);
     }
     if (ret == -1) {
        sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
            "%s: %s: unable to get groups via sudo_getgrouplist2()",
-           __func__, ud->username);
+           __func__, user);
     } else {
        sudo_debug_printf(SUDO_DEBUG_INFO,
            "%s: %s: got %d groups via sudo_getgrouplist2()",
-           __func__, ud->username, ud->ngroups);
+           __func__, user, cred->ngroups);
     }
     debug_return_int(ret);
 }
 
 static char *
-get_user_groups(struct user_details *ud)
+get_user_groups(const char *user, struct sudo_cred *cred)
 {
     char *cp, *gid_list = NULL;
     size_t glsize;
     int i, len, group_source;
     debug_decl(get_user_groups, SUDO_DEBUG_UTIL);
 
-    ud->groups = NULL;
+    cred->groups = NULL;
     group_source = sudo_conf_group_source();
     if (group_source != GROUP_SOURCE_DYNAMIC) {
        int maxgroups = (int)sysconf(_SC_NGROUPS_MAX);
@@ -432,46 +434,47 @@ get_user_groups(struct user_details *ud)
            maxgroups = NGROUPS_MAX;
 
        /* Note that macOS may return ngroups > NGROUPS_MAX. */
-       if ((ud->ngroups = getgroups(0, NULL)) > 0) {
+       cred->ngroups = getgroups(0, NULL); // -V575
+       if (cred->ngroups > 0) {
            /* Use groups from kernel if not at limit or source is static. */
-           if (ud->ngroups != maxgroups || group_source == GROUP_SOURCE_STATIC) {
-               ud->groups = reallocarray(NULL, ud->ngroups, sizeof(GETGROUPS_T));
-               if (ud->groups == NULL)
+           if (cred->ngroups != maxgroups || group_source == GROUP_SOURCE_STATIC) {
+               cred->groups = reallocarray(NULL, cred->ngroups, sizeof(GETGROUPS_T));
+               if (cred->groups == NULL)
                    goto done;
-               if (getgroups(ud->ngroups, ud->groups) < 0) {
+               if (getgroups(cred->ngroups, cred->groups) < 0) {
                    sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
-                       "%s: %s: unable to get %d groups via getgroups()",
-                       __func__, ud->username, ud->ngroups);
-                   free(ud->groups);
-                   ud->groups = NULL;
+                       "%s: unable to get %d groups via getgroups()",
+                       __func__, cred->ngroups);
+                   free(cred->groups);
+                   cred->groups = NULL;
                } else {
                    sudo_debug_printf(SUDO_DEBUG_INFO,
-                       "%s: %s: got %d groups via getgroups()",
-                       __func__, ud->username, ud->ngroups);
+                       "%s: got %d groups via getgroups()",
+                       __func__, cred->ngroups);
                }
            }
        }
     }
-    if (ud->groups == NULL) {
+    if (cred->groups == NULL) {
        /*
         * Query group database if kernel list is too small or disabled.
         * Typically, this is because NFS can only support up to 16 groups.
         */
-       if (fill_group_list(ud) == -1)
+       if (fill_group_list(user, cred) == -1)
            goto done;
     }
 
     /*
      * Format group list as a comma-separated string of gids.
      */
-    glsize = sizeof("groups=") - 1 + (ud->ngroups * (MAX_UID_T_LEN + 1));
+    glsize = sizeof("groups=") - 1 + (cred->ngroups * (MAX_UID_T_LEN + 1));
     if ((gid_list = malloc(glsize)) == NULL)
        goto done;
     memcpy(gid_list, "groups=", sizeof("groups=") - 1);
     cp = gid_list + sizeof("groups=") - 1;
-    for (i = 0; i < ud->ngroups; i++) {
+    for (i = 0; i < cred->ngroups; i++) {
        len = snprintf(cp, glsize - (cp - gid_list), "%s%u",
-           i ? "," : "", (unsigned int)ud->groups[i]);
+           i ? "," : "", (unsigned int)cred->groups[i]);
        if (len < 0 || (size_t)len >= glsize - (cp - gid_list))
            sudo_fatalx(U_("internal error, %s overflow"), __func__);
        cp += len;
@@ -527,15 +530,15 @@ get_user_info(struct user_details *ud)
     if ((ud->sid = getsid(0)) == -1)
        ud->sid = 0;
 
-    ud->uid = getuid();
-    ud->euid = geteuid();
-    ud->gid = getgid();
-    ud->egid = getegid();
+    ud->cred.uid = getuid();
+    ud->cred.euid = geteuid();
+    ud->cred.gid = getgid();
+    ud->cred.egid = getegid();
 
 #ifdef HAVE_SETAUTHDB
-    aix_setauthdb(IDtouser(ud->uid), NULL);
+    aix_setauthdb(IDtouser(ud->cred.uid), NULL);
 #endif
-    pw = getpwuid(ud->uid);
+    pw = getpwuid(ud->cred.uid);
 #ifdef HAVE_SETAUTHDB
     aix_restoreauthdb();
 #endif
@@ -564,16 +567,16 @@ get_user_info(struct user_details *ud)
        goto oom;
     if (asprintf(&user_info[++i], "sid=%d", (int)ud->sid) == -1)
        goto oom;
-    if (asprintf(&user_info[++i], "uid=%u", (unsigned int)ud->uid) == -1)
+    if (asprintf(&user_info[++i], "uid=%u", (unsigned int)ud->cred.uid) == -1)
        goto oom;
-    if (asprintf(&user_info[++i], "euid=%u", (unsigned int)ud->euid) == -1)
+    if (asprintf(&user_info[++i], "euid=%u", (unsigned int)ud->cred.euid) == -1)
        goto oom;
-    if (asprintf(&user_info[++i], "gid=%u", (unsigned int)ud->gid) == -1)
+    if (asprintf(&user_info[++i], "gid=%u", (unsigned int)ud->cred.gid) == -1)
        goto oom;
-    if (asprintf(&user_info[++i], "egid=%u", (unsigned int)ud->egid) == -1)
+    if (asprintf(&user_info[++i], "egid=%u", (unsigned int)ud->cred.egid) == -1)
        goto oom;
 
-    if ((cp = get_user_groups(ud)) == NULL)
+    if ((cp = get_user_groups(ud->username, &ud->cred)) == NULL)
        goto oom;
     user_info[++i] = cp;
 
@@ -747,7 +750,7 @@ command_info_to_details(char * const info[], struct command_details *details)
                    id = sudo_strtoid(cp, &errstr);
                    if (errstr != NULL)
                        sudo_fatalx(U_("%s: %s"), info[i], U_(errstr));
-                   details->egid = (gid_t)id;
+                   details->cred.egid = (gid_t)id;
                    SET(details->flags, CD_SET_EGID);
                    break;
                }
@@ -756,7 +759,7 @@ command_info_to_details(char * const info[], struct command_details *details)
                    id = sudo_strtoid(cp, &errstr);
                    if (errstr != NULL)
                        sudo_fatalx(U_("%s: %s"), info[i], U_(errstr));
-                   details->euid = (uid_t)id;
+                   details->cred.euid = (uid_t)id;
                    SET(details->flags, CD_SET_EUID);
                    break;
                }
@@ -765,15 +768,15 @@ command_info_to_details(char * const info[], struct command_details *details)
                    id = sudo_strtoid(cp, &errstr);
                    if (errstr != NULL)
                        sudo_fatalx(U_("%s: %s"), info[i], U_(errstr));
-                   details->gid = (gid_t)id;
+                   details->cred.gid = (gid_t)id;
                    SET(details->flags, CD_SET_GID);
                    break;
                }
                if (strncmp("runas_groups=", info[i], sizeof("runas_groups=") - 1) == 0) {
                    cp = info[i] + sizeof("runas_groups=") - 1;
-                   details->ngroups = sudo_parse_gids(cp, NULL, &details->groups);
+                   details->cred.ngroups = sudo_parse_gids(cp, NULL, &details->cred.groups);
                    /* sudo_parse_gids() will print a warning on error. */
-                   if (details->ngroups == -1)
+                   if (details->cred.ngroups == -1)
                        exit(EXIT_FAILURE); /* XXX */
                    break;
                }
@@ -782,7 +785,7 @@ command_info_to_details(char * const info[], struct command_details *details)
                    id = sudo_strtoid(cp, &errstr);
                    if (errstr != NULL)
                        sudo_fatalx(U_("%s: %s"), info[i], U_(errstr));
-                   details->uid = (uid_t)id;
+                   details->cred.uid = (uid_t)id;
                    SET(details->flags, CD_SET_UID);
                    break;
                }
@@ -845,19 +848,19 @@ command_info_to_details(char * const info[], struct command_details *details)
     }
 
     if (!ISSET(details->flags, CD_SET_EUID))
-       details->euid = details->uid;
+       details->cred.euid = details->cred.uid;
     if (!ISSET(details->flags, CD_SET_EGID))
-       details->egid = details->gid;
+       details->cred.egid = details->cred.gid;
     if (!ISSET(details->flags, CD_SET_UMASK))
        CLR(details->flags, CD_OVERRIDE_UMASK);
 
 #ifdef HAVE_SETAUTHDB
-    aix_setauthdb(IDtouser(details->euid), NULL);
+    aix_setauthdb(IDtouser(details->cred.euid), NULL);
 #endif
     if (details->runas_user != NULL)
        details->pw = getpwnam(details->runas_user);
     if (details->pw == NULL)
-       details->pw = getpwuid(details->euid);
+       details->pw = getpwuid(details->cred.euid);
 #ifdef HAVE_SETAUTHDB
     aix_restoreauthdb();
 #endif
@@ -931,23 +934,23 @@ set_user_groups(struct command_details *details)
     debug_decl(set_user_groups, SUDO_DEBUG_EXEC);
 
     if (!ISSET(details->flags, CD_PRESERVE_GROUPS)) {
-       if (details->ngroups >= 0) {
-           if (sudo_setgroups(details->ngroups, details->groups) < 0) {
+       if (details->cred.ngroups >= 0) {
+           if (sudo_setgroups(details->cred.ngroups, details->cred.groups) < 0) {
                sudo_warn("%s", U_("unable to set supplementary group IDs"));
                goto done;
            }
        }
     }
 #ifdef HAVE_SETEUID
-    if (ISSET(details->flags, CD_SET_EGID) && setegid(details->egid)) {
+    if (ISSET(details->flags, CD_SET_EGID) && setegid(details->cred.egid)) {
        sudo_warn(U_("unable to set effective gid to runas gid %u"),
-           (unsigned int)details->egid);
+           (unsigned int)details->cred.egid);
        goto done;
     }
 #endif
-    if (ISSET(details->flags, CD_SET_GID) && setgid(details->gid)) {
+    if (ISSET(details->flags, CD_SET_GID) && setgid(details->cred.gid)) {
        sudo_warn(U_("unable to set gid to runas gid %u"),
-           (unsigned int)details->gid);
+           (unsigned int)details->cred.gid);
        goto done;
     }
     ret = true;
index 06f47c5..7f48ece 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 1993-1996, 1998-2005, 2007-2016
+ * Copyright (c) 1993-1996, 1998-2005, 2007-2021
  *     Todd C. Miller <Todd.Miller@sudo.ws>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -92,23 +92,28 @@ struct sudo_settings {
     const char *value;
 };
 
+/* Sudo user credentials */
+struct sudo_cred {
+    uid_t uid;
+    uid_t euid;
+    uid_t gid;
+    uid_t egid;
+    int ngroups;
+    GETGROUPS_T *groups;
+};
+
 struct user_details {
+    struct sudo_cred cred;
     pid_t pid;
     pid_t ppid;
     pid_t pgid;
     pid_t tcpgid;
     pid_t sid;
-    uid_t uid;
-    uid_t euid;
-    uid_t gid;
-    uid_t egid;
     const char *username;
     const char *cwd;
     const char *tty;
     const char *host;
     const char *shell;
-    GETGROUPS_T *groups;
-    int ngroups;
     int ts_rows;
     int ts_cols;
 };
@@ -143,21 +148,16 @@ struct preserved_fd {
 TAILQ_HEAD(preserved_fd_list, preserved_fd);
 
 struct command_details {
-    uid_t uid;
-    uid_t euid;
-    gid_t gid;
-    gid_t egid;
+    struct sudo_cred cred;
     mode_t umask;
     int priority;
     int timeout;
-    int ngroups;
     int closefrom;
     int flags;
     int execfd;
     int cwd_optional;
     struct preserved_fd_list preserved_fds;
     struct passwd *pw;
-    GETGROUPS_T *groups;
     const char *command;
     const char *runas_user;
     const char *cwd;
index 82e04a7..842eca3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 2004-2008, 2010-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2004-2008, 2010-2021 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
@@ -31,7 +31,6 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
-#include <ctype.h>
 #include <errno.h>
 #include <grp.h>
 #include <pwd.h>
@@ -39,6 +38,7 @@
 #include <fcntl.h>
 
 #include "sudo.h"
+#include "sudo_edit.h"
 #include "sudo_exec.h"
 
 #if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID)
@@ -55,152 +55,12 @@ struct tempfile {
 
 static char edit_tmpdir[MAX(sizeof(_PATH_VARTMP), sizeof(_PATH_TMP))];
 
-static void
-switch_user(uid_t euid, gid_t egid, int ngroups, GETGROUPS_T *groups)
-{
-    int serrno = errno;
-    debug_decl(switch_user, SUDO_DEBUG_EDIT);
-
-    sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-       "set uid:gid to %u:%u(%u)", (unsigned int)euid, (unsigned int)egid,
-       ngroups ? (unsigned int)groups[0] : (unsigned int)egid);
-
-    /* When restoring root, change euid first; otherwise change it last. */
-    if (euid == ROOT_UID) {
-       if (seteuid(ROOT_UID) != 0)
-           sudo_fatal("seteuid(ROOT_UID)");
-    }
-    if (setegid(egid) != 0)
-       sudo_fatal("setegid(%d)", (int)egid);
-    if (ngroups != -1) {
-       if (sudo_setgroups(ngroups, groups) != 0)
-           sudo_fatal("setgroups");
-    }
-    if (euid != ROOT_UID) {
-       if (seteuid(euid) != 0)
-           sudo_fatal("seteuid(%u)", (unsigned int)euid);
-    }
-    errno = serrno;
-
-    debug_return;
-}
-
-#if defined(HAVE_FACCESSAT) && defined(AT_EACCESS)
-/*
- * Returns true if the open directory fd is owned or writable by the user.
- */
-static int
-dir_is_writable(int dfd, struct user_details *ud, struct command_details *cd)
-{
-    struct stat sb;
-    int rc;
-    debug_decl(dir_is_writable, SUDO_DEBUG_EDIT);
-
-    if (fstat(dfd, &sb) == -1)
-       debug_return_int(-1);
-
-    /* If the user owns the dir we always consider it writable. */
-    if (sb.st_uid == ud->uid) {
-       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-           "user uid %u matches directory uid %u", (unsigned int)ud->uid,
-           (unsigned int)sb.st_uid);
-       debug_return_int(true);
-    }
-
-    /* Change uid/gid/groups to invoking user, usually needs root perms. */
-    if (cd->euid != ROOT_UID) {
-       if (seteuid(ROOT_UID) != 0)
-           sudo_fatal("seteuid(ROOT_UID)");
-    }
-    switch_user(ud->uid, ud->gid, ud->ngroups, ud->groups);
-
-    /* Access checks are done using the euid/egid and group vector. */
-    rc = faccessat(dfd, ".", W_OK, AT_EACCESS);
-
-    /* Change uid/gid/groups back to target user, may need root perms. */
-    if (ud->uid != ROOT_UID) {
-       if (seteuid(ROOT_UID) != 0)
-           sudo_fatal("seteuid(ROOT_UID)");
-    }
-    switch_user(cd->euid, cd->egid, cd->ngroups, cd->groups);
-
-    if (rc == 0)
-       debug_return_int(true);
-    if (errno == EACCES || errno == EROFS)
-       debug_return_int(false);
-    debug_return_int(-1);
-}
-#else
-static bool
-group_matches(gid_t target, gid_t gid, int ngroups, GETGROUPS_T *groups)
-{
-    int i;
-    debug_decl(group_matches, SUDO_DEBUG_EDIT);
-
-    if (target == gid) {
-       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-           "user gid %u matches directory gid %u", (unsigned int)gid,
-           (unsigned int)target);
-       debug_return_bool(true);
-    }
-    for (i = 0; i < ngroups; i++) {
-       if (target == groups[i]) {
-           sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-               "user gid %u matches directory gid %u", (unsigned int)gid,
-               (unsigned int)target);
-           debug_return_bool(true);
-       }
-    }
-    debug_return_bool(false);
-}
-
-/*
- * Returns true if the open directory fd is owned or writable by the user.
- */
-static int
-dir_is_writable(int dfd, struct user_details *ud, struct command_details *cd)
-{
-    struct stat sb;
-    debug_decl(dir_is_writable, SUDO_DEBUG_EDIT);
-
-    if (fstat(dfd, &sb) == -1)
-       debug_return_int(-1);
-
-    /* If the user owns the dir we always consider it writable. */
-    if (sb.st_uid == ud->uid) {
-       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-           "user uid %u matches directory uid %u", (unsigned int)ud->uid,
-           (unsigned int)sb.st_uid);
-       debug_return_int(true);
-    }
-
-    /* Other writable? */
-    if (ISSET(sb.st_mode, S_IWOTH)) {
-       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-           "directory is writable by other");
-       debug_return_int(true);
-    }
-
-    /* Group writable? */
-    if (ISSET(sb.st_mode, S_IWGRP)) {
-       if (group_matches(sb.st_gid, ud->gid, ud->ngroups, ud->groups)) {
-           sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-               "directory is writable by one of the user's groups");
-           debug_return_int(true);
-       }
-    }
-
-    errno = EACCES;
-    debug_return_int(false);
-}
-#endif /* HAVE_FACCESSAT && AT_EACCESS */
-
 /*
  * Find our temporary directory, one of /var/tmp, /usr/tmp, or /tmp
  * Returns true on success, else false;
  */
 static bool
-set_tmpdir(struct command_details *command_details)
+set_tmpdir(struct sudo_cred *user_cred)
 {
     const char *tdir = NULL;
     const char *tmpdirs[] = {
@@ -210,21 +70,49 @@ set_tmpdir(struct command_details *command_details)
 #endif
        _PATH_TMP
     };
+    struct sudo_cred saved_cred;
     unsigned int i;
     size_t len;
     int dfd;
     debug_decl(set_tmpdir, SUDO_DEBUG_EDIT);
 
+    /* Stash old credentials. */
+    saved_cred.uid = getuid();
+    saved_cred.euid = geteuid();
+    saved_cred.gid = getgid();
+    saved_cred.egid = getegid();
+    saved_cred.ngroups = getgroups(0, NULL); // -V575
+    if (saved_cred.ngroups > 0) {
+       saved_cred.groups =
+           reallocarray(NULL, saved_cred.ngroups, sizeof(GETGROUPS_T));
+       if (saved_cred.groups == NULL) {
+           sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+           debug_return_bool(false);
+       }
+       if (getgroups(saved_cred.ngroups, saved_cred.groups) < 0) {
+           sudo_warn("%s", U_("unable to get group list"));
+           free(saved_cred.groups);
+           debug_return_bool(false);
+       }
+    } else {
+       saved_cred.ngroups = 0;
+       saved_cred.groups = NULL;
+    }
+
     for (i = 0; tdir == NULL && i < nitems(tmpdirs); i++) {
        if ((dfd = open(tmpdirs[i], O_RDONLY)) != -1) {
-           if (dir_is_writable(dfd, &user_details, command_details) == true)
+           if (dir_is_writable(dfd, user_cred, &saved_cred) == true)
                tdir = tmpdirs[i];
            close(dfd);
        }
     }
-    if (tdir == NULL)
-       sudo_fatalx("%s", U_("no writable temporary directory found"));
-   
+    free(saved_cred.groups);
+
+    if (tdir == NULL) {
+       sudo_warnx("%s", U_("no writable temporary directory found"));
+       debug_return_bool(false);
+    }
+
     len = strlcpy(edit_tmpdir, tdir, sizeof(edit_tmpdir));
     if (len >= sizeof(edit_tmpdir)) {
        errno = ENAMETOOLONG;
@@ -259,261 +147,16 @@ sudo_edit_mktemp(const char *ofile, char **tfile)
     } else {
        len = asprintf(tfile, "%s/%s.XXXXXXXX", edit_tmpdir, cp);
     }
-    if (len == -1)
-       sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+    if (len == -1) {
+       sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+       debug_return_int(-1);
+    }
     tfd = mkstemps(*tfile, suff ? strlen(suff) : 0);
     sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
        "%s -> %s, fd %d", ofile, *tfile, tfd);
     debug_return_int(tfd);
 }
 
-#ifdef O_NOFOLLOW
-static int
-sudo_edit_openat_nofollow(int dfd, char *path, int oflags, mode_t mode)
-{
-    debug_decl(sudo_edit_openat_nofollow, SUDO_DEBUG_EDIT);
-
-    debug_return_int(openat(dfd, path, oflags|O_NOFOLLOW, mode));
-}
-#else
-/*
- * Returns true if fd and path don't match or path is a symlink.
- * Used on older systems without O_NOFOLLOW.
- */
-static bool
-sudo_edit_is_symlink(int fd, char *path)
-{
-    struct stat sb1, sb2;
-    debug_decl(sudo_edit_is_symlink, SUDO_DEBUG_EDIT);
-
-    /*
-     * Treat [fl]stat() failure like there was a symlink.
-     */
-    if (fstat(fd, &sb1) == -1 || lstat(path, &sb2) == -1)
-       debug_return_bool(true);
-
-    /*
-     * Make sure we did not open a link and that what we opened
-     * matches what is currently on the file system.
-     */
-    if (S_ISLNK(sb2.st_mode) ||
-       sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) {
-       debug_return_bool(true);
-    }
-
-    debug_return_bool(false);
-}
-
-static int
-sudo_edit_openat_nofollow(int dfd, char *path, int oflags, mode_t mode)
-{
-    int fd = -1, odfd = -1;
-    struct stat sb;
-    debug_decl(sudo_edit_openat_nofollow, SUDO_DEBUG_EDIT);
-
-    /* Save cwd and chdir to dfd */
-    if ((odfd = open(".", O_RDONLY)) == -1)
-       debug_return_int(-1);
-    if (fchdir(dfd) == -1) {
-       close(odfd);
-       debug_return_int(-1);
-    }
-
-    /*
-     * Check if path is a symlink.  This is racey but we detect whether
-     * we lost the race in sudo_edit_is_symlink() after the open.
-     */
-    if (lstat(path, &sb) == -1 && errno != ENOENT)
-       goto done;
-    if (S_ISLNK(sb.st_mode)) {
-       errno = ELOOP;
-       goto done;
-    }
-
-    fd = open(path, oflags, mode);
-    if (fd == -1)
-       goto done;
-
-    /*
-     * Post-open symlink check.  This will leave a zero-length file if
-     * O_CREAT was specified but it is too dangerous to try and remove it.
-     */
-    if (sudo_edit_is_symlink(fd, path)) {
-       close(fd);
-       fd = -1;
-       errno = ELOOP;
-    }
-
-done:
-    /* Restore cwd */
-    if (odfd != -1) {
-       if (fchdir(odfd) == -1)
-           sudo_fatal("%s", U_("unable to restore current working directory"));
-       close(odfd);
-    }
-
-    debug_return_int(fd);
-}
-#endif /* O_NOFOLLOW */
-
-/*
- * Directory open flags for use with openat(2).
- * Use O_SEARCH/O_PATH and/or O_DIRECTORY where possible.
- */
-#if defined(O_SEARCH)
-# if defined(O_DIRECTORY)
-#  define DIR_OPEN_FLAGS       (O_SEARCH|O_DIRECTORY)
-# else
-#  define DIR_OPEN_FLAGS       (O_SEARCH)
-# endif
-#elif defined(O_PATH)
-# if defined(O_DIRECTORY)
-#  define DIR_OPEN_FLAGS       (O_PATH|O_DIRECTORY)
-# else
-#  define DIR_OPEN_FLAGS       (O_PATH)
-# endif
-#elif defined(O_DIRECTORY)
-# define DIR_OPEN_FLAGS                (O_RDONLY|O_DIRECTORY)
-#else
-# define DIR_OPEN_FLAGS                (O_RDONLY|O_NONBLOCK)
-#endif
-
-static int
-sudo_edit_open_nonwritable(char *path, int oflags, mode_t mode,
-    struct command_details *command_details)
-{
-    const int dflags = DIR_OPEN_FLAGS;
-    int dfd, fd, is_writable;
-    debug_decl(sudo_edit_open_nonwritable, SUDO_DEBUG_EDIT);
-
-    if (path[0] == '/') {
-       dfd = open("/", dflags);
-       path++;
-    } else {
-       dfd = open(".", dflags);
-       if (path[0] == '.' && path[1] == '/')
-           path += 2;
-    }
-    if (dfd == -1)
-       debug_return_int(-1);
-
-    for (;;) {
-       char *slash;
-       int subdfd;
-
-       /*
-        * Look up one component at a time, avoiding symbolic links in
-        * writable directories.
-        */
-       is_writable = dir_is_writable(dfd, &user_details, command_details);
-       if (is_writable == -1) {
-           close(dfd);
-           debug_return_int(-1);
-       }
-
-       while (path[0] == '/')
-           path++;
-       slash = strchr(path, '/');
-       if (slash == NULL)
-           break;
-       *slash = '\0';
-       if (is_writable)
-           subdfd = sudo_edit_openat_nofollow(dfd, path, dflags, 0);
-       else
-           subdfd = openat(dfd, path, dflags, 0);
-       *slash = '/';                   /* restore path */
-       close(dfd);
-       if (subdfd == -1)
-           debug_return_int(-1);
-       path = slash + 1;
-       dfd = subdfd;
-    }
-
-    if (is_writable) {
-       close(dfd);
-       errno = EISDIR;
-       debug_return_int(-1);
-    }
-
-    /*
-     * For "sudoedit /" we will receive ENOENT from openat() and sudoedit
-     * will try to create a file with an empty name.  We treat an empty
-     * path as the cwd so sudoedit can give a sensible error message.
-     */
-    fd = openat(dfd, *path ? path : ".", oflags, mode);
-    close(dfd);
-    debug_return_int(fd);
-}
-
-#ifdef O_NOFOLLOW
-static int
-sudo_edit_open(char *path, int oflags, mode_t mode,
-    struct command_details *command_details)
-{
-    const int sflags = command_details ? command_details->flags : 0;
-    int fd;
-    debug_decl(sudo_edit_open, SUDO_DEBUG_EDIT);
-
-    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW))
-       oflags |= O_NOFOLLOW;
-    if (ISSET(sflags, CD_SUDOEDIT_CHECKDIR) && user_details.uid != ROOT_UID) {
-       fd = sudo_edit_open_nonwritable(path, oflags|O_NONBLOCK, mode,
-           command_details);
-    } else {
-       fd = open(path, oflags|O_NONBLOCK, mode);
-    }
-    if (fd != -1 && !ISSET(oflags, O_NONBLOCK))
-       (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
-    debug_return_int(fd);
-}
-#else
-static int
-sudo_edit_open(char *path, int oflags, mode_t mode,
-    struct command_details *command_details)
-{
-    const int sflags = command_details ? command_details->flags : 0;
-    struct stat sb;
-    int fd;
-    debug_decl(sudo_edit_open, SUDO_DEBUG_EDIT);
-
-    /*
-     * Check if path is a symlink.  This is racey but we detect whether
-     * we lost the race in sudo_edit_is_symlink() after the file is opened.
-     */
-    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW)) {
-       if (lstat(path, &sb) == -1 && errno != ENOENT)
-           debug_return_int(-1);
-       if (S_ISLNK(sb.st_mode)) {
-           errno = ELOOP;
-           debug_return_int(-1);
-       }
-    }
-
-    if (ISSET(sflags, CD_SUDOEDIT_CHECKDIR) && user_details.uid != ROOT_UID) {
-       fd = sudo_edit_open_nonwritable(path, oflags|O_NONBLOCK, mode,
-           command_details);
-    } else {
-       fd = open(path, oflags|O_NONBLOCK, mode);
-    }
-    if (fd == -1)
-       debug_return_int(-1);
-    if (!ISSET(oflags, O_NONBLOCK))
-       (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
-
-    /*
-     * Post-open symlink check.  This will leave a zero-length file if
-     * O_CREAT was specified but it is too dangerous to try and remove it.
-     */
-    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW) && sudo_edit_is_symlink(fd, path)) {
-       close(fd);
-       fd = -1;
-       errno = ELOOP;
-    }
-
-    debug_return_int(fd);
-}
-#endif /* O_NOFOLLOW */
-
 /*
  * Create temporary copies of files[] and store the temporary path name
  * along with the original name, size and mtime in tf.
@@ -535,33 +178,23 @@ sudo_edit_create_tfiles(struct command_details *command_details,
      */
     for (i = 0, j = 0; i < nfiles; i++) {
        rc = -1;
-       switch_user(command_details->euid, command_details->egid,
-           command_details->ngroups, command_details->groups);
+       switch_user(command_details->cred.euid, command_details->cred.egid,
+           command_details->cred.ngroups, command_details->cred.groups);
        ofd = sudo_edit_open(files[i], O_RDONLY,
-           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, command_details);
+           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, command_details->flags,
+           &user_details.cred, &command_details->cred);
        if (ofd != -1 || errno == ENOENT) {
-           if (ofd == -1) {
-               /* New file, verify parent dir exists unless in cwd. */
-               char *slash = strrchr(files[i], '/');
-               if (slash != NULL && slash != files[i]) {
-                   int serrno = errno;
-                   *slash = '\0';
-                   if (stat(files[i], &sb) == 0 && S_ISDIR(sb.st_mode)) {
-                       memset(&sb, 0, sizeof(sb));
-                       rc = 0;
-                   }
-                   *slash = '/';
-                   errno = serrno;
-               } else {
-                   memset(&sb, 0, sizeof(sb));
-                   rc = 0;
-               }
-           } else {
+           if (ofd != -1) {
                rc = fstat(ofd, &sb);
+           } else {
+               /* New file, verify parent dir exists and is not writable. */
+               memset(&sb, 0, sizeof(sb));
+               if (sudo_edit_parent_valid(files[i], command_details->flags, &user_details.cred, &command_details->cred))
+                   rc = 0;
            }
        }
-       switch_user(ROOT_UID, user_details.egid,
-           user_details.ngroups, user_details.groups);
+       switch_user(ROOT_UID, user_details.cred.egid,
+           user_details.cred.ngroups, user_details.cred.groups);
        if (ofd != -1 && !S_ISREG(sb.st_mode)) {
            sudo_warnx(U_("%s: not a regular file"), files[i]);
            close(ofd);
@@ -583,12 +216,12 @@ sudo_edit_create_tfiles(struct command_details *command_details,
            continue;
        }
        tf[j].ofile = files[i];
-       tf[j].osize = sb.st_size;
+       tf[j].osize = sb.st_size; // -V614
        mtim_get(&sb, tf[j].omtim);
        sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-           "seteuid(%u)", (unsigned int)user_details.uid);
-       if (seteuid(user_details.uid) != 0)
-           sudo_fatal("seteuid(%u)", (unsigned int)user_details.uid);
+           "seteuid(%u)", (unsigned int)user_details.cred.uid);
+       if (seteuid(user_details.cred.uid) != 0)
+           sudo_fatal("seteuid(%u)", (unsigned int)user_details.cred.uid);
        tfd = sudo_edit_mktemp(tf[j].ofile, &tf[j].tfile);
        sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
            "seteuid(%u)", ROOT_UID);
@@ -646,24 +279,17 @@ sudo_edit_copy_tfiles(struct command_details *command_details,
 
     /* Copy contents of temp files to real ones. */
     for (i = 0; i < nfiles; i++) {
-       int rc = -1;
        sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-           "seteuid(%u)", (unsigned int)user_details.uid);
-       if (seteuid(user_details.uid) != 0)
-           sudo_fatal("seteuid(%u)", (unsigned int)user_details.uid);
+           "seteuid(%u)", (unsigned int)user_details.cred.uid);
+       if (seteuid(user_details.cred.uid) != 0)
+           sudo_fatal("seteuid(%u)", (unsigned int)user_details.cred.uid);
        tfd = sudo_edit_open(tf[i].tfile, O_RDONLY,
-           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, NULL);
-       if (tfd != -1)
-           rc = fstat(tfd, &sb);
-       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
-           "seteuid(%u)", ROOT_UID);
+           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, 0, &user_details.cred, NULL);
        if (seteuid(ROOT_UID) != 0)
            sudo_fatal("seteuid(ROOT_UID)");
-       if (rc == -1 || !S_ISREG(sb.st_mode)) {
-           if (rc == -1)
-               sudo_warn("%s", tf[i].tfile);
-           else
-               sudo_warnx(U_("%s: not a regular file"), tf[i].tfile);
+       sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+           "seteuid(%u)", ROOT_UID);
+       if (tfd == -1 || !sudo_check_temp_file(tfd, tf[i].tfile, user_details.cred.uid, &sb)) {
            sudo_warnx(U_("%s left unmodified"), tf[i].ofile);
            if (tfd != -1)
                close(tfd);
@@ -683,14 +309,15 @@ sudo_edit_copy_tfiles(struct command_details *command_details,
                continue;
            }
        }
-       switch_user(command_details->euid, command_details->egid,
-           command_details->ngroups, command_details->groups);
+       switch_user(command_details->cred.euid, command_details->cred.egid,
+           command_details->cred.ngroups, command_details->cred.groups);
        oldmask = umask(command_details->umask);
        ofd = sudo_edit_open(tf[i].ofile, O_WRONLY|O_CREAT,
-           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, command_details);
+           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, command_details->flags,
+           &user_details.cred, &command_details->cred);
        umask(oldmask);
-       switch_user(ROOT_UID, user_details.egid,
-           user_details.ngroups, user_details.groups);
+       switch_user(ROOT_UID, user_details.cred.egid,
+           user_details.cred.ngroups, user_details.cred.groups);
        if (ofd == -1) {
            sudo_warn(U_("unable to write to %s"), tf[i].ofile);
            goto bad;
@@ -716,7 +343,8 @@ bad:
 
 #ifdef HAVE_SELINUX
 static int
-selinux_run_helper(char *argv[], char *envp[])
+selinux_run_helper(uid_t uid, gid_t gid, int ngroups, GETGROUPS_T *groups,
+    char *const argv[], char *const envp[])
 {
     int status, ret = SESH_ERR_FAILURE;
     const char *sesh;
@@ -736,8 +364,10 @@ selinux_run_helper(char *argv[], char *envp[])
        break;
     case 0:
        /* child runs sesh in new context */
-       if (selinux_setcon() == 0)
+       if (selinux_setcon() == 0) {
+           switch_user(uid, gid, ngroups, groups);
            execve(sesh, argv, envp);
+       }
        _exit(SESH_ERR_FAILURE);
     default:
        /* parent waits */
@@ -751,12 +381,43 @@ selinux_run_helper(char *argv[], char *envp[])
     debug_return_int(ret);
 }
 
+static char *
+selinux_fmt_sudo_user(void)
+{
+    char *cp, *user_str;
+    size_t user_size;
+    int i, len;
+    debug_decl(selinux_fmt_sudo_user, SUDO_DEBUG_EDIT);
+
+    user_size = (MAX_UID_T_LEN + 1) * (2 + user_details.cred.ngroups);
+    if ((user_str = malloc(user_size)) == NULL)
+       debug_return_ptr(NULL);
+
+    /* UID:GID: */
+    len = snprintf(user_str, user_size, "%u:%u:",
+       (unsigned int)user_details.cred.uid, (unsigned int)user_details.cred.gid);
+    if (len < 0 || (size_t)len >= user_size)
+       sudo_fatalx(U_("internal error, %s overflow"), __func__);
+
+    /* Supplementary GIDs */
+    cp = user_str + len;
+    for (i = 0; i < user_details.cred.ngroups; i++) {
+       len = snprintf(cp, user_size - (cp - user_str), "%s%u",
+           i ? "," : "", (unsigned int)user_details.cred.groups[i]);
+       if (len < 0 || (size_t)len >= user_size - (cp - user_str))
+           sudo_fatalx(U_("internal error, %s overflow"), __func__);
+       cp += len;
+    }
+
+    debug_return_ptr(user_str);
+}
+
 static int
 selinux_edit_create_tfiles(struct command_details *command_details,
     struct tempfile *tf, char *files[], int nfiles)
 {
-    char **sesh_args, **sesh_ap;
-    int i, rc, sesh_nargs;
+    char **sesh_args, **sesh_ap, *user_str = NULL;
+    int i, error, sesh_nargs, ret = -1;
     struct stat sb;
     debug_decl(selinux_edit_create_tfiles, SUDO_DEBUG_EDIT);
     
@@ -764,19 +425,26 @@ selinux_edit_create_tfiles(struct command_details *command_details,
        debug_return_int(0);
 
     /* Construct common args for sesh */
-    sesh_nargs = 4 + (nfiles * 2) + 1;
+    sesh_nargs = 6 + (nfiles * 2) + 1;
     sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *));
     if (sesh_args == NULL) {
        sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
-       debug_return_int(-1);
+       goto done;
     }
     *sesh_ap++ = "sesh";
     *sesh_ap++ = "-e";
     if (!ISSET(command_details->flags, CD_SUDOEDIT_FOLLOW))
        *sesh_ap++ = "-h";
+    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++ = user_str;
+    }
     *sesh_ap++ = "0";
 
-    /* XXX - temp files should be created with user's context */
     for (i = 0; i < nfiles; i++) {
        char *tfile, *ofile = files[i];
        int tfd;
@@ -794,8 +462,7 @@ selinux_edit_create_tfiles(struct command_details *command_details,
        if (tfd == -1) {
            sudo_warn("mkstemps");
            free(tfile);
-           free(sesh_args);
-           debug_return_int(-1);
+           goto done;
        }
        /* Helper will re-create temp file with proper security context. */
        close(tfd);
@@ -806,8 +473,10 @@ selinux_edit_create_tfiles(struct command_details *command_details,
     *sesh_ap = NULL;
 
     /* Run sesh -e [-h] 0 <o1> <t1> ... <on> <tn> */
-    rc = selinux_run_helper(sesh_args, command_details->envp);
-    switch (rc) {
+    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:
        break;
     case SESH_ERR_BAD_PATHS:
@@ -817,29 +486,45 @@ selinux_edit_create_tfiles(struct command_details *command_details,
     case SESH_ERR_KILLED:
        sudo_fatalx("%s", U_("sesh: killed by a signal"));
     default:
-       sudo_fatalx(U_("sesh: unknown error %d"), rc);
+       sudo_warnx(U_("sesh: unknown error %d"), error);
+       goto done;
     }
 
-    /* Chown to user's UID so they can edit the temporary files. */
     for (i = 0; i < nfiles; i++) {
-       if (chown(tf[i].tfile, user_details.uid, user_details.gid) != 0) {
+       int tfd = open(tf[i].tfile, O_RDONLY|O_NONBLOCK|O_NOFOLLOW);
+       if (tfd == -1) {
+           sudo_warn(U_("unable to open %s"), tf[i].tfile);
+           goto done;
+       }
+       if (!sudo_check_temp_file(tfd, tf[i].tfile, command_details->cred.uid, NULL)) {
+           close(tfd);
+           goto done;
+       }
+       if (fchown(tfd, user_details.cred.uid, user_details.cred.gid) != 0) {
            sudo_warn("unable to chown(%s) to %d:%d for editing",
-               tf[i].tfile, user_details.uid, user_details.gid);
+               tf[i].tfile, user_details.cred.uid, user_details.cred.gid);
+           close(tfd);
+           goto done;
        }
+       close(tfd);
     }
+    ret = nfiles;
 
+done:
     /* Contents of tf will be freed by caller. */
     free(sesh_args);
+    free(user_str);
 
-    return (nfiles);
+    debug_return_int(ret);
 }
 
 static int
 selinux_edit_copy_tfiles(struct command_details *command_details,
     struct tempfile *tf, int nfiles, struct timespec *times)
 {
-    char **sesh_args, **sesh_ap;
-    int i, rc, sesh_nargs, ret = 1;
+    char **sesh_args, **sesh_ap, *user_str = NULL;
+    int i, error, sesh_nargs, ret = 1;
+    int tfd = -1;
     struct timespec ts;
     struct stat sb;
     debug_decl(selinux_edit_copy_tfiles, SUDO_DEBUG_EDIT);
@@ -848,45 +533,63 @@ selinux_edit_copy_tfiles(struct command_details *command_details,
        debug_return_int(0);
 
     /* Construct common args for sesh */
-    sesh_nargs = 3 + (nfiles * 2) + 1;
+    sesh_nargs = 5 + (nfiles * 2) + 1;
     sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *));
     if (sesh_args == NULL) {
        sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
-       debug_return_int(-1);
+       goto done;
     }
     *sesh_ap++ = "sesh";
     *sesh_ap++ = "-e";
+    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++ = user_str;
+    }
     *sesh_ap++ = "1";
 
     /* Construct args for sesh -e 1 */
     for (i = 0; i < nfiles; i++) {
-       if (stat(tf[i].tfile, &sb) == 0) {
-           mtim_get(&sb, ts);
-           if (tf[i].osize == sb.st_size && sudo_timespeccmp(&tf[i].omtim, &ts, ==)) {
-               /*
-                * If mtime and size match but the user spent no measurable
-                * time in the editor we can't tell if the file was changed.
-                */
-               if (sudo_timespeccmp(&times[0], &times[1], !=)) {
-                   sudo_warnx(U_("%s unchanged"), tf[i].ofile);
-                   unlink(tf[i].tfile);
-                   continue;
-               }
+       if (tfd != -1)
+           close(tfd);
+       if ((tfd = open(tf[i].tfile, O_RDONLY|O_NONBLOCK|O_NOFOLLOW)) == -1) {
+           sudo_warn(U_("unable to open %s"), tf[i].tfile);
+           continue;
+       }
+       if (!sudo_check_temp_file(tfd, tf[i].tfile, user_details.cred.uid, &sb))
+           continue;
+       mtim_get(&sb, ts);
+       if (tf[i].osize == sb.st_size && sudo_timespeccmp(&tf[i].omtim, &ts, ==)) {
+           /*
+            * If mtime and size match but the user spent no measurable
+            * time in the editor we can't tell if the file was changed.
+            */
+           if (sudo_timespeccmp(&times[0], &times[1], !=)) {
+               sudo_warnx(U_("%s unchanged"), tf[i].ofile);
+               unlink(tf[i].tfile);
+               continue;
            }
        }
        *sesh_ap++ = tf[i].tfile;
        *sesh_ap++ = tf[i].ofile;
-       if (chown(tf[i].tfile, command_details->uid, command_details->gid) != 0) {
+       if (fchown(tfd, command_details->cred.uid, command_details->cred.gid) != 0) {
            sudo_warn("unable to chown(%s) back to %d:%d", tf[i].tfile,
-               command_details->uid, command_details->gid);
+               command_details->cred.uid, command_details->cred.gid);
        }
     }
     *sesh_ap = NULL;
+    if (tfd != -1)
+       close(tfd);
 
     if (sesh_ap - sesh_args > 3) {
        /* Run sesh -e 1 <t1> <o1> ... <tn> <on> */
-       rc = selinux_run_helper(sesh_args, command_details->envp);
-       switch (rc) {
+       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;
@@ -902,13 +605,15 @@ selinux_edit_copy_tfiles(struct command_details *command_details,
            sudo_warnx("%s", U_("sesh: killed by a signal"));
            break;
        default:
-           sudo_warnx(U_("sesh: unknown error %d"), rc);
+           sudo_warnx(U_("sesh: unknown error %d"), error);
            break;
        }
-       if (ret != 0)
-           sudo_warnx(U_("contents of edit session left in %s"), edit_tmpdir);
     }
+
+done:
+    /* Contents of tf will be freed by caller. */
     free(sesh_args);
+    free(user_str);
 
     debug_return_int(ret);
 }
@@ -924,15 +629,12 @@ sudo_edit(struct command_details *command_details)
 {
     struct command_details saved_command_details;
     char **nargv = NULL, **ap, **files = NULL;
-    int errors, i, ac, nargc, rc;
+    int errors, i, ac, nargc, ret;
     int editor_argc = 0, nfiles = 0;
     struct timespec times[2];
     struct tempfile *tf = NULL;
     debug_decl(sudo_edit, SUDO_DEBUG_EDIT);
 
-    if (!set_tmpdir(command_details))
-       goto cleanup;
-
     /*
      * Set real, effective and saved uids to root.
      * We will change the euid as needed below.
@@ -944,6 +646,10 @@ sudo_edit(struct command_details *command_details)
        goto cleanup;
     }
 
+    /* Find a temporary directory writable by the user.  */
+    if (!set_tmpdir(&user_details.cred))
+       goto cleanup;
+
     /*
      * The user's editor must be separated from the files to be
      * edited by a "--" option.
@@ -1012,26 +718,16 @@ sudo_edit(struct command_details *command_details)
        goto cleanup;
     }
     memcpy(&saved_command_details, command_details, sizeof(struct command_details));
-    command_details->uid = user_details.uid;
-    command_details->euid = user_details.uid;
-    command_details->gid = user_details.gid;
-    command_details->egid = user_details.gid;
-    command_details->ngroups = user_details.ngroups;
-    command_details->groups = user_details.groups;
+    command_details->cred = user_details.cred;
     command_details->argv = nargv;
-    rc = run_command(command_details);
+    ret = run_command(command_details);
     if (sudo_gettime_real(&times[1]) == -1) {
        sudo_warn("%s", U_("unable to read the clock"));
        goto cleanup;
     }
 
     /* Restore saved command_details. */
-    command_details->uid = saved_command_details.uid;
-    command_details->euid = saved_command_details.euid;
-    command_details->gid = saved_command_details.gid;
-    command_details->egid = saved_command_details.egid;
-    command_details->ngroups = saved_command_details.ngroups;
-    command_details->groups = saved_command_details.groups;
+    command_details->cred = saved_command_details.cred;
     command_details->argv = saved_command_details.argv;
 
     /* Copy contents of temp files to real ones. */
@@ -1043,14 +739,14 @@ sudo_edit(struct command_details *command_details)
        errors = sudo_edit_copy_tfiles(command_details, tf, nfiles, times);
     if (errors) {
        /* Preserve the edited temporary files. */
-       rc = W_EXITCODE(1, 0);
+       ret = W_EXITCODE(1, 0);
     }
 
     for (i = 0; i < nfiles; i++)
        free(tf[i].tfile);
     free(tf);
     free(nargv);
-    debug_return_int(rc);
+    debug_return_int(ret);
 
 cleanup:
     /* Clean up temp files and return. */
diff --git a/src/sudo_edit.h b/src/sudo_edit.h
new file mode 100644 (file)
index 0000000..87e6e9f
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2021 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.
+ */
+
+#ifndef SUDO_EDIT_H
+#define SUDO_EDIT_H
+
+/*
+ * Directory open flags for use with openat(2).
+ * Use O_SEARCH/O_PATH and/or O_DIRECTORY where possible.
+ */
+#if defined(O_SEARCH)
+# if defined(O_DIRECTORY)
+#  define DIR_OPEN_FLAGS       (O_SEARCH|O_DIRECTORY)
+# else
+#  define DIR_OPEN_FLAGS       (O_SEARCH)
+# endif
+#elif defined(O_PATH)
+# if defined(O_DIRECTORY)
+#  define DIR_OPEN_FLAGS       (O_PATH|O_DIRECTORY)
+# else
+#  define DIR_OPEN_FLAGS       (O_PATH)
+# endif
+#elif defined(O_DIRECTORY)
+# define DIR_OPEN_FLAGS                (O_RDONLY|O_DIRECTORY)
+#else
+# define DIR_OPEN_FLAGS                (O_RDONLY|O_NONBLOCK)
+#endif
+
+/* copy_file.c */
+int sudo_copy_file(const char *src, int src_fd, off_t src_len, const char *dst, int dst_fd, off_t dst_len);
+bool sudo_check_temp_file(int tfd, const char *tname, uid_t uid, struct stat *sb);
+
+/* edit_open.c */
+struct sudo_cred;
+void switch_user(uid_t euid, gid_t egid, int ngroups, GETGROUPS_T *groups);
+int sudo_edit_open(char *path, int oflags, mode_t mode, int sflags, struct sudo_cred *user_cred, struct sudo_cred *cur_cred);
+int dir_is_writable(int dfd, struct sudo_cred *user_cred, struct sudo_cred *cur_cred);
+bool sudo_edit_parent_valid(char *path, int sflags, struct sudo_cred *user_cred, struct sudo_cred *cur_cred);
+
+#endif /* SUDO_EDIT_H */
index 39164a7..1e086d2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 2010-2016 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2010-2017, 2020-2021 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
@@ -84,9 +84,7 @@
  */
 struct command_details;
 struct command_status;
-
-/* copy_file.c */
-int sudo_copy_file(const char *src, int src_fd, off_t src_len, const char *dst, int dst_fd, off_t dst_len);
+struct stat;
 
 /* exec.c */
 void exec_cmnd(struct command_details *details, int errfd);
index 5ccb513..87f01dc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: ISC
  *
- * Copyright (c) 1996, 1998-2005, 2007-2018
+ * Copyright (c) 1996, 1998-2005, 2007-2021
  *     Todd C. Miller <Todd.Miller@sudo.ws>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -323,12 +323,12 @@ sudo_askpass(const char *askpass, const char *prompt)
        restore_limits();
        /* But avoid a setuid() failure on Linux due to RLIMIT_NPROC. */
        unlimit_nproc();
-       if (setgid(user_details.gid)) {
-           sudo_warn(U_("unable to set gid to %u"), (unsigned int)user_details.gid);
+       if (setgid(user_details.cred.gid)) {
+           sudo_warn(U_("unable to set gid to %u"), (unsigned int)user_details.cred.gid);
            _exit(255);
        }
-       if (setuid(user_details.uid)) {
-           sudo_warn(U_("unable to set uid to %u"), (unsigned int)user_details.uid);
+       if (setuid(user_details.cred.uid)) {
+           sudo_warn(U_("unable to set uid to %u"), (unsigned int)user_details.cred.uid);
            _exit(255);
        }
        restore_nproc();
index 7a80ccc..47e4ab1 100644 (file)
@@ -111,7 +111,7 @@ get_process_ttyname(char *name, size_t namelen)
     mib[3] = (int)getpid();
     mib[4] = sizeof(*ki_proc);
     mib[5] = 1;
-    do {
+    for (;;) {
        struct sudo_kinfo_proc *kp;
 
        size += size / 10;
@@ -121,7 +121,9 @@ get_process_ttyname(char *name, size_t namelen)
        }
        ki_proc = kp;
        rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0);
-    } while (rc == -1 && errno == ENOMEM);
+       if (rc != -1 || errno != ENOMEM)
+           break;
+    }
     errno = ENOENT;
     if (rc != -1) {
        if ((dev_t)ki_proc->sudo_kp_tdev != (dev_t)-1) {