#ifndef lint
static const char rcsid[] =
- "$Id: traverse.c,v 1.43 2002/02/04 11:18:46 stelian Exp $";
+ "$Id: traverse.c,v 1.47 2002/06/10 14:05:00 stelian Exp $";
#endif /* not lint */
#include <config.h>
#include <string.h>
#include <unistd.h>
#endif
+#include <errno.h>
#include <sys/param.h>
#include <sys/stat.h>
}
/* Auxiliary macro to pick up files changed since previous dump. */
+#define CSINCE(dp, t) \
+ ((dp)->di_ctime >= (t))
+#define MSINCE(dp, t) \
+ ((dp)->di_mtime >= (t))
#define CHANGEDSINCE(dp, t) \
- ((dp)->di_mtime >= (t) || (dp)->di_ctime >= (t))
+ (CSINCE(dp, t) || MSINCE(dp, t))
/* The NODUMP_FLAG macro tests if a file has the nodump flag. */
#ifdef UF_NODUMP
SETINO(ino, dumpdirmap);
if (WANTTODUMP(dp, ino)) {
SETINO(ino, dumpinomap);
+ if (!MSINCE(dp, spcl.c_ddate))
+ SETINO(ino, metainomap);
if (mode != IFREG && mode != IFDIR && mode != IFLNK)
*tapesize += 1;
else
ip = getino(dp->inode);
if (TSTINO(dp->inode, dumpinomap)) {
CLRINO(dp->inode, dumpinomap);
- CLRINO(dp->inode, usedinomap);
*tapesize -= blockest(ip);
}
- /* Add dir back to the dir map, to propagate nodump */
+ /* Add dir back to the dir map and remove from
+ * usedinomap to propagate nodump */
if ((ip->di_mode & IFMT) == IFDIR) {
SETINO(dp->inode, dumpdirmap);
+ CLRINO(dp->inode, usedinomap);
*ret |= HASSUBDIRS;
}
} else {
* Dump the contents of an inode to tape.
*/
void
-dumpino(struct dinode *dp, dump_ino_t ino)
+dumpino(struct dinode *dp, dump_ino_t ino, int metaonly)
{
unsigned long cnt;
fsizeT size, remaining;
#else
int ind_level;
#endif
- u_quad_t i_size = dp->di_size + ((u_quad_t) dp->di_size_high << 32);
+ u_quad_t i_size;
+
+ if (metaonly)
+ i_size = 0;
+ else
+ i_size = dp->di_size + ((u_quad_t) dp->di_size_high << 32);
if (newtape) {
newtape = 0;
#endif /* __linux__ */
spcl.c_type = TS_INODE;
spcl.c_count = 0;
+
+ if (metaonly && (dp->di_mode & S_IFMT)) {
+ spcl.c_flags |= DR_METAONLY;
+ spcl.c_count = 0;
+ writeheader(ino);
+ spcl.c_flags &= ~DR_METAONLY;
+ return;
+ }
+
switch (dp->di_mode & S_IFMT) {
case 0:
bread(daddr_t blkno, char *buf, int size)
{
int cnt, i;
- extern int errno;
loop:
#ifdef __linux__
goto loop;
}
if (cnt == -1)
- msg("read error from %s: %s: [block %d]: count=%d\n",
- disk, strerror(errno), blkno, size);
+ msg("read error from %s: %s: [block %d, ext2blk %d]: count=%d\n",
+ disk, strerror(errno), blkno,
+ dbtofsb(sblock, blkno), size);
else
- msg("short read error from %s: [block %d]: count=%d, got=%d\n",
- disk, blkno, size, cnt);
+ msg("short read error from %s: [block %d, ext2blk %d]: count=%d, got=%d\n",
+ disk, blkno, dbtofsb(sblock, blkno), size, cnt);
if (++breaderrors > breademax) {
msg("More than %d block read errors from %d\n",
breademax, disk);
if ((cnt = read(diskfd, buf, (int)dev_bsize)) == dev_bsize)
continue;
if (cnt == -1) {
- msg("read error from %s: %s: [sector %d]: count=%d\n",
- disk, strerror(errno), blkno, dev_bsize);
+ msg("read error from %s: %s: [sector %d, ext2blk %d]: count=%d\n",
+ disk, strerror(errno), blkno,
+ dbtofsb(sblock, blkno), dev_bsize);
continue;
}
- msg("short read error from %s: [sector %d]: count=%d, got=%d\n",
- disk, blkno, dev_bsize, cnt);
+ msg("short read error from %s: [sector %d, ext2blk %d]: count=%d, got=%d\n",
+ disk, blkno, dbtofsb(sblock, blkno), dev_bsize, cnt);
}
}