Bug 3367

Summary: $INITLOG_ARGS is not used in all calls in rc.sysinit and functions
Product: [Retired] Red Hat Linux Reporter: asiriann
Component: initscriptsAssignee: David Lawrence <dkl>
Status: CLOSED NEXTRELEASE QA Contact:
Severity: medium Docs Contact:
Priority: medium    
Version: 6.0   
Target Milestone: ---   
Target Release: ---   
Hardware: i386   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 1999-06-17 16:29:35 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description asiriann 1999-06-09 16:02:50 UTC
After installing RedHat 6.0 the boot messages are directed
to /var/log/boot.log via syslog(local7.*).  In order to
change the direction of these messages a user would need to
change /etc/rc.d/init.d/functions so that the variable
$INITLOG_ARGS contains --facility and --priority.
Unfortunately the change does not work properly because
there are lines in /etc/rc.d/rc.sysinit
and /etc/rc.d/init.d/functions that call initlog without
use of the variable.  Below are the modified rc.sysinit and
functions files;

rc.sysinit
----------
#!/bin/sh
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#

# Rerun ourselves through initlog
if [ -z "$IN_INITLOG" ]; then
 [ -f /sbin/initlog ] && exec /sbin/initlog $INITLOG_ARGS -
r /etc/rc.d/rc.sysinit
fi

# Set the path
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

# Read in config data.
if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
else
    NETWORKING=no
    HOSTNAME=localhost
fi

# Source functions
. /etc/rc.d/init.d/functions

# Fix console loglevel
/sbin/loglevel $LOGLEVEL

# Load keymap
KEYMAP=
if [ -f /etc/sysconfig/console/default.kmap ]; then
  KEYMAP=/etc/sysconfig/console/default.kmap
else
  . /etc/sysconfig/keyboard
  if [ -n "$KEYTABLE" -a -d "/usr/lib/kbd/keymaps" ]; then
     KEYMAP=$KEYTABLE
  fi
fi
if [ -n "$KEYMAP" ]; then
  # Since this takes in/output from stdin/out, we can't use
initlog
  echo -n "Loading default keymap"
  loadkeys $KEYMAP < /dev/tty0 > /dev/tty0 2>/dev/null && \
     success "Loading default keymap" || failure "Loading
default keymap"
  echo
fi

# Load system font
if [ -x /sbin/setsysfont ]; then
    action "Setting default font" /sbin/setsysfont
fi

# Start up swapping.
action "Activating swap partitions" swapon -a

# Set the hostname.
action "Setting hostname ${HOSTNAME}" hostname ${HOSTNAME}

# Set the NIS domain name
if [ -n "$NISDOMAIN" ]; then
    action "Setting NIS domain name $NISDOMAIN" domainname
$NISDOMAIN
else
    domainname ""
fi

if [ -f /fsckoptions ]; then
	fsckoptions=`cat /fsckoptions`
    else
	fsckoptions=
fi

if [ -f /forcefsck ]; then
	fsckoptions="-f $fsckoptions"
fi

_RUN_QUOTACHECK=0
if [ ! -f /fastboot ]; then
        STRING="Checking root filesystem"
	echo $STRING
	initlog $INITLOG_ARGS -c "fsck  -T -a
$fsckoptions /"
	rc=$?

	if [ "$rc" = "0" ]; then
		success "$STRING"
		echo
	elif [ "$rc" = "1" ]; then
	        passed "$STRING"
		echo
        fi

        # A return of 2 or higher means there were serious
problems.
	if [ $rc -gt 1 ]; then
		failure "$STRING"
		echo
		echo
		echo "*** An error occurred during the file
system check."
		echo "*** Dropping you to a shell; the
system will reboot"
		echo "*** when you leave the shell."

		PS1="(Repair filesystem) \#"; export PS1
		sulogin

		echo "Unmounting file systems"
		umount -a
		mount -n -o remount,ro /
		echo "Automatic reboot in progress."
		reboot
	elif [ "$rc" = "1" ]; then
		_RUN_QUOTACHECK=1
	fi
fi

# check for arguments

mount -t proc /proc /proc

if grep -i nopnp /proc/cmdline >/dev/null ; then
    PNP=
else
    PNP=yes
fi

