check in temporary version with compatibility hacks
[unix-history] / usr / src / sbin / fsck / pass1.c
index 1e87677..9ec72f2 100644 (file)
@@ -2,26 +2,18 @@
  * Copyright (c) 1980, 1986 The Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1980, 1986 The Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * %sccs.include.redist.c%
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)pass1.c    5.11 (Berkeley) %G%";
+static char sccsid[] = "@(#)pass1.c    5.17 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
-#include <ufs/dinode.h>
-#include <ufs/fs.h>
+#include <ufs/ufs/dinode.h>
+#include <ufs/ffs/fs.h>
+#include <stdlib.h>
+#include <string.h>
 #include "fsck.h"
 
 static daddr_t badblk;
 #include "fsck.h"
 
 static daddr_t badblk;
@@ -71,9 +63,10 @@ pass1()
                                    bcmp((char *)dp->di_ib, (char *)zino.di_ib,
                                        NIADDR * sizeof(daddr_t)) ||
                                    dp->di_mode || dp->di_size) {
                                    bcmp((char *)dp->di_ib, (char *)zino.di_ib,
                                        NIADDR * sizeof(daddr_t)) ||
                                    dp->di_mode || dp->di_size) {
-                                       pfatal("PARTIALLY ALLOCATED INODE I=%u",
+                                       pfatal("PARTIALLY ALLOCATED INODE I=%lu",
                                                inumber);
                                        if (reply("CLEAR") == 1) {
                                                inumber);
                                        if (reply("CLEAR") == 1) {
+                                               dp = ginode(inumber);
                                                clearinode(dp);
                                                inodirty();
                                        }
                                                clearinode(dp);
                                                inodirty();
                                        }
@@ -82,14 +75,15 @@ pass1()
                                continue;
                        }
                        lastino = inumber;
                                continue;
                        }
                        lastino = inumber;
-                       if (dp->di_size < 0 ||
-                           dp->di_size + sblock.fs_bsize - 1 < 0) {
+                       if (/* dp->di_size < 0 || */
+                           dp->di_size + sblock.fs_bsize - 1 < dp->di_size) {
                                if (debug)
                                if (debug)
-                                       printf("bad size %d:", dp->di_size);
+                                       printf("bad size %lu:", dp->di_size);
                                goto unknown;
                        }
                        if (!preen && (dp->di_mode & IFMT) == IFMT &&
                            reply("HOLD BAD BLOCK") == 1) {
                                goto unknown;
                        }
                        if (!preen && (dp->di_mode & IFMT) == IFMT &&
                            reply("HOLD BAD BLOCK") == 1) {
+                               dp = ginode(inumber);
                                dp->di_size = sblock.fs_fsize;
                                dp->di_mode = IFREG|0600;
                                inodirty();
                                dp->di_size = sblock.fs_fsize;
                                dp->di_mode = IFREG|0600;
                                inodirty();
@@ -97,7 +91,7 @@ pass1()
                        ndb = howmany(dp->di_size, sblock.fs_bsize);
                        if (ndb < 0) {
                                if (debug)
                        ndb = howmany(dp->di_size, sblock.fs_bsize);
                        if (ndb < 0) {
                                if (debug)
-                                       printf("bad size %d ndb %d:",
+                                       printf("bad size %lu ndb %d:",
                                                dp->di_size, ndb);
                                goto unknown;
                        }
                                                dp->di_size, ndb);
                                goto unknown;
                        }
@@ -107,7 +101,7 @@ pass1()
                        for (j = ndb; j < NDADDR; j++)
                                if (dp->di_db[j] != 0) {
                                        if (debug)
                        for (j = ndb; j < NDADDR; j++)
                                if (dp->di_db[j] != 0) {
                                        if (debug)
-                                               printf("bad direct addr: %d\n",
+                                               printf("bad direct addr: %ld\n",
                                                        dp->di_db[j]);
                                        goto unknown;
                                }
                                                        dp->di_db[j]);
                                        goto unknown;
                                }
@@ -116,7 +110,7 @@ pass1()
                        for (; j < NIADDR; j++)
                                if (dp->di_ib[j] != 0) {
                                        if (debug)
                        for (; j < NIADDR; j++)
                                if (dp->di_ib[j] != 0) {
                                        if (debug)
-                                               printf("bad indirect addr: %d\n",
+                                               printf("bad indirect addr: %ld\n",
                                                        dp->di_ib[j]);
                                        goto unknown;
                                }
                                                        dp->di_ib[j]);
                                        goto unknown;
                                }
@@ -137,7 +131,10 @@ pass1()
                                }
                        }
                        if ((dp->di_mode & IFMT) == IFDIR) {
                                }
                        }
                        if ((dp->di_mode & IFMT) == IFDIR) {
-                               statemap[inumber] = DSTATE;
+                               if (dp->di_size == 0)
+                                       statemap[inumber] = DCLEAR;
+                               else
+                                       statemap[inumber] = DSTATE;
                                cacheino(dp, inumber);
                        } else
                                statemap[inumber] = FSTATE;
                                cacheino(dp, inumber);
                        } else
                                statemap[inumber] = FSTATE;
