correct fix for LITTLE_ENDIAN in mkentry() (idea from mycroft)
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 9 Dec 1994 10:03:21 +0000 (02:03 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 9 Dec 1994 10:03:21 +0000 (02:03 -0800)
SCCS-vsn: sbin/fsck/dir.c 8.4

usr/src/sbin/fsck/dir.c

index 994ce51..bded430 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)dir.c      8.3 (Berkeley) %G%";
+static char sccsid[] = "@(#)dir.c      8.4 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -306,20 +306,28 @@ mkentry(idesc)
        dirp->d_reclen = oldlen;
        dirp = (struct direct *)(((char *)dirp) + oldlen);
        dirp->d_ino = idesc->id_parent; /* ino to be entered is in id_parent */
        dirp->d_reclen = oldlen;
        dirp = (struct direct *)(((char *)dirp) + oldlen);
        dirp->d_ino = idesc->id_parent; /* ino to be entered is in id_parent */
-       if (newinofmt) {
-               dirp->d_type = typemap[idesc->id_parent];
-               dirp->d_namlen = newent.d_namlen;
-       } else {
-#              if (BYTE_ORDER == LITTLE_ENDIAN)
-                       dirp->d_type = newent.d_namlen;
-                       dirp->d_namlen = 0;
-#              else
-                       dirp->d_type = 0;
-                       dirp->d_namlen = newent.d_namlen;
-#              endif
-       }
        dirp->d_reclen = newent.d_reclen;
        dirp->d_reclen = newent.d_reclen;
+       if (newinofmt)
+               dirp->d_type = typemap[idesc->id_parent];
+       else
+               dirp->d_type = 0;
+       dirp->d_namlen = newent.d_namlen;
        bcopy(idesc->id_name, dirp->d_name, (size_t)newent.d_namlen + 1);
        bcopy(idesc->id_name, dirp->d_name, (size_t)newent.d_namlen + 1);
+#      if (BYTE_ORDER == LITTLE_ENDIAN)
+               /*
+                * If the entry was split, dirscan() will only reverse the byte
+                * order of the original entry, and not the new one, before
+                * writing it back out.  So, we reverse the byte order here if
+                * necessary.
+                */
+               if (oldlen != 0 && !newinofmt && !doinglevel2) {
+                       u_char tmp;
+
+                       tmp = dirp->d_namlen;
+                       dirp->d_namlen = dirp->d_type;
+                       dirp->d_type = tmp;
+               }
+#      endif
        return (ALTERED|STOP);
 }
 
        return (ALTERED|STOP);
 }