# set up pnp
if [ -x /sbin/isapnp -a -f /etc/isapnp.conf ]; then
    if [ -n "$PNP" ]; then
	action "Setting up ISA PNP
devices" /sbin/isapnp /etc/isapnp.conf
    else
	action "Skipping ISA PNP configuration at users
request" /bin/true
    fi
fi

# Remount the root filesystem read-write.
action "Remounting root filesystem in read-write mode"
mount -n -o remount,rw /

# Update quotas if fsck was run on /.
if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then
	action "Checking root filesystem
quotas"  /sbin/quotacheck -v /
fi
# XXX Disabled to avoid complaints on root later with
quotaon -a
#if [ -x /sbin/quotaon ]; then
#    action "Turning on user and group quotas for root
filesystem"  /sbin/quotaon /
#fi

if [ -n "$IN_INITLOG" ]; then
    IN_INITLOG=
fi

if [ ! -f /etc/HOSTNAME ]; then
    echo ${HOSTNAME} > /etc/HOSTNAME
fi

# Clear mtab
>/etc/mtab

# Enter root and /proc into mtab.
mount -f /
mount -f /proc

if ! grep -i nomodules /proc/cmdline >/dev/null && [ -
f /proc/ksyms ]; then
    USEMODULES=y
else
    USEMODULES=
fi

