-$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 ?????????????????)
=======================================================================
a label exactly 16 bytes in length. Thanks to <minduni@ti-edu.ch>
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 <phil@fifi.org> for
+ the bug report and the patch.
+
Changes between versions 0.4b32 and 0.4b33 (released February 10, 2003)
=======================================================================
.\" 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
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
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
.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
#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 <config.h>
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));
}
#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 <config.h>
#define E_MINUTE 14
#define E_SECOND 17
#define E_YEAR 20
+#define E_TZOFFSET 25
static int lookup __P((const char *));
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';
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[] =