diff options
author | Matias Linares <matiaslina@opmbx.org> | 2015-04-26 21:43:42 -0300 |
---|---|---|
committer | Matias Linares <matiaslina@opmbx.org> | 2015-04-26 21:43:42 -0300 |
commit | 2dd5cf430edaae01594d566c9f27d780c3ffb4ef (patch) | |
tree | 13111bc82a73e951d5d7c07865a206c025d15529 /mkfs.md/mkfs.c | |
download | medianinfs-2dd5cf430edaae01594d566c9f27d780c3ffb4ef.tar.gz |
Initial commit
Diffstat (limited to 'mkfs.md/mkfs.c')
-rw-r--r-- | mkfs.md/mkfs.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/mkfs.md/mkfs.c b/mkfs.md/mkfs.c new file mode 100644 index 0000000..37c6e6e --- /dev/null +++ b/mkfs.md/mkfs.c @@ -0,0 +1,90 @@ +#include "../defs.h" +#include "../inode.h" + +#include <fcntl.h> + +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include <stdio.h> +#include <time.h> + +#include <unistd.h> +#include <sys/stat.h> + +struct PACKED superblock { + uint16_t magic; + uint32_t free_size; + uint32_t max_size; +}; + +int main(int argc, char *argv[]) +{ + char *fs = NULL; + int fd = 0; + struct superblock *sb= NULL; + inode *rootdir = NULL; +#ifdef _HAS_TRACKED_INODE + direntry *dentry = NULL; +#endif + + if (argc != 2){ + printf("Uso: %s [file]\n" + "Necesita proveer un nombre para el filesystem", + argv[0]); + return -2; + } + + fd = open(argv[1], O_WRONLY | O_CREAT, 0777); + + fs = calloc (BLOCKS*BLOCK_SIZE, sizeof(char)); + if (!fs){ + fprintf(stderr, "No hay suficiente memoria para alocar el filesystem\n"); + return (1); + } + sb = (struct superblock *) fs; + + sb->magic = 0xF514; /* No hay ganas de hacer aritmetica con lo que esta en el defs.h */ + sb->max_size = BLOCK_SIZE * BLOCKPOOL_BLOCKS; + sb->free_size = BLOCK_SIZE * BLOCKPOOL_BLOCKS; + SET_BIT_1((char *)sb + FBB_OFFSET, 0); + /* El primer elemento del inodepool es el rootdir */ + SET_BIT_1((char*) sb + FIB_OFFSET, 1); + + + rootdir = (inode *) sb + INODEPOOL_OFFSET + sizeof(inode); + + rootdir->type = I_DIR; + rootdir->mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IRGRP | S_IROTH | S_IXOTH | S_IFDIR; + rootdir->uid = getuid(); + rootdir->gid = getgid(); + rootdir->indirect=2; + rootdir->atime = (uint32_t) time(NULL); + rootdir->ctime = (uint32_t) time(NULL); + rootdir->mtime = (uint32_t) time(NULL); + + rootdir->nlinks = 1; + +#ifndef _HAS_TRACKED_INODE + rootdir->size = 0; +#else + rootdir->size = sizeof(direntry); + /* Primer bloque */ + /*SET_BIT_1((char *)sb + FBB_OFFSET, 0); */ + dentry = (direntry *) sb + BLOCKPOOL_OFFSET; + dentry->inode = 0; + dentry->name[0] = '/'; + dentry->name[1] = '\0'; + dentry->symlink = 0; +#endif + + if ((write(fd, (void *) fs, BLOCKS*BLOCK_SIZE)) == -1){ + perror("write"); + close(fd); + return -1; + } + close(fd); + free(fs); + + return (0); +} |