Iterate through usable POSIX FDs instead.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
---
kdump-logger.sh | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/kdump-logger.sh b/kdump-logger.sh
index 3fd433d3..128fcd1a 100755
--- a/kdump-logger.sh
+++ b/kdump-logger.sh
@@ -124,11 +124,24 @@ dlog_init() {
if [ -d /run/systemd/journal ] \
&& systemd-cat --version 1>/dev/null 2>&1 \
&& systemctl --quiet is-active systemd-journald.socket 1>/dev/null
2>&1; then
- readonly _systemdcatfile="/var/tmp/systemd-cat"
- mkfifo "$_systemdcatfile" 1>/dev/null 2>&1
- readonly _dlogfd=15
- systemd-cat -t 'kdump' --level-prefix=true
<"$_systemdcatfile" &
- exec 15>"$_systemdcatfile"
+
+ for _dlogfd in 9 8 7 6 5 4 3; do
+ [ ! -e "/proc/self/fd/$_dlogfd" ] && break
+ _dlogfd=
+ done
+
+ if [ -n "$_dlogfd" ]; then
+ readonly _dlogfd
+ readonly _systemdcatfile="/var/tmp/systemd-cat"
+ mkfifo "$_systemdcatfile" 1>/dev/null 2>&1
+ systemd-cat -t 'kdump' --level-prefix=true
<"$_systemdcatfile" &
+ eval "exec $_dlogfd>'$_systemdcatfile'"
+ else
+ kdump_kmsgloglvl=$kdump_sysloglvl
+ kdump_sysloglvl=0
+ ret=1
+ errmsg="Failed to setup syslog FD"
+ fi
elif ! [ -S /dev/log ] && [ -w /dev/log ] || ! command -v logger
>/dev/null; then
# We cannot log to syslog, so turn this facility off.
kdump_kmsgloglvl=$kdump_sysloglvl
@@ -254,7 +267,7 @@ _do_dlog() {
if [ "$1" -le $kdump_sysloglvl ]; then
if [ "$_dlogfd" ]; then
- printf -- "<%s>%s\n" "$(($(_dlvl2syslvl "$1")
& 7))" "$2" 1>&$_dlogfd
+ eval "printf -- '<%s>%s\n' '$(($(_dlvl2syslvl
"$1") & 7))' '$2' 1>&$_dlogfd"
else
logger -t "kdump[$$]" -p "$(_lvl2syspri "$1")"
-- "$2"
fi
--
2.31.1