# Our modutils don't support it anymore, so we might as
well remove
# the link.
rm -f /lib/modules/preferred
rm -f /lib/modules/default
if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then
    # Get ready for kmod if module support in the kernel
    if [ -z `uname -r | grep "-"` ]; then
       # we're using a new kernel, no preferred needed
       mver=`uname -r`
    else
       ktag="`cat /proc/version`"
       mtag=grep -l "$ktag" /lib/modules/*/.rhkmvtag
2> /dev/null
       if [ -n "$mtag" ]; then
          mver=echo $mtag | sed -e 's,/lib/modules/,,' -
e 's,/.rhkmvtag,,' -e 's,[       ].*$,,'
       fi
       if [ -n "$mver" ]; then
         ln -sf /lib/modules/$mver /lib/modules/default
       fi
    fi
    [ -n "$mver" -a -f "/boot/module-info-$mver" ] && ln -
sf /boot/module-info-$mver /boot/module-info
    [ -n "$mver" -a -f "/boot/System.map-$mver" ] && ln -
sf /boot/System.map-$mver /boot/System.map
    action "Finding module dependencies" depmod -a
fi

# load sound modules
if [ -n "$USEMODULES" ]; then
   if grep -s -q "^alias sound" /etc/conf.modules ; then
      action "Loading sound module" modprobe sound
   fi
   if grep -s -q "^alias midi" /etc/conf.modules ; then
      action "Loading midi module" modprobe midi
   fi
fi

if [ -f /proc/sys/kernel/modprobe ]; then
   if [ -n "$USEMODULES" ]; then
       echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
   else
       echo "" > /proc/sys/kernel/modprobe
   fi
fi

# Add raid devices
if [ -f /proc/mdstat -a -f /etc/raidtab -a -
x /sbin/raidadd ]; then
	action "Starting up RAID devices" raidadd -a

	rc=$?

	if [ $rc = 0 ]; then
		raidrun -a
		rc=$?
	fi

	# A non-zero return means there were problems.
	if [ $rc -gt 0 ]; then
		echo
		echo
		echo "*** An error occurred during the RAID
startup"
		echo "*** Dropping you to a shell; the
system will reboot"
		echo "*** when you leave the shell."

		PS1="(RAID Repair) \#"; export PS1
		sulogin

		echo "Unmounting file systems"
		umount -a
		mount -n -o remount,ro /
		echo "Automatic reboot in progress."
		reboot
	fi
fi

# Check filesystems
if [ ! -f /fastboot ]; then
        STRING="Checking filesystems"
	echo $STRING
	initlog $INITLOG_ARGS -c "fsck  -T -R -A -a
$fsckoptions"
	rc=$?
        if [ "$rc" = "0" ]; then
		success "$STRING"
		echo
	elif [ "$rc" = "1" ]; then
	        passed "$STRING"
		echo
	fi

	# A return of 2 or higher means there were serious
problems.
	if [ $rc -gt 1 ]; then
	        failure "$STRING"
		echo
		echo
		echo "*** An error occurred during the file
system check."
		echo "*** Dropping you to a shell; the
system will reboot"
		echo "*** when you leave the shell."

		PS1="(Repair filesystem) \#"; export PS1
		sulogin

		echo "Unmounting file systems"
		umount -a
		mount -n -o remount,ro /
		echo "Automatic reboot in progress."
		reboot
	elif [ "$rc" = "1" -a -x /sbin/quotacheck ]; then
		action "Checking filesystem
quotas" /sbin/quotacheck -v -R -a
	fi
fi

# Mount all other filesystems (except for NFS and /proc,
which is already
# mounted). Contrary to standard usage,
# filesystems are NOT unmounted in single user mode.
action "Mounting local filesystems" mount -a -t
nonfs,smbfs,ncpfs,proc

if [ -x /sbin/quotaon ]; then
    action "Turning on user and group quotas for local
filesystems" /sbin/quotaon -a
fi

# Clean out /etc.
rm -f /etc/mtab~ /fastboot /fsckoptions /forcefsck
>/var/run/utmp
touch /var/log/wtmp
chgrp utmp /var/run/utmp /var/log/wtmp
chmod 0664 /var/run/utmp /var/log/wtmp

# Delete pam_console lock and refcount files
rm -f /var/lock/console.lock
rm -f /var/lock/console/*

# Delete UUCP lock files.
rm -f /var/lock/LCK*

# Delete stale subsystem files.
rm -f /var/lock/subsys/*

# Delete stale pid files
rm -f /var/run/*.pid

# Delete X locks
rm -f /tmp/.X*-lock

# Delete Postgres sockets
rm -f /tmp/.s.PGSQL.*

# Set the system clock.
ARC=0
UTC=0
if [ -f /etc/sysconfig/clock ]; then
    . /etc/sysconfig/clock

    # convert old style clock config to new values
    if [ "${CLOCKMODE}" = "GMT" ]; then
	    UTC=true
    elif [ "${CLOCKMODE}" = "ARC" ]; then
	    ARC=true
    fi
fi

CLOCKDEF=""
if [ -x /sbin/hwclock ]; then
    CLOCKFLAGS="--hctosys"
    CLOCK=/sbin/hwclock
    $CLOCK --adjust
else
    CLOCKFLAGS="-a"
    CLOCK=/sbin/clock
fi

case "$UTC" in
  yes|true)
    CLOCKFLAGS="$CLOCKFLAGS -u";
    CLOCKDEF="$CLOCKDEF (utc)";
  ;;
esac

if [ "$CLOCK" = "/sbin/clock" ]; then
 case "$ARC" in
   yes|true)
     CLOCKFLAGS="$CLOCKFLAGS -A";
     CLOCKDEF="$CLOCKDEF (arc)";
   ;;
 esac
fi

$CLOCK $CLOCKFLAGS
action "Setting clock $CLOCKDEF: `date`" date

# Right, now turn on swap in case we swap to files.
swapon -a >/dev/null 2>&1
action "Enabling swap space" /bin/true

# Initialize the serial ports.
if [ -f /etc/rc.d/rc.serial ]; then
	. /etc/rc.d/rc.serial
fi

# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.d/rc.modules ]; then
	/etc/rc.d/rc.modules
fi

# If a SCSI tape has been detected, load the st module
unconditionally
# since many SCSI tapes don't deal well with st being
loaded and unloaded
if [ -f /proc/scsi/scsi ] && cat /proc/scsi/scsi | grep -
q 'Type:   Sequential-Access' 2>/dev/null ; then
	if cat /proc/devices | grep -qv ' 9 st' ; then
		if [ -n "$USEMODULES" ] ; then
			# Try to load the module.  If it
fails, ignore it...
			modprobe st 2>/dev/null
		fi
	fi
fi

# Set preferred X display manager link
preferred=
if [ -f /etc/sysconfig/desktop ]; then
	if [ -n "`grep GNOME /etc/sysconfig/desktop`" ];
then
		preferred=gdm
	elif [ -n "`grep KDE /etc/sysconfig/desktop`" ];
then
		preferred=kdm
	elif [ -n "`grep
AnotherLevel /etc/sysconfig/desktop`" ]; then
		preferred=xdm
	fi
fi
if [ -n "$preferred" ] && which $preferred >/dev/null 2>&1;
then
	ln -snf ../..`which $preferred` /etc/X11/prefdm
else
        if [ ! -L /etc/X11/prefdm ]; then
		if which gdm >/dev/null 2>&1; then
			ln -snf ../..`which
gdm` /etc/X11/prefdm
		elif which kdm >/dev/null 2>&1; then
			ln -snf ../..`which
kdm` /etc/X11/prefdm
		elif which xdm >/dev/null 2>&1; then
			ln -snf ../..`which
xdm` /etc/X11/prefdm
		fi
	fi
fi

# Now that we have all of our basic modules loaded and the
kernel going,
# let's dump the syslog ring somewhere so we can find it
later
dmesg > /var/log/dmesg


functions
----------

#!/bin/sh
#
# functions	This file contains functions to be used by
most or all
#		shell scripts in the /etc/init.d directory.
#
# Version:	@(#) /etc/init.d/functions 1.01 26-Oct-1993
#
# Author:	Miquel van Smoorenburg,
<miquels.mugnet.org>
# Hacked by:    Greg Galloway and Marc Ewing
#

# First set up a default search path.
export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"

# Get a sane screen width
[ -z "$COLUMNS" ] && COLUMNS=80

# Read in our configuration
if [ -z "$BOOTUP" ]; then
  if [ -f /etc/sysconfig/init ]; then
      . /etc/sysconfig/init
  else
    # This all seem confusing? Look in /etc/sysconfig/init,
    # or in /usr/doc/initscripts-*/sysconfig.txt
    BOOTUP=color
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[300C\\033[$[${COLUMNS}-
${RES_COL}]D"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \\033[0;39m"
    LOGLEVEL=1
  fi
fi

if [ "$BOOTUP" != "verbose" ]; then
   INITLOG_ARGS="-q"
else
   INITLOG_ARGS=
fi

# A function to start a program.
daemon() {
	# Test syntax.
	gotbase=
	case $1 in
	    '')    echo '$0: Usage: daemon [+/-nicelevel]
{program}'
	           return 1;;
	    --check)
	           shift
		   base=$1
		   gotbase="yes"
		   shift
		   nicelevel=0
		   ;;

	    -*|+*) nicelevel=$1
	shift;;
	     *)    nicelevel=0;;
	esac

        # Save basename.
        [ -z $gotbase ] && base=`basename $1`

        # See if it's already running.
	pid=`pidofproc $base`
	[ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && return

	# make sure it doesn't core dump anywhere; while
this could mask
	# problems with the daemon, it also closes some
security problems
	ulimit -c 0

	# Echo daemon
        [ "$BOOTUP" = "verbose" ] && echo -n " $base"

	# And start it up.
	nice -n $nicelevel initlog $INITLOG_ARGS -c "$*" &&
success "$base startup" || failure "$base startup"
}

