From 3458b64d0f4e9c6b5bf43ba51c964bab8b716127 Mon Sep 17 00:00:00 2001 From: Stelian Pop Date: Thu, 6 Mar 2003 14:35:48 +0000 Subject: [PATCH] Store dumpdates with timezone --- CHANGES | 7 ++++++- dump/dump.8.in | 29 +++++++++++++++++++++++++---- dump/itime.c | 16 +++++++++++++--- dump/unctime.c | 17 ++++++++++++++--- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index d31eb69..f48efa3 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,4 @@ -$Id: CHANGES,v 1.218 2003/02/25 14:06:47 stelian Exp $ +$Id: CHANGES,v 1.219 2003/03/06 14:35:48 stelian Exp $ Changes between versions 0.4b33 and 0.4b34 (released ?????????????????) ======================================================================= @@ -32,6 +32,11 @@ Changes between versions 0.4b33 and 0.4b34 (released ?????????????????) a label exactly 16 bytes in length. Thanks to for reporting the bug. +8. Made dump store dump dates using explicit timezones, fixing a + problem with incremental dumps if the timezone is modified + between the dumps. Thanks to Philippe Troin for + the bug report and the patch. + Changes between versions 0.4b32 and 0.4b33 (released February 10, 2003) ======================================================================= diff --git a/dump/dump.8.in b/dump/dump.8.in index 23243bc..13fae88 100644 --- a/dump/dump.8.in +++ b/dump/dump.8.in @@ -30,7 +30,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dump.8.in,v 1.49 2003/02/04 12:24:40 stelian Exp $ +.\" $Id: dump.8.in,v 1.50 2003/03/06 14:35:51 stelian Exp $ .\" .TH DUMP 8 "version __VERSION__ of __DATE__" BSD "System management commands" .SH NAME @@ -367,7 +367,15 @@ determined from looking in The format of .I date is the same as that of -.BR ctime (3). +.BR ctime (3) +followed by an rfc822 timezone specification: either a plus or minus sign +followed by two digits for the number of hours and two digits for the minutes. +For example, -0800 for eight hours west of Greenwich or +0230 for two hours +and a half east of Greenwich. This timezone offset takes into account +daylight savings time (if applicable to the timezone): UTC offsets +when daylight savings time is in effect will be different than offsets +when daylight savings time is not in effect. For backward +compatibility, if no timezone is specified, a local time is assumed. This option is useful for automated dump scripts that wish to dump over a specific period of time. The .B \-T @@ -383,8 +391,12 @@ after a successful dump. The format of is readable by people, consisting of one free format record per line: filesystem name, increment level and .BR ctime (3) -format dump date. There may be only one entry per filesystem at each level. The -file +format dump date followed by a rfc822 timezone specification (see the +.B \-u +option for details). If no timezone offset is specified, times are interpreted +as local. Whenever the file is written, all dates in the file are converted +to the local time zone, without changing the UTC times. There +may be only one entry per filesystem at each level. The file .I __DUMPDATES__ may be edited to change any of the fields, if necessary. .TP @@ -551,6 +563,15 @@ to find group .BR rmt (8) .SH DIAGNOSTICS Many, and verbose. +.SH COMPATIBILITY +The format of the +.I __DUMPDATES__ +file has changed in release 0.4b34, however, the file will be read +correctly with either pre-0.4b34 or 0.4b34 and later versions of +.B dump +provided that the machine on which +.B dump +is run did not change timezones (which should be a fairly rare occurence). .SH EXIT STATUS .B Dump exits with zero status on success. Startup errors are indicated with an exit diff --git a/dump/itime.c b/dump/itime.c index aeaaec0..7b20ca2 100644 --- a/dump/itime.c +++ b/dump/itime.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: itime.c,v 1.23 2002/08/01 10:23:26 stelian Exp $"; + "$Id: itime.c,v 1.24 2003/03/06 14:35:51 stelian Exp $"; #endif /* not lint */ #include @@ -259,11 +259,21 @@ putdumptime(void) static void dumprecout(FILE *file, struct dumpdates *what) { + char buf[26]; + struct tm *tms; - if (fprintf(file, "%s %c %s", + tms = localtime(&what->dd_ddate); + strncpy(buf, asctime(tms), sizeof(buf)); + if (buf[24] != '\n' || buf[25] != '\0') + quit("asctime returned an unexpected string\n"); + buf[24] = 0; + if (fprintf(file, "%s %c %s %c%2.2d%2.2d\n", what->dd_name, what->dd_level, - ctime(&what->dd_ddate)) < 0) + buf, + (tms->tm_gmtoff < 0 ? '-' : '+'), + abs(tms->tm_gmtoff) / 3600, + abs(tms->tm_gmtoff) % 3600 / 60) < 0) quit("%s: %s\n", dumpdates, strerror(errno)); } diff --git a/dump/unctime.c b/dump/unctime.c index 7f20c34..733081a 100644 --- a/dump/unctime.c +++ b/dump/unctime.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: unctime.c,v 1.14 2002/01/25 15:08:59 stelian Exp $"; + "$Id: unctime.c,v 1.15 2003/03/06 14:35:51 stelian Exp $"; #endif /* not lint */ #include @@ -84,6 +84,7 @@ static const char rcsid[] = #define E_MINUTE 14 #define E_SECOND 17 #define E_YEAR 20 +#define E_TZOFFSET 25 static int lookup __P((const char *)); @@ -92,7 +93,9 @@ time_t unctime(const char *str) { struct tm then; - char dbuf[26]; + char dbuf[32]; + time_t rtime; + int tzoffset; (void) strncpy(dbuf, str, sizeof(dbuf) - 1); dbuf[sizeof(dbuf) - 1] = '\0'; @@ -105,7 +108,15 @@ unctime(const char *str) then.tm_sec = atoi(&dbuf[E_SECOND]); then.tm_year = atoi(&dbuf[E_YEAR]) - 1900; then.tm_isdst = -1; - return(mktime(&then)); + if (strlen(str) >= E_TZOFFSET+5) { + rtime = timegm(&then); + /* add timezone offset */ + tzoffset = atoi(&dbuf[E_TZOFFSET]); + rtime -= (tzoffset / 100 * 3600) + (tzoffset % 100) * 60; + } else { + rtime = timelocal(&then); + } + return(rtime); } static char months[] = -- 2.39.2