#include #include #include #include #include #include #include #include #include "simple.h" int main(int argc, char *argv[]) { int fd, nbytes; ssize_t ret; struct simplefs_super_block sb; struct simplefs_inode root_inode; struct simplefs_inode welcomefile_inode; char welcomefile_name[] = "vanakkam"; char welcomefile_body[] = "Love is God. God is Love. Anbe Murugan.\n"; const uint64_t WELCOMEFILE_INODE_NUMBER = 2; const uint64_t WELCOMEFILE_DATABLOCK_NUMBER = 3; char *block_padding; struct simplefs_dir_record record; if (argc != 2) { printf("Usage: mkfs-simplefs \n"); return -1; } fd = open(argv[1], O_RDWR); if (fd == -1) { perror("Error opening the device"); return -1; } /* Begin writing of Block 0 - Super Block */ sb.version = 1; sb.magic = SIMPLEFS_MAGIC; sb.block_size = SIMPLEFS_DEFAULT_BLOCK_SIZE; /* One inode for rootdirectory and another for a welcome file that we are going to create */ sb.inodes_count = 2; /* FIXME: Free blocks management is not implemented yet */ sb.free_blocks = ~0; sb.free_blocks &= ~(1 << WELCOMEFILE_DATABLOCK_NUMBER); ret = write(fd, (char *)&sb, sizeof(sb)); if (ret != SIMPLEFS_DEFAULT_BLOCK_SIZE) { printf ("bytes written [%d] are not equal to the default block size\n", (int)ret); ret = -1; goto exit; } printf("Super block written succesfully\n"); /* End of writing of Block 0 - Super block */ /* Begin writing of Block 1 - Inode Store */ root_inode.mode = S_IFDIR; root_inode.inode_no = SIMPLEFS_ROOTDIR_INODE_NUMBER; root_inode.data_block_number = SIMPLEFS_ROOTDIR_DATABLOCK_NUMBER; root_inode.dir_children_count = 1; ret = write(fd, (char *)&root_inode, sizeof(root_inode)); if (ret != sizeof(root_inode)) { printf ("The inode store was not written properly. Retry your mkfs\n"); ret = -1; goto exit; } printf("root directory inode written succesfully\n"); welcomefile_inode.mode = S_IFREG; welcomefile_inode.inode_no = WELCOMEFILE_INODE_NUMBER; welcomefile_inode.data_block_number = WELCOMEFILE_DATABLOCK_NUMBER; welcomefile_inode.file_size = sizeof(welcomefile_body); ret = write(fd, (char *)&welcomefile_inode, sizeof(root_inode)); if (ret != sizeof(root_inode)) { printf ("The welcomefile inode was not written properly. Retry your mkfs\n"); ret = -1; goto exit; } printf("welcomefile inode written succesfully\n"); nbytes = SIMPLEFS_DEFAULT_BLOCK_SIZE - sizeof(root_inode) - sizeof(welcomefile_inode); block_padding = malloc(nbytes); ret = write(fd, block_padding, nbytes); if (ret != nbytes) { printf ("The padding bytes are not written properly. Retry your mkfs\n"); ret = -1; goto exit; } printf ("inode store padding bytes (after the two inodes) written sucessfully\n"); /* End of writing of Block 1 - inode Store */ /* Begin writing of Block 2 - Root Directory datablocks */ strcpy(record.filename, welcomefile_name); record.inode_no = WELCOMEFILE_INODE_NUMBER; nbytes = sizeof(record); ret = write(fd, (char *)&record, nbytes); if (ret != nbytes) { printf ("Writing the rootdirectory datablock (name+inode_no pair for welcomefile) has failed\n"); ret = -1; goto exit; } printf ("root directory datablocks (name+inode_no pair for welcomefile) written succesfully\n"); nbytes = SIMPLEFS_DEFAULT_BLOCK_SIZE - sizeof(record); block_padding = realloc(block_padding, nbytes); ret = write(fd, block_padding, nbytes); if (ret != nbytes) { printf ("Writing the padding for rootdirectory children datablock has failed\n"); ret = -1; goto exit; } printf ("padding after the rootdirectory children written succesfully\n"); /* End of writing of Block 2 - Root directory contents */ /* Begin writing of Block 3 - Welcome file contents */ nbytes = sizeof(welcomefile_body); ret = write(fd, welcomefile_body, nbytes); if (ret != nbytes) { printf("Writing welcomefile body has failed\n"); ret = -1; goto exit; } printf("welcomefilebody has been written succesfully\n"); /* End of writing of Block 3 - Welcome file contents */ ret = 0; exit: close(fd); return ret; }