Package: nvram-wakeup
Version: 0.97-12
Severity: normal

The calculation of a regular wake-up time in 
/usr/share/vdr/shutdown-hooks/S90.nvram-wakeup is too simplistic and yields 
wake-up times too far ahead in the future potentially leading to missed 
recordings in VDR. The 
bug is triggered e.g. with REGULAR_TIME=08:00 and REGULAR_DAYS=1 when executed 
between 00:00 and 07:59, yielding a wake-up time at 08:00 the next day.

The following patch seems to fix this problem for me:

--- /tmp/S90.nvram-wakeup.org   2007-11-13 23:43:57.000000000 +0100
+++ /tmp/S90.nvram-wakeup.new   2007-11-13 23:43:12.000000000 +0100
@@ -43,8 +43,55 @@
 
 TIMER=$1
 
+# convert the time representation 'HH:MM' into seconds from midnight
+function hm2sec ()
+{
+       local HM=$1
+       # extract hours
+       local HOUR=${HM%:*}
+       # remove leading zero
+       HOUR=${HOUR#0}
+       # extract minutes
+       local MIN=${HM#*:}
+       # remove leading zero
+       MIN=${MIN#0}
+       if [ $HOUR -lt 0 ] || [ $HOUR -gt 23 ] || [ $MIN -lt 0 ] || [ $MIN -gt 
59 ]; then
+               echo "Invalid input for hm2sec: $HM" >&2
+               return 2
+       else
+               echo $[ $HOUR * 3600 + $MIN * 60 ]
+       fi
+}
+
+# convert the local time zone into an offset in seconds
+function tz2sec ()
+{
+       local TZ=$(date +%z)
+       local TZHM=${TZ:1:2}:${TZ:3:2}
+       local SEC=$(hm2sec $TZHM)
+       local SIGN=${TZ:0:1}
+       [ $SIGN == '-' ] && SEC=$(( $SEC * -1 ))
+       echo $SEC
+}
+
 if [ $REGULAR_DAYS -gt 0 ]; then
-    REGULAR_TIMER=$((`date -d "$REGULAR_TIME" +%s` + $REGULAR_DAYS * 24 * 60 * 
60))
+       # GMT epoch
+       NOW=$(date +%s)
+       # epoch offset by local TZ
+       TZNOW=$[ $NOW + `tz2sec` ]
+       # wake-up interval in seconds
+       STRIDE=$(($REGULAR_DAYS * 24 * 3600))
+       # rounddown (TZNOW, STRIDE) -> midnight of the most recent wake-up 
interval
+       INTERVAL_BASE=$((($TZNOW / $STRIDE) * $STRIDE))
+       # REGULAR_TIME configuration option in seconds: offset into each 
wake-up interval to match configured time of day
+       INTERVAL_OFFSET=`hm2sec $REGULAR_TIME`
+       # base + offset -> time to wake up at - due to the addition, this may 
lie in the past or the future
+       WAKEUP_TIME=$(($INTERVAL_BASE + $INTERVAL_OFFSET))
+       # convert wake-up time to GMT
+       WAKEUP_TIME=$(($WAKEUP_TIME - `tz2sec`))
+       # if in the past, this wake-up interval has truly expired and we need 
to wake up at the next one
+       [ $WAKEUP_TIME -lt $NOW ] && WAKEUP_TIME=$(($WAKEUP_TIME + $STRIDE))
+       REGULAR_TIMER=$WAKEUP_TIME
 
     # when no vdr timer is set or vdr timer starts later than regular timer:
     if [ $TIMER -eq 0 ] || [ $TIMER -gt 0 -a $REGULAR_TIMER -lt $TIMER ] ; then

-- System Information:
Debian Release: 4.0
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.23.1
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages nvram-wakeup depends on:
ii  debconf [debconf-2.0]  1.5.11            Debian configuration management sy
ii  libc6                  2.3.6.ds1-13etch2 GNU C Library: Shared libraries
ii  makedev                2.3.1-83          creates device files in /dev

nvram-wakeup recommends no packages.

-- debconf information:
* nvram-wakeup/install_instruction:



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to