@@ -146,21 +143,23 @@ pass1()
                        (void)ckinode(dp, &idesc);
                        idesc.id_entryno *= btodb(sblock.fs_fsize);
                        if (dp->di_blocks != idesc.id_entryno) {
                        (void)ckinode(dp, &idesc);
                        idesc.id_entryno *= btodb(sblock.fs_fsize);
                        if (dp->di_blocks != idesc.id_entryno) {
-                               pwarn("INCORRECT BLOCK COUNT I=%u (%ld should be %ld)",
+                               pwarn("INCORRECT BLOCK COUNT I=%lu (%ld should be %ld)",
                                    inumber, dp->di_blocks, idesc.id_entryno);
                                if (preen)
                                        printf(" (CORRECTED)\n");
                                else if (reply("CORRECT") == 0)
                                        continue;
                                    inumber, dp->di_blocks, idesc.id_entryno);
                                if (preen)
                                        printf(" (CORRECTED)\n");
                                else if (reply("CORRECT") == 0)
                                        continue;
+                               dp = ginode(inumber);
                                dp->di_blocks = idesc.id_entryno;
                                inodirty();
                        }
                        continue;
        unknown:
                                dp->di_blocks = idesc.id_entryno;
                                inodirty();
                        }
                        continue;
        unknown:
-                       pfatal("UNKNOWN FILE TYPE I=%u", inumber);
+                       pfatal("UNKNOWN FILE TYPE I=%lu", inumber);
                        statemap[inumber] = FCLEAR;
                        if (reply("CLEAR") == 1) {
                                statemap[inumber] = USTATE;
                        statemap[inumber] = FCLEAR;
                        if (reply("CLEAR") == 1) {
                                statemap[inumber] = USTATE;
+                               dp = ginode(inumber);
                                clearinode(dp);
                                inodirty();
                        }
                                clearinode(dp);
                                inodirty();
                        }
@@ -180,8 +179,8 @@ pass1check(idesc)
 
        if ((anyout = chkrange(blkno, idesc->id_numfrags)) != 0) {
                blkerror(idesc->id_number, "BAD", blkno);
 
        if ((anyout = chkrange(blkno, idesc->id_numfrags)) != 0) {
                blkerror(idesc->id_number, "BAD", blkno);
-               if (++badblk >= MAXBAD) {
-                       pwarn("EXCESSIVE BAD BLKS I=%u",
+               if (badblk++ >= MAXBAD) {
+                       pwarn("EXCESSIVE BAD BLKS I=%lu",
                                idesc->id_number);
                        if (preen)
                                printf(" (SKIPPING)\n");
                                idesc->id_number);
                        if (preen)
                                printf(" (SKIPPING)\n");
@@ -198,8 +197,8 @@ pass1check(idesc)
                        setbmap(blkno);
                } else {
                        blkerror(idesc->id_number, "DUP", blkno);
                        setbmap(blkno);
                } else {
                        blkerror(idesc->id_number, "DUP", blkno);
-                       if (++dupblk >= MAXDUP) {
-                               pwarn("EXCESSIVE DUP BLKS I=%u",
+                       if (dupblk++ >= MAXDUP) {
+                               pwarn("EXCESSIVE DUP BLKS I=%lu",
                                        idesc->id_number);
                                if (preen)
                                        printf(" (SKIPPING)\n");
                                        idesc->id_number);
                                if (preen)
                                        printf(" (SKIPPING)\n");