SCCS-vsn: sbin/fsck/dir.c 8.4
-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>
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