/*
* Ported to Linux's Second Extended File System as part of the
* dump and restore backup suit
- * Remy Card <card@Linux.EU.Org>, 1994, 1995, 1996
- *
+ * Remy Card <card@Linux.EU.Org>, 1994-1997
+ * Stelian Pop <pop@cybercable.fr>, 1999-2000
*/
/*-
*/
#ifndef lint
-static char sccsid[] = "@(#)itime.c 8.1 (Berkeley) 6/5/93";
+static const char rcsid[] =
+ "$Id: itime.c,v 1.10 2000/03/01 10:16:05 stelian Exp $";
#endif /* not lint */
#include <sys/param.h>
#include <linux/ext2_fs.h>
#include <bsdcompat.h>
#include <sys/file.h>
+#include <unistd.h>
#else
#ifdef sunos
#include <sys/vnode.h>
#ifdef __STDC__
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#endif
#ifdef __linux__
static void readdumptimes __P((FILE *));
void
-initdumptimes()
+initdumptimes(int createdumpdates)
{
FILE *df;
strerror(errno));
/* NOTREACHED */
}
- /*
- * Dumpdates does not exist, make an empty one.
- */
- msg("WARNING: no file `%s', making an empty one\n", dumpdates);
- if ((df = fopen(dumpdates, "w")) == NULL) {
- quit("cannot create %s: %s\n", dumpdates,
- strerror(errno));
- /* NOTREACHED */
+ if (createdumpdates) {
+ /*
+ * Dumpdates does not exist, make an empty one.
+ */
+ msg("WARNING: no file `%s', making an empty one\n", dumpdates);
+ if ((df = fopen(dumpdates, "w")) == NULL) {
+ quit("cannot create %s: %s\n", dumpdates,
+ strerror(errno));
+ /* NOTREACHED */
+ }
+ (void) fclose(df);
+ if ((df = fopen(dumpdates, "r")) == NULL) {
+ quit("cannot read %s even after creating it: %s\n",
+ dumpdates, strerror(errno));
+ /* NOTREACHED */
+ }
}
+ else
+ msg("WARNING: no file `%s'\n", dumpdates);
+ }
+ if (df != NULL) {
+ (void) flock(fileno(df), LOCK_SH);
+ readdumptimes(df);
(void) fclose(df);
- if ((df = fopen(dumpdates, "r")) == NULL) {
- quit("cannot read %s even after creating it: %s\n",
- dumpdates, strerror(errno));
- /* NOTREACHED */
- }
}
- (void) flock(fileno(df), LOCK_SH);
- readdumptimes(df);
- (void) fclose(df);
}
static void
-readdumptimes(df)
- FILE *df;
+readdumptimes(FILE *df)
{
register int i;
register struct dumptime *dtwalk;
}
void
-getdumptime()
+getdumptime(int createdumpdates)
{
register struct dumpdates *ddp;
register int i;
spcl.c_ddate = 0;
lastlevel = '0';
- initdumptimes();
+ /* If this is a level 0 dump, and we're not updating
+ dumpdates, there's no point in trying to read
+ dumpdates. It may not exist yet, or may not be mounted. For
+ incrementals, we *must* read dumpdates (fail if it's not there!) */
+ if ( (level == lastlevel) && !createdumpdates)
+ return;
+ initdumptimes(createdumpdates);
+ if (ddatev == NULL)
+ return;
/*
* Go find the entry with the same name for a lower increment
* and older date
}
void
-putdumptime()
+putdumptime(void)
{
FILE *df;
register struct dumpdates *dtwalk;
}
static void
-dumprecout(file, what)
- FILE *file;
- struct dumpdates *what;
+dumprecout(FILE *file, struct dumpdates *what)
{
- if (fprintf(file, DUMPOUTFMT,
+ if (fprintf(file, "%s %c %s",
what->dd_name,
what->dd_level,
ctime(&what->dd_ddate)) < 0)
int recno;
static int
-getrecord(df, ddatep)
- FILE *df;
- struct dumpdates *ddatep;
+getrecord(FILE *df, struct dumpdates *ddatep)
{
char tbuf[BUFSIZ];
recno = 0;
- if ( (fgets(tbuf, sizeof (tbuf), df)) != tbuf)
+ if (fgets(tbuf, sizeof (tbuf), df) == NULL)
return(-1);
recno++;
if (makedumpdate(ddatep, tbuf) < 0)
}
static int
-makedumpdate(ddp, tbuf)
- struct dumpdates *ddp;
- char *tbuf;
+makedumpdate(struct dumpdates *ddp, char *tbuf)
{
- char un_buf[128];
+ char *tok;
+
+ /* device name */
+ if ( NULL == (tok = strsep( &tbuf, " ")) )
+ return(-1);
+ if ( strlen(tok) > MAXPATHLEN )
+ return(-1);
+ strcpy(ddp->dd_name, tok);
+
+ /* eat whitespace */
+ for( ; *tbuf == ' ' ; tbuf++);
+
+ /* dump level */
+ ddp->dd_level = *tbuf;
+ ++tbuf;
+
+ /* eat whitespace */
+ for( ; *tbuf == ' ' ; tbuf++);
- (void) sscanf(tbuf, DUMPINFMT, ddp->dd_name, &ddp->dd_level, un_buf);
- ddp->dd_ddate = unctime(un_buf);
+ /* dump date */
+ ddp->dd_ddate = unctime(tbuf);
if (ddp->dd_ddate < 0)
return(-1);
return(0);