Tony Godshall <[EMAIL PROTECTED]> writes: > Any tips or tricks or ideas or RT(specific)FMs greatly > appreciated. Take this, and make it happy on Debian. 8^) Buried in it's RH innards is the gunk that they use to kill sound on suspend, and restart it on resume. (Even kills programs and restarts them.) I've never gotten around to ripping out the sound parts and making them work on Debian, but you're welcome to. -- Alan Shutko <[EMAIL PROTECTED]> - In a variety of flavors! Sex is a natural bodily process, like a stroke.
#!/bin/bash # DO NOT EDIT THIS SCRIPT, CREATE AND EDIT APMCONTINUE IN THIS DIRECTORY; you # can put your stuff into apmcontinue for every link you create to apmscript; # for a start and definitely enough for most laptops we have two links and # according subroutines defined here: suspend and resume; all other links # will be redirected directly to apmcontinue which you can create; also # suspend and resume call apmscript, so you can also do other things (like # reinitialising some PCMCIA-Card) there; apmcontinue will get the name # as which it was called as $1; for debugging see the logfiles # # This script can be controlled by editing /etc/sysconfig/apmd. PROG="$1" LOCKFILE=/var/lock/subsys/resume [ -e /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard [ -e /etc/sysconfig/apmd ] && . /etc/sysconfig/apmd [ -e /etc/sysconfig/clock ] && . /etc/sysconfig/clock [ -z "$UTC" ] && UTC="no" [ -z "$CHANGEVT" ] && CHANGEVT="0" [ -z "$CLOCK_SYNC" ] && CLOCK_SYNC="no" CLOCK="" [ "$UTC" = "yes" -o "$UTC" = "true" -o "$UTC" = 1 ] && CLOCK="-u" case "$PROG" in suspend|standby) # Remove sound progs and modules if requested if [ "$RESTORESOUND" = "yes" -o "$RESTORESOUNDPROGS" = "yes" ]; then # Find all programs using sound and kill them... logger removing sound programs rm -rf /var/run/apm-soundprogs if [ -c /dev/sndstat ]; then for n in `cat /dev/sndstat 2>/dev/null|grep Open\ by|awk {'print $3'}|uniq`; do SOUNDPROG=`echo $n|awk -F / {'print $2'}` SOUNDPID=`echo $n|awk -F / {'print $1'}` SOUNDUSER=`ls -ld /proc/$SOUNDPID |awk {'print $3'}` SOUNDDISPLAY=`perl -e 's/\000/\n/g;' -p /proc/$SOUNDPID/environ|grep ^DISPLAY=|cut -d= -f2-` # Make sure nobody is playing foul tricks on us SOUNDPROG=`echo $SOUNDPROG |sed -e "s/|.*//` kill $SOUNDPID ps "$SOUNDPID" &>/dev/null && kill -9 $SOUNDPID echo "$SOUNDPROG|$SOUNDPID|$SOUNDUSER|$SOUNDDISPLAY" >>/var/run/apm-soundprogs logger "apmscript: Program $SOUNDPROG ($SOUNDPID) of user $SOUNDUSER on display $SOUNDDISPLAY terminated." done fi for n in `lsof |grep /dev|grep ' 14,'|sed -e 's/ \+/|/g'|cut '-d|' -f1-3`; do SOUNDPROG=`echo $n |cut '-d|' -f1` SOUNDPID=`echo $n |cut '-d|' -f2` SOUNDUSER=`echo $n |cut '-d|' -f3` SOUNDDISPLAY=`perl -e 's/\000/\n/g;' -p /proc/$SOUNDPID/environ|grep ^DISPLAY=|cut -d= -f2-` # Make sure nobody is playing foul tricks on us SOUNDPROG=`echo $SOUNDPROG |sed -e "s/|.*//` kill $SOUNDPID ps "$SOUNDPID" &>/dev/null && kill -9 $SOUNDPID echo "$SOUNDPROG|$SOUNDPID|$SOUNDUSER|$SOUNDDISPLAY" >>/var/run/apm-soundprogs logger "apmscript: Program $SOUNDPROG ($SOUNDPID) of user $SOUNDUSER on display $SOUNDDISPLAY terminated." done # We unload the modules later to give the driver some time # to spin down. fi logger Before disks # Some broken disks won't return from a suspend to disk # unless they're set to 100% failsafe settings with hdparm. # Typically, notebooks with SystemSoft MobilePRO BIOS are # affected by this. if test "x$HDPARM_AT_SUSPEND" != "x"; then for i in /proc/ide/hd*; do DRIVE=/dev/`echo $i |sed -e "s,.*/,,g"` if test "x`cat $i/media`" = "xdisk"; then hdparm $HDPARM_AT_SUSPEND $DRIVE fi done fi sync logger Before network stop [ "$NETFS_RESTART" = "yes" ] && /etc/rc.d/init.d/netfs stop [ "$NET_RESTART" = "yes" ] && /etc/rc.d/init.d/network stop logger After network stop [ "$PCMCIARESTART" = "yes" ] && { if [ "$PCMCIABIOSBUG" = "yes" ]; then /sbin/cardctl eject else /sbin/cardctl suspend fi } if [ "$PCMCIAWAIT" = "yes" ]; then until [ `grep "Socket .: empty" /var/run/stab|wc -l` = `grep "Socket" /var/run/stab|wc -l` ]; do logger "Waiting for pcmcia-device to be removed..." sleep 10 done fi while [ -f "$LOCKFILE" ]; do RESUMEPID=`cat "$LOCKFILE"` logger "Waiting for resume to be finished ($LOCKFILE gives PID $RESUMEPID)..." sleep 10 done # Don't try to restore the terminal or lock X if X isn't running... [ "x`pidof X`" != x ] && { [ "$CHANGEVT" != "0" ] && chvt 1 [ "x$LOCK_X" = "xyes" -o "x$LOCK_X" = "x1" ] && { # Lock X, based on patch from Hannu Martikka # <[EMAIL PROTECTED]> w |tail +3 |awk '{print $1, $3}'|grep -v '-'|grep : | \ sort -u | \ while read line; do Usern=`echo $line |awk '{print $1}'` XDisp=`echo $line |awk '{print $2}'` if [ "x$Usern" = "xroot" ]; then xlock -display $XDisp &>/dev/null & else su $Usern -c "xscreensaver-command -display $XDisp -lock || (xscreensaver -display $XDisp -no-splash &sleep 1; xscreensaver-command -display $XDisp -lock) || (xlock -display $XDisp &)" &>/dev/null fi done } } # Unload sound modules if necessary if [ "$RESTORESOUND" = "yes" -o "$RESTORESOUNDPROGS" = "yes" ]; then # soundoff is from the commercial OSS drivers, don't worry # if you don't have it. (Nobody sane does ;) ). [ -x /usr/bin/soundoff ] && /usr/bin/soundoff [ -x /usr/sbin/soundoff ] && /usr/sbin/soundoff [ -x /usr/local/bin/soundoff ] && /usr/local/bin/soundoff [ -x /usr/local/sbin/soundoff ] && /usr/local/sbin/soundoff rm -rf /var/run/apm-soundmodules for m in $SOUNDMODULES; do if lsmod |grep -q "^$m " &>/dev/null; then rmmod $m echo $m >>/var/run/apm-soundmodules fi done fi sync [ -f /etc/sysconfig/apm-scripts/apmcontinue ] && . /etc/sysconfig/apm-scripts/apmcontinue "$PROG" sync ;; resume) # If HDPARM_AT_RESUME is set, the user has a broken disk. # We'd better wake it up manually. :/ if test "x$HDPARM_AT_RESUME" != "x"; then for i in /proc/ide/hd*; do DRIVE=/dev/`echo $i |sed -e "s,.*/,,g"` if test "x`cat $i/media`" = "xdisk"; then hdparm -q -S0 $DRIVE fi done fi # as some displays don't like being waked up from power-off # state directly into graphics mode, we can switch to console # 1 during suspend and back to console n (where we assume X11 # is running) after a resume; also the setting of the console # beep and the whole sound system can be confused; see # /etc/sysconfig/apm for a detailed description of the # variables used here. echo $$ >> "$LOCKFILE" if [ "$TERMINALBEEP" != "" ]; then # first we set the beep-length for t in 1 2 3 4 5 6 7 8 9; do setterm -blength $BEEPLENGTH >/dev/tty$t done fi if [ "$RESTORESOUND" = "yes" -o "$RESTORESOUNDPROGS" = "yes" ]; then # Get the sound modules back up... # soundon is from the commercial OSS drivers, don't worry # if you don't have it. [ -x /usr/bin/soundon ] && /usr/bin/soundon [ -x /usr/sbin/soundon ] && /usr/sbin/soundon [ -x /usr/local/bin/soundon ] && /usr/local/bin/soundon [ -x /usr/local/sbin/soundon ] && /usr/local/sbin/soundon for m in `cat /var/run/apm-soundmodules`; do modprobe $m done rm -f /var/run/apm-soundmodules fi if [ "$RESTORESOUNDPROGS" = "yes" ]; then # at least we can restart the programs using sound on # the right display # If you're using the trial version of OSS, you want to add #sleep 5 # here to wait for the trial text for n in `cat /var/run/apm-soundprogs`; do SOUNDPROG=`echo $n|cut '-d|' -f1` SOUNDPID=`echo $n|cut '-d|' -f2` SOUNDUSER=`echo $n|cut '-d|' -f3` SOUNDDISPLAY=`echo $n|cut '-d|' -f4` su --shell="/bin/bash" - "$SOUNDUSER" -c "source /etc/profile;[ -f ~/.bashrc ] && source ~/.bashrc;[ -f ~/.bash_profile ] && source ~/.bash_profile;export DISPLAY="$SOUNDDISPLAY";$SOUNDPROG &" logger "apmscript: Program $SOUNDPROG started as user $SOUNDUSER on display $SOUNDDISPLAY." done rm -f /var/run/apm-soundprogs fi # restore X if necessary [ "$CHANGEVT" != "0" ] && [ "x`pidof X`" != x ] && chvt "$CHANGEVT" if [ "$PCMCIARESTART" = "yes" ] ; then if [ "$PCMCIABIOSBUG" = "yes" ]; then /sbin/cardctl insert else /sbin/cardctl resume fi fi [ "$NET_RESTART" = "yes" ] && /etc/rc.d/init.d/network start [ "$NETFS_RESTART" = "yes" ] && /etc/rc.d/init.d/netfs start sync [ -f /etc/sysconfig/apm-scripts/apmcontinue ] && . /etc/sysconfig/apm-scripts/apmcontinue "$PROG" # Read the hardware clock if test $CLOCK_SYNC != "no"; then hwclock $CLOCK --hctosys fi # Finally, run anacron to catch up cron stuff we missed... # If anacron is installed and we're on AC power or we want # to run it even in battery mode. if [ -x /usr/sbin/anacron ]; then if apm |grep on-line &>/dev/null; then /usr/sbin/anacron elif test "x$ANACRON_ON_BATTERY" = "xyes"; then /usr/sbin/anacron fi fi if test "x$HDPARM_AT_RESUME" != "x"; then for i in /proc/ide/hd*; do DRIVE=/dev/`echo $i |sed -e "s,.*/,,g"` if test "x`cat $i/media`" = "xdisk"; then hdparm $HDPARM_AT_RESUME $DRIVE fi done fi rm -f "$LOCKFILE" ;; change) case $2 in power) # Change from battery power to AC power or vice versa. # You might want to stop/restart any unnecessary CPU intensive # tasks (seti@home, distributed.net clients, etc) here. ;; battery) # Battery low. If you want to be on the safe side, maybe put # the harddisk into extreme powersaving, or "apm -s" here. ;; esac if [ -f /etc/sysconfig/apm-scripts/apmcontinue ]; then . /etc/sysconfig/apm-scripts/apmcontinue $@ fi ;; start) # This occurs at system startup - you usually don't need to do # anything here. [ -f /etc/sysconfig/apm-scripts/apmcontinue ] && . /etc/sysconfig/apm-scripts/apmcontinue $@ ;; stop) # This occurs at system shutdown - you usually don't need to do # anything here. [ -f /etc/sysconfig/apm-scripts/apmcontinue ] && . /etc/sysconfig/apm-scripts/apmcontinue $@ ;; *) if [ -f /etc/sysconfig/apm-scripts/apmcontinue ]; then . /etc/sysconfig/apm-scripts/apmcontinue "$PROG" else logger "FAIL: Wrong parameter \"$PROG\" in apmscript!" exit 1 fi ;; esac exit 0