overwrite ".." if first entry, "." if second entry in directory
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Tue, 24 Jan 1984 10:32:47 +0000 (02:32 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Tue, 24 Jan 1984 10:32:47 +0000 (02:32 -0800)
SCCS-vsn: sbin/fsck/main.c 2.32

usr/src/sbin/fsck/main.c

index f370a3d..0dbd3e2 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-char version[] = "@(#)main.c   2.31 (Berkeley) %G%";
+char version[] = "@(#)main.c   2.32 (Berkeley) %G%";
 #endif
 
 #include <stdio.h>
 #endif
 
 #include <stdio.h>
@@ -878,7 +878,7 @@ pass2check(idesc)
         */
        if (idesc->id_entryno != 0)
                goto chk1;
         */
        if (idesc->id_entryno != 0)
                goto chk1;
-       if (dirp->d_ino != 0 && dirp->d_namlen == 1 && dirp->d_name[0] == '.') {
+       if (dirp->d_ino != 0 && strcmp(dirp->d_name, ".") == 0) {
                if (dirp->d_ino != idesc->id_number) {
                        direrr(idesc->id_number, "BAD INODE NUMBER FOR '.'");
                        dirp->d_ino = idesc->id_number;
                if (dirp->d_ino != idesc->id_number) {
                        direrr(idesc->id_number, "BAD INODE NUMBER FOR '.'");
                        dirp->d_ino = idesc->id_number;
@@ -892,7 +892,7 @@ pass2check(idesc)
        proto.d_namlen = 1;
        (void)strcpy(proto.d_name, ".");
        entrysize = DIRSIZ(&proto);
        proto.d_namlen = 1;
        (void)strcpy(proto.d_name, ".");
        entrysize = DIRSIZ(&proto);
-       if (dirp->d_ino != 0) {
+       if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") != 0) {
                pfatal("CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS %s\n",
                        dirp->d_name);
        } else if (dirp->d_reclen < entrysize) {
                pfatal("CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS %s\n",
                        dirp->d_name);
        } else if (dirp->d_reclen < entrysize) {
@@ -933,8 +933,7 @@ chk1:
                bzero((char *)dirp, n);
                dirp->d_reclen = n;
        }
                bzero((char *)dirp, n);
                dirp->d_reclen = n;
        }
-       if (dirp->d_ino != 0 && dirp->d_namlen == 2 &&
-           strcmp(dirp->d_name, "..") == 0) {
+       if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") == 0) {
                if (dirp->d_ino != idesc->id_parent) {
                        direrr(idesc->id_number, "BAD INODE NUMBER FOR '..'");
                        dirp->d_ino = idesc->id_parent;
                if (dirp->d_ino != idesc->id_parent) {
                        direrr(idesc->id_number, "BAD INODE NUMBER FOR '..'");
                        dirp->d_ino = idesc->id_parent;
@@ -944,7 +943,7 @@ chk1:
                goto chk2;
        }
        direrr(idesc->id_number, "MISSING '..'");
                goto chk2;
        }
        direrr(idesc->id_number, "MISSING '..'");
-       if (dirp->d_ino != 0) {
+       if (dirp->d_ino != 0 && strcmp(dirp->d_name, ".") != 0) {
                pfatal("CANNOT FIX, SECOND ENTRY IN DIRECTORY CONTAINS %s\n",
                        dirp->d_name);
        } else if (dirp->d_reclen < entrysize) {
                pfatal("CANNOT FIX, SECOND ENTRY IN DIRECTORY CONTAINS %s\n",
                        dirp->d_name);
        } else if (dirp->d_reclen < entrysize) {
@@ -958,9 +957,9 @@ chk1:
 chk2:
        if (dirp->d_ino == 0)
                return (ret|KEEPON);
 chk2:
        if (dirp->d_ino == 0)
                return (ret|KEEPON);
-       if (idesc->id_entryno >= 2 &&
-           dirp->d_namlen <= 2 &&
-           dirp->d_name[0] == '.') {
+       if (dirp->d_namlen <= 2 &&
+           dirp->d_name[0] == '.' &&
+           idesc->id_entryno >= 2) {
                if (dirp->d_namlen == 1) {
                        direrr(idesc->id_number, "EXTRA '.' ENTRY");
                        dirp->d_ino = 0;
                if (dirp->d_namlen == 1) {
                        direrr(idesc->id_number, "EXTRA '.' ENTRY");
                        dirp->d_ino = 0;