mkfs: add basics to allow wrong endian creation
authorAlan Cox <alan@etchedpixels.co.uk>
Sun, 30 Nov 2014 20:44:03 +0000 (20:44 +0000)
committerAlan Cox <alan@etchedpixels.co.uk>
Sun, 30 Nov 2014 20:44:03 +0000 (20:44 +0000)
Standalone/mkfs.c

index 9aa1c24..2deef27 100644 (file)
@@ -25,6 +25,7 @@ char zero512[512];
 direct dirbuf[64] = { {ROOTINODE,"."},\r
                       {ROOTINODE,".."} };\r
 struct dinode inode[8];\r
+int swizzling = 0;\r
 \r
 void mkfs(uint16_t fsize, uint16_t isize);\r
 void dwrite(uint16_t blk, char *addr);\r
@@ -35,6 +36,11 @@ int main(int argc, char **argv)
 {\r
     uint16_t fsize, isize;\r
 \r
+    if (argv[1] && strcmp(argv[1], "-X") == 0) {\r
+        swizzling = 1;\r
+        argv++;\r
+        argc--;\r
+    }\r
     if (argc != 4)\r
     {\r
         printf("Usage: mkfs device isize fsize\n");\r
@@ -80,41 +86,46 @@ void mkfs(uint16_t fsize, uint16_t isize)
 \r
     /* Initialize the super-block */\r
 \r
-    fs_super.s_mounted = SMOUNTED; /* Magic number */\r
-    fs_super.s_isize =  isize;\r
-    fs_super.s_fsize =  fsize;\r
-    fs_super.s_nfree =  1;\r
+    fs_super.s_mounted = swizzle16(SMOUNTED); /* Magic number */\r
+    fs_super.s_isize =  swizzle16(isize);\r
+    fs_super.s_fsize =  swizzle16(fsize);\r
+    fs_super.s_nfree =  swizzle16(1);\r
     fs_super.s_free[0] =  0;\r
     fs_super.s_tfree =  0;\r
     fs_super.s_ninode = 0;\r
-    fs_super.s_tinode =  8 * (isize-2) - 2;\r
+    fs_super.s_tinode =  swizzle16(8 * (isize-2) - 2);\r
 \r
     /* Free each block, building the free list */\r
     for (j= fsize-1; j >= isize+1; --j)\r
     {\r
-        if (fs_super.s_nfree == 50)\r
+        int n;\r
+        if (swizzle16(fs_super.s_nfree) == 50)\r
         {\r
             dwrite(j, (char *)&fs_super.s_nfree);\r
             fs_super.s_nfree = 0;\r
         }\r
 \r
-        ++fs_super.s_tfree;\r
-        fs_super.s_free[(fs_super.s_nfree)++] = j;\r
+        fs_super.s_tfree = swizzle16(swizzle16(fs_super.s_tfree)+1);\r
+        n = swizzle16(fs_super.s_nfree);\r
+        fs_super.s_free[n++] = swizzle16(j);\r
+        fs_super.s_nfree = swizzle16(n);\r
     }\r
 \r
     /* The inodes are already zeroed out */\r
     /* create the root dir */\r
     inode[ROOTINODE].i_mode = F_DIR | (0777 & MODE_MASK);\r
-    inode[ROOTINODE].i_nlink = 3;\r
-    inode[ROOTINODE].i_size = 64;\r
-    inode[ROOTINODE].i_addr[0] = isize;\r
+    inode[ROOTINODE].i_nlink = swizzle16(3);\r
+    inode[ROOTINODE].i_size = swizzle32(64);\r
+    inode[ROOTINODE].i_addr[0] = swizzle16(isize);\r
 \r
     /* Reserve reserved inode */\r
-    inode[0].i_nlink = 1;\r
+    inode[0].i_nlink = swizzle16(1);\r
     inode[0].i_mode = ~0;\r
 \r
     dwrite(2, (char *)inode);\r
 \r
+    dirbuf[0].d_ino = swizzle16(dirbuf[0].d_ino);\r
+    dirbuf[1].d_ino = swizzle16(dirbuf[1].d_ino);\r
     dwrite(isize,(char *)dirbuf);\r
 \r
     /* Write out super block */\r