-\r
-/**************************************************\r
-UZI (Unix Z80 Implementation) Utilities: mkfs.c\r
-***************************************************/\r
-\r
-#include <stdio.h>\r
-#include <stdint.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <sys/types.h>\r
-#include <unistd.h>\r
-#include <sys/stat.h>\r
-#include "fuzix_fs.h"\r
-\r
-/* This makes a filesystem \r
- *\r
- * example use:\r
- * ./mkfs ./blankfs.img 64 4096\r
- * (this will write a 2MB filesystem with 64 blocks of inodes to ./blankfs.img)\r
- *\r
- * */\r
-\r
-char zero512[512];\r
-\r
-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
-\r
-struct filesys fs_super;\r
-\r
-int main(int argc, char **argv)\r
-{\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
- return -1;\r
- }\r
-\r
- if(sizeof(inode) != 512){\r
- printf("inode is the wrong size -- %d\n", (int)sizeof(inode));\r
- }\r
-\r
- isize = (uint16_t)atoi(argv[2]);\r
- fsize = (uint16_t)atoi(argv[3]);\r
-\r
- if (fsize < 3 || isize < 2 || isize >= fsize)\r
- {\r
- printf("Bad parameter values\n");\r
- return -1;\r
- }\r
-\r
- memset(zero512, 0, 512);\r
-\r
- printf("Making filesystem on device %s with isize %u fsize %u.\n", argv[1], isize, fsize);\r
-\r
- if (fd_open(argv[1]))\r
- {\r
- printf("Can't open device");\r
- return -1;\r
- }\r
-\r
- mkfs(fsize, isize);\r
-\r
- return 0;\r
-}\r
-\r
-void mkfs(uint16_t fsize, uint16_t isize)\r
-{\r
- uint16_t j;\r
-\r
- /* Zero out the blocks */\r
-\r
- for (j=0; j < fsize; ++j)\r
- dwrite(j, zero512);\r
-\r
- /* Initialize the super-block */\r
-\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 = 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
- 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 = 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 = 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 = 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
- dwrite(1,(char *)&fs_super);\r
-}\r
-\r
-void dwrite(uint16_t blk, char *addr)\r
-{\r
- lseek(dev_fd, ((int)blk) * 512, SEEK_SET);\r
- if (write(dev_fd, addr, 512) != 512) {\r
- perror("write");\r
- exit(1);\r
- }\r
-}\r
+
+/**************************************************
+UZI (Unix Z80 Implementation) Utilities: mkfs.c
+***************************************************/
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include "fuzix_fs.h"
+
+/* This makes a filesystem
+ *
+ * example use:
+ * ./mkfs ./blankfs.img 64 4096
+ * (this will write a 2MB filesystem with 64 blocks of inodes to ./blankfs.img)
+ *
+ * */
+
+char zero512[512];
+
+direct dirbuf[64] = { {ROOTINODE,"."},
+ {ROOTINODE,".."} };
+struct dinode inode[8];
+int swizzling = 0;
+
+void mkfs(uint16_t fsize, uint16_t isize);
+void dwrite(uint16_t blk, char *addr);
+
+struct filesys fs_super;
+
+int main(int argc, char **argv)
+{
+ uint16_t fsize, isize;
+
+ if (argv[1] && strcmp(argv[1], "-X") == 0) {
+ swizzling = 1;
+ argv++;
+ argc--;
+ }
+ if (argc != 4)
+ {
+ printf("Usage: mkfs device isize fsize\n");
+ return -1;
+ }
+
+ if(sizeof(inode) != 512){
+ printf("inode is the wrong size -- %d\n", (int)sizeof(inode));
+ }
+
+ isize = (uint16_t)atoi(argv[2]);
+ fsize = (uint16_t)atoi(argv[3]);
+
+ if (fsize < 3 || isize < 2 || isize >= fsize)
+ {
+ printf("Bad parameter values\n");
+ return -1;
+ }
+
+ memset(zero512, 0, 512);
+
+ printf("Making filesystem on device %s with isize %u fsize %u.\n", argv[1], isize, fsize);
+
+ if (fd_open(argv[1]))
+ {
+ printf("Can't open device");
+ return -1;
+ }
+
+ mkfs(fsize, isize);
+
+ return 0;
+}
+
+void mkfs(uint16_t fsize, uint16_t isize)
+{
+ uint16_t j;
+
+ /* Zero out the blocks */
+
+ for (j=0; j < fsize; ++j)
+ dwrite(j, zero512);
+
+ /* Initialize the super-block */
+
+ fs_super.s_mounted = swizzle16(SMOUNTED); /* Magic number */
+ fs_super.s_isize = swizzle16(isize);
+ fs_super.s_fsize = swizzle16(fsize);
+ fs_super.s_nfree = swizzle16(1);
+ fs_super.s_free[0] = 0;
+ fs_super.s_tfree = 0;
+ fs_super.s_ninode = 0;
+ fs_super.s_tinode = swizzle16(8 * (isize-2) - 2);
+
+ /* Free each block, building the free list */
+ for (j= fsize-1; j >= isize+1; --j)
+ {
+ int n;
+ if (swizzle16(fs_super.s_nfree) == 50)
+ {
+ dwrite(j, (char *)&fs_super.s_nfree);
+ fs_super.s_nfree = 0;
+ }
+
+ fs_super.s_tfree = swizzle16(swizzle16(fs_super.s_tfree)+1);
+ n = swizzle16(fs_super.s_nfree);
+ fs_super.s_free[n++] = swizzle16(j);
+ fs_super.s_nfree = swizzle16(n);
+ }
+
+ /* The inodes are already zeroed out */
+ /* create the root dir */
+ inode[ROOTINODE].i_mode = F_DIR | (0777 & MODE_MASK);
+ inode[ROOTINODE].i_nlink = swizzle16(3);
+ inode[ROOTINODE].i_size = swizzle32(64);
+ inode[ROOTINODE].i_addr[0] = swizzle16(isize);
+
+ /* Reserve reserved inode */
+ inode[0].i_nlink = swizzle16(1);
+ inode[0].i_mode = ~0;
+
+ dwrite(2, (char *)inode);
+
+ dirbuf[0].d_ino = swizzle16(dirbuf[0].d_ino);
+ dirbuf[1].d_ino = swizzle16(dirbuf[1].d_ino);
+ dwrite(isize,(char *)dirbuf);
+
+ /* Write out super block */
+ dwrite(1,(char *)&fs_super);
+}
+
+void dwrite(uint16_t blk, char *addr)
+{
+ lseek(dev_fd, ((int)blk) * 512, SEEK_SET);
+ if (write(dev_fd, addr, 512) != 512) {
+ perror("write");
+ exit(1);
+ }
+}