diff options
Diffstat (limited to 'mandriva/hibernate-cleanup.sh')
-rwxr-xr-x | mandriva/hibernate-cleanup.sh | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/mandriva/hibernate-cleanup.sh b/mandriva/hibernate-cleanup.sh new file mode 100755 index 00000000..49451859 --- /dev/null +++ b/mandriva/hibernate-cleanup.sh @@ -0,0 +1,121 @@ +#!/bin/sh + +# This script invalidates any stale swsusp and Software Suspend 2 images. It +# searches all swap partitions on your machine, as well as Suspend2's +# filewriter files (by way of the hibernate script telling it where to find +# it). +# +# It should be called on boot, after mounting filesystems, but before enabling +# swap or clearing out /var/run. Copy this into /etc/init.d/ (or the appropriate +# place on your system), then add a symlink at the appropriate point on boot. +# On a Debian system, you would do this: +# update-rc.d hibernate-cleanup.sh start 31 S . +# +# On other SysV-based systems, you would do something like: +# ln -s ../init.d/hibernate-cleanup.sh /etc/rcS.d/S31hibernate-cleanup.sh + +HIBERNATE_FILEWRITER_TRAIL="/var/run/suspend2_filewriter_image_exists" + +get_part_label() { + local ID_FS_LABEL + + eval "$(vol_id -x $1 2> /dev/null)" + echo "$ID_FS_LABEL" +} + +get_part_uuid() { + local ID_FS_UUID + + eval "$(vol_id -x $1 2> /dev/null)" + echo "$ID_FS_UUID" +} + +get_swap_id() { + local line + fdisk -l 2>/dev/null | while read line; do + case "$line" in + /*Linux\ [sS]wap*) echo "${line%% *}" + esac + done +} + +clear_swap() { + local where wason label uuid + where=$1 + wason= + test x"$2" = x || label="-L $2" + test x"$3" = x || uuid="-U $3" + swapoff $where 2>/dev/null && wason=yes + mkswap $where $label $uuid > /dev/null || echo -n " (failed: $?)" + [ -n "$wason" ] && swapon $where +} + +check_swap_sig() { + local part="$(get_swap_id)" + local where what type rest p c dev label + while read where what type rest ; do + test "$type" = "swap" || continue + c=continue + dev= + label= + for p in $part ; do + case "$where" in + LABEL=* ) + test x"$(get_part_label $p)" = x"${where#LABEL=}" && { + c=: + dev=$p + label=${where#LABEL=} + } + ;; + UUID=* ) + test x"$(get_part_uuid $p)" = x"${where#UUID=}" && { + c=: + dev=$p + uuid=${where#UUID=} + } + ;; + * ) + test "$p" = "$where" && { + c=: + dev=$p + } + ;; + esac + done + $c + case "$(dd if=$dev bs=1 count=6 skip=4086 2>/dev/null)" in + ULSUSP|S1SUSP|S2SUSP|pmdisk|[zZ]*) + echo -n "$dev" + clear_swap $dev "$label" "$uuid" + echo -n ", " + esac + done < /etc/fstab +} + +check_filewriter_sig() { + local target + [ -f "$HIBERNATE_FILEWRITER_TRAIL" ] || return + read target < $HIBERNATE_FILEWRITER_TRAIL + [ -f "$target" ] || return + case "`dd \"if=$target\" bs=8 count=1 2>/dev/null`" in + HaveImag) + /bin/echo -ne "Suspend2\n\0\0" | dd "of=$target" bs=11 count=1 conv=notrunc 2>/dev/null + echo -n "$target, " + rm -f $HIBERNATE_FILEWRITER_TRAIL + esac +} + +case "$1" in +start) + echo -n "Invalidating stale software suspend images... " + check_swap_sig + check_filewriter_sig + echo "done." + ;; +stop|restart|force-reload) + ;; +*) + echo "Usage: /etc/init.d/hibernate {start|stop|restart|force-reload}" +esac + +exit 0 |