* Ported to Linux's Second Extended File System as part of the
* dump and restore backup suit
* Remy Card <card@Linux.EU.Org>, 1994-1997
- * Stelian Pop <pop@cybercable.fr>, 1999
- *
+ * Stelian Pop <pop@noos.fr>, 1999-2000
+ * Stelian Pop <pop@noos.fr> - AlcĂ´ve <www.alcove.fr>, 2000
*/
/*-
*/
#ifndef lint
-#if 0
-static char sccsid[] = "@(#)itime.c 8.1 (Berkeley) 6/5/93";
-#endif
static const char rcsid[] =
- "$Id: itime.c,v 1.4 1999/10/11 13:08:07 stelian Exp $";
+ "$Id: itime.c,v 1.20 2001/07/18 09:12:05 stelian Exp $";
#endif /* not lint */
+#include <config.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#ifdef __STDC__
+#include <stdlib.h>
+#include <string.h>
+#endif
+
#include <sys/param.h>
#include <sys/time.h>
+#include <time.h>
#ifdef __linux__
+#ifdef HAVE_EXT2FS_EXT2_FS_H
+#include <ext2fs/ext2_fs.h>
+#else
#include <linux/ext2_fs.h>
+#endif
+#include <ext2fs/ext2fs.h>
#include <bsdcompat.h>
#include <sys/file.h>
#include <unistd.h>
-#else
-#ifdef sunos
+#elif defined sunos
#include <sys/vnode.h>
#include <ufs/fsdir.h>
#else
#include <ufs/ufs/dinode.h>
#endif
-#endif
#include <protocols/dumprestore.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#ifdef __STDC__
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-#ifdef __linux__
-#include <ext2fs/ext2fs.h>
-#endif
-
#include "dump.h"
-struct dumpdates **ddatev = 0;
-int nddates = 0;
-int ddates_in = 0;
-struct dumptime *dthead = 0;
+struct dumpdates **ddatev;
+int nddates;
+int ddates_in;
+struct dumptime *dthead;
static void dumprecout __P((FILE *, struct dumpdates *));
static int getrecord __P((FILE *, struct dumpdates *));
{
register struct dumpdates *ddp;
register int i;
- char *fname;
- fname = disk;
#ifdef FDEBUG
msg("Looking for name %s in dumpdates = %s for level = %c\n",
- fname, dumpdates, level);
+ disk, dumpdates, level);
#endif
spcl.c_ddate = 0;
lastlevel = '0';
- /* if we're not going to update dumpdates, there's no point in reading
- it, particularly since /var might not be mounted... wait until here
- to benefit from the initialization of variables needed by parent */
- if (!uflag && level == lastlevel)
+ /* 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)
* and older date
*/
ITITERATE(i, ddp) {
- if (strncmp(fname, ddp->dd_name, sizeof (ddp->dd_name)) != 0)
+ if (strncmp(disk, ddp->dd_name, sizeof (ddp->dd_name)) != 0)
continue;
if (ddp->dd_level >= level)
continue;
-#ifdef __linux__
if (ddp->dd_ddate <= (time_t)spcl.c_ddate)
-#else
- if (ddp->dd_ddate <= spcl.c_ddate)
-#endif
continue;
spcl.c_ddate = ddp->dd_ddate;
lastlevel = ddp->dd_level;
register struct dumpdates *dtwalk;
register int i;
int fd;
- char *fname;
if(uflag == 0)
return;
quit("cannot rewrite %s: %s\n", dumpdates, strerror(errno));
fd = fileno(df);
(void) flock(fd, LOCK_EX);
- fname = disk;
free((char *)ddatev);
ddatev = 0;
nddates = 0;
quit("fseek: %s\n", strerror(errno));
spcl.c_ddate = 0;
ITITERATE(i, dtwalk) {
- if (strncmp(fname, dtwalk->dd_name,
+ if (strncmp(disk, dtwalk->dd_name,
sizeof (dtwalk->dd_name)) != 0)
continue;
if (dtwalk->dd_level != level)
(struct dumpdates *)calloc(1, sizeof (struct dumpdates));
nddates += 1;
found:
- (void) strncpy(dtwalk->dd_name, fname, sizeof (dtwalk->dd_name));
+ (void) strncpy(dtwalk->dd_name, disk, sizeof (dtwalk->dd_name));
dtwalk->dd_level = level;
dtwalk->dd_ddate = spcl.c_date;
if (ftruncate(fd, ftell(df)))
quit("ftruncate (%s): %s\n", dumpdates, strerror(errno));
(void) fclose(df);
- msg("level %c dump on %s", level,
-#ifdef __linux__
- spcl.c_date == 0 ? "the epoch\n" : ctime4(&spcl.c_date));
-#else
- spcl.c_date == 0 ? "the epoch\n" : ctime(&spcl.c_date));
-#endif
}
static void
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)
static int
makedumpdate(struct dumpdates *ddp, char *tbuf)
{
- char un_buf[BUFSIZ];
+ 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);
+ /* fstab entry */
+ ddp->dd_fstab = fstabsearch(ddp->dd_name);
return(0);
}