* 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-2000
+ * Stelian Pop <stelian@popies.net>, 1999-2000
+ * Stelian Pop <stelian@popies.net> - AlcĂ´ve <www.alcove.com>, 2000-2002
*/
/*
#ifndef lint
static const char rcsid[] =
- "$Id: utilities.c,v 1.8 2000/02/08 12:22:43 stelian Exp $";
+ "$Id: utilities.c,v 1.20 2002/02/04 11:18:46 stelian Exp $";
#endif /* not lint */
+#include <config.h>
+#include <errno.h>
+#include <compaterr.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
#include <sys/param.h>
#include <sys/stat.h>
#ifdef __linux__
#include <sys/time.h>
+#include <time.h>
+#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>
#else /* __linux__ */
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#endif /* __linux__ */
-#include <errno.h>
-#include <compaterr.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef __linux__
-#include <ext2fs/ext2fs.h>
-#endif
-
#include "restore.h"
#include "extern.h"
void
pathcheck(char *name)
{
- register char *cp;
+ char *cp;
struct entry *ep;
char *start;
if (!Nflag && (ret = link(existing, new)) < 0) {
-#ifndef __linux__
+#if !defined(__linux__) && !defined(sunos)
struct stat s;
/*
return (GOOD);
}
-#ifndef __linux__
+#if !defined(__linux__) && !defined(sunos)
/*
* Create a whiteout.
*/
/*
* find lowest number file (above "start") that needs to be extracted
*/
-ino_t
-lowerbnd(ino_t start)
+dump_ino_t
+lowerbnd(dump_ino_t start)
{
- register struct entry *ep;
+ struct entry *ep;
for ( ; start < maxino; start++) {
ep = lookupino(start);
/*
* find highest number file (below "start") that needs to be extracted
*/
-ino_t
-upperbnd(ino_t start)
+dump_ino_t
+upperbnd(dump_ino_t start)
{
- register struct entry *ep;
+ struct entry *ep;
for ( ; start > ROOTINO; start--) {
ep = lookupino(start);
/*
* Check to see if a name is on a dump tape.
*/
-ino_t
+dump_ino_t
dirlookup(const char *name)
{
struct direct *dp;
- ino_t ino;
+ dump_ino_t ino;
ino = ((dp = pathsearch(name)) == NULL) ? 0 : dp->d_ino;
exit(1);
}
}
+
+#ifdef USE_QFA
+/*
+ * search for ino in QFA file
+ *
+ * if exactmatch:
+ * if ino found return tape number and tape position
+ * if ino not found return tnum=0 and tpos=0
+ *
+ * if not exactmatch:
+ * if ino found return tape number and tape position
+ * if ino not found return tape number and tape position of last smaller ino
+ * if no smaller inode found return tnum=0 and tpos=0
+ */
+int
+Inode2Tapepos(dump_ino_t ino, long *tnum, long long *tpos, int exactmatch)
+{
+ char *p, *pp;
+ char numbuff[32];
+ unsigned long tmpino;
+ long tmptnum;
+ long long tmptpos;
+
+ *tpos = 0;
+ *tnum = 0;
+ if (fseek(gTapeposfp, gSeekstart, SEEK_SET) == -1)
+ return errno;
+ while (fgets(gTps, sizeof(gTps), gTapeposfp) != NULL) {
+ gTps[strlen(gTps) - 1] = 0; /* delete end of line */
+ p = gTps;
+ bzero(numbuff, sizeof(numbuff));
+ pp = numbuff;
+ /* read inode */
+ while ((*p != 0) && (*p != '\t'))
+ *pp++ = *p++;
+ tmpino = atol(numbuff);
+ if (*p == 0)
+ return 1; /* may NOT happen */
+ p++;
+ bzero(numbuff, sizeof(numbuff));
+ pp = numbuff;
+ /* read tapenum */
+ while ((*p != 0) && (*p != '\t'))
+ *pp++ = *p++;
+ if (*p == 0)
+ return 1; /* may NOT happen */
+ tmptnum = atol(numbuff);
+ p++;
+ bzero(numbuff, sizeof(numbuff));
+ pp = numbuff;
+ /* read tapepos */
+ while ((*p != 0) && (*p != '\t'))
+ *pp++ = *p++;
+ tmptpos = atoll(numbuff);
+
+ if (exactmatch) {
+ if (tmpino == ino) {
+ *tnum = tmptnum;
+ *tpos = tmptpos;
+ return 0;
+ }
+ } else {
+ if (tmpino > ino) {
+ return 0;
+ } else {
+ *tnum = tmptnum;
+ *tpos = tmptpos;
+ }
+ }
+ }
+ return 0;
+}
+#endif /* USE_QFA */