Package: bcron
Version: 0.09-10
Severity: wishlist
A simple change to bcron-sched makes it so jobs can have custom
timezones instead of being constrained to the timezone in force when
the process began. Note that this change has not been extensively
tested.
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.24-1-686 (SMP w/1 CPU core)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages bcron depends on:
ii libbg1 1.104-2 BG Libraries Collection
ii libc6 2.7-10 GNU C Library: Shared libraries
Versions of packages bcron recommends:
ii bcron-run 0.09-10 Bruce's cron system
ii exim4-daemon-light [mail-tran 4.69-5+b1 lightweight Exim MTA (v4) daemon
ii runit 2.0.0-1 a UNIX init scheme with service su
ii ucspi-unix 0.36-3 UNIX-domain socket client-server c
-- no debconf information
--- bcron-0.09.orig/bcron-sched.c
+++ bcron-0.09/bcron-sched.c
@@ -1,3 +1,4 @@
+#include <string.h>
#include <sysdeps.h>
#include <systime.h>
#include <errno.h>
@@ -7,6 +8,7 @@
#include <misc/misc.h>
#include <msg/msg.h>
#include <msg/wrap.h>
+#include <str/env.h>
#include <str/iter.h>
#include <str/str.h>
#include <unix/nonblock.h>
@@ -38,6 +40,8 @@
{
struct ghashiter i;
struct job* job;
+ const char* tz = getenv("TZ");
+ const char* restore_tz = tz;
nexttime = next_minute(reftime.tv_sec, &nexttm);
@@ -45,10 +49,32 @@
ghashiter_loop(&i, &crontabs) {
for (job = ((struct crontabs_entry*)i.entry)->data.jobs;
job != 0; job = job->next) {
- if (job->nexttime == 0)
- job->nexttime = timespec_next(&job->times, nexttime, &nexttm);
+ if (job->nexttime == 0) {
+ /* Adjust nexttm for the timezone of this job: */
+ const char* new_tz = envstr_get(&job->environ, "TZ");
+ if ( ! ( new_tz == tz ||
+ new_tz && tz && strcmp(new_tz, tz) == 0 ) )
+ {
+ if ( new_tz ) {
+ setenv("TZ", new_tz, 1);
+ } else {
+ unsetenv("TZ");
+ }
+ tz = new_tz;
+ tzset();
+
+ /* Recompute the nexttm: */
+ next_minute(reftime.tv_sec, &nexttm);
+ }
+ job->nexttime = timespec_next(&job->times, nexttime, &nexttm);
+ }
}
}
+ if ( restore_tz ) {
+ setenv("TZ", restore_tz, 1);
+ } else {
+ unsetenv("TZ");
+ }
}
static void loadall(void)