# A function to stop a program.
killproc() {
	# Test syntax.
	if [ $# = 0 ]; then
		echo "Usage: killproc {program} [signal]"
		return 1
	fi

	notset=0
	# check for second arg to be kill level
	if [ "$2" != "" ] ; then
		killlevel=$2
	else
		notset=1
		killlevel="-9"
	fi

        # Save basename.
        base=`basename $1`

        # Find pid.
        pid=`pidofproc $base`

        # Kill it.
        if [ "$pid" != "" ] ; then
                [ $BOOTUP = "verbose" ] && echo -n "$base "
		if [ "$notset" = "1" ] ; then
		       if ps h $pid>/dev/null 2>&1; then
			   # TERM first, then KILL if not
dead
			   kill -TERM $pid
			   usleep 100000
			   if ps h $pid >/dev/null 2>&1 ;
then
				sleep 1
				if ps h $pid >/dev/null
2>&1 ; then
				        sleep 3
					if ps h $pid
>/dev/null 2>&1 ; then
					   kill -KILL $pid
					fi
				fi
			   fi
		        fi
			ps h $pid >/dev/null 2>&1 &&
failure "$base shutdown" || success "$base shutdown"
		# use specified level only
		else
		        if ps h $pid >/dev/null 2>&1; then
	                	kill $killlevel $pid &&
success "$base $killlevel" || failure "$base $killlevel"
			fi
		fi
	else
	    failure "$base shutdown"
	fi

        # Remove pid file if any.
	if [ "$notset" = "1" ]; then
            rm -f /var/run/$base.pid
	fi
}

# A function to find the pid of a program.
pidofproc() {
	# Test syntax.
	if [ $# = 0 ] ; then
		echo "Usage: pidofproc {program}"
		return 1
	fi

	# First try "/var/run/*.pid" files
	if [ -f /var/run/$1.pid ] ; then
	        pid=`head -1 /var/run/$1.pid`
	        if [ "$pid" != "" ] ; then
	                echo $pid
	                return 0
	        fi
	fi

	# Next try "pidof"
	pid=`pidof $1`
	if [ "$pid" != "" ] ; then
	        echo $pid
	        return 0
	fi

	# Finally try to extract it from ps
	ps ax | awk 'BEGIN { prog=ARGV[1]; ARGC=1 }
			   { if ((prog == $5) || (("("
prog ")") == $5) ||
			     (("[" prog "]") == $5) ||
			   ((prog ":") == $5)) { print $1 ;
exit 0 } }' $1
}

status() {
	# Test syntax.
	if [ $# = 0 ] ; then
		echo "Usage: status {program}"
		return 1
	fi

	# First try "pidof"
	pid=`pidof $1`
	if [ "$pid" != "" ] ; then
	        echo "$1 (pid $pid) is running..."
	        return 0
        else
                pid=`ps ax | awk 'BEGIN { prog=ARGV[1];
ARGC=1 }
			   { if ((prog == $5) || (("("
prog ")") == $5) ||
			     (("[" prog "]") == $5) ||
			   ((prog ":") == $5)) { print $1 ;
exit 0 } }' $1`
                if [ "$pid" != "" ] ; then
                        echo "$1 (pid $pid) is running..."
                        return 0
                fi
	fi

	# Next try "/var/run/*.pid" files
	if [ -f /var/run/$1.pid ] ; then
	        pid=`head -1 /var/run/$1.pid`
	        if [ "$pid" != "" ] ; then
	                echo "$1 dead but pid file exists"
	                return 1
	        fi
	fi
	# See if /var/lock/subsys/$1 exists
	if [ -f /var/lock/subsys/$1 ]; then
		echo "$1 dead but subsys locked"
		return 2
	fi
	echo "$1 is stopped"
	return 3
}

echo_success() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "[  "
  [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
  echo -n "OK"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "  ]"
  return 0
}

echo_failure() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo -n "FAILED"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  return 1
}

echo_passed() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
  echo -n "PASSED"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  return 1
}

# Log that something succeeded
success() {
  if [ -z "$IN_INITLOG" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
  else
     echo "-n $0 -s \"$1\" -e 1" >&21
  fi
  [ "$BOOTUP" != "verbose" ] && echo_success
  return 0
}

# Log that something failed
failure() {
  rc=$?
  if [ -z "$IN_INITLOG" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$1" -e 2
  else
     echo "-n $0 -s \"$1\" -e 2" >&21
  fi
  [ "$BOOTUP" != "verbose" ] && echo_failure
  return $rc
}

# Log that something passed, but may have had errors.
Useful for fsck
passed() {
  rc=$?
  if [ -z "$IN_INITLOG" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
  else
     echo "-n $0 -s \"$1\" -e 1" >&21
  fi
  [ "$BOOTUP" != "verbose" ] && echo_passed
  return $rc
}

# Run some action. Log its output.
action() {
  STRING=$1
  echo -n "$STRING "
  shift
  initlog $INITLOG_ARGS -c "$*" && success "$STRING" ||
failure "$STRING"
  rc=$?
  echo
  return $rc
}

# Confirm whether we really want to run this service
confirm() {
  echo -n "Start service $1 (Y)es/(N)o/(C)ontinue? [Y] "
  read answer
  case $answer in
    y|Y|"")
      return 0
    ;;
    c|C)
      return 2
    ;;
    n|N)
      return 1
    ;;
    *)
      confirm $1
      return $?
    ;;
    esac
}

Comment 1 Bill Nottingham 1999-06-17 16:29:59 UTC
fixed in initscripts-4.21, except for the fsck calls...