Compare commits
No commits in common. "5f2c15daa69dd8bd557a707e078731681cd7a233" and "782d8db162b69ff1e07608edea32d6e1484b5932" have entirely different histories.
5f2c15daa6
...
782d8db162
8 changed files with 40 additions and 188 deletions
26
emmafs.h
26
emmafs.h
|
@ -1,26 +0,0 @@
|
||||||
#ifndef EMMAFS_H_
|
|
||||||
#define EMMAFS_H_
|
|
||||||
|
|
||||||
/* For now, this is just a collection of includes.
|
|
||||||
* This is for the purpose of avoid redundant importing of
|
|
||||||
* commonly used includes like stdlib, stdbool or errno,
|
|
||||||
* that are used in almost all files. It really is meant to make
|
|
||||||
* The beginning of reach file more readable.
|
|
||||||
* In the future, I will also use this to define some structs
|
|
||||||
* that are needed in many other places to help juggling
|
|
||||||
* loads of different includes. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // EMMAFS_H_
|
|
24
inode.c
24
inode.c
|
@ -1,25 +1 @@
|
||||||
#include "inode.h"
|
#include "inode.h"
|
||||||
|
|
||||||
Inode* find_inode(char filename[], struct inode_table* itable) {
|
|
||||||
for (uint32_t i = 0; i < itable->size; i++) {
|
|
||||||
if (strcmp(filename, itable->inodes[i]->name)) {
|
|
||||||
return itable->inodes[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool inode_exists(struct inode_table* itable, char filename[]) {
|
|
||||||
for (uint32_t i = 0; i < itable->size; i++) {
|
|
||||||
if (strcmp(filename, itable->inodes[i]->name)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void delete_inode(struct inode_table* itable, char filename[]) {
|
|
||||||
Inode* wanted_inode = find_inode(filename, itable);
|
|
||||||
free(wanted_inode);
|
|
||||||
wanted_inode = NULL;
|
|
||||||
}
|
|
||||||
|
|
54
inode.h
54
inode.h
|
@ -1,71 +1,33 @@
|
||||||
#ifndef INODE_H_
|
#ifndef INODE_H_
|
||||||
#define INODE_H_
|
#define INODE_H_
|
||||||
|
|
||||||
#include "emmafs.h"
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
typedef struct Inode Inode;
|
typedef struct Inode Inode;
|
||||||
|
|
||||||
enum permissions {
|
|
||||||
R = 1,
|
|
||||||
W = 2,
|
|
||||||
X = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
// NOTE: Add handling for the block bitmap for when a file is deleted and created. That's how you solve the issue of when a block is usable.
|
|
||||||
|
|
||||||
struct inode_table {
|
|
||||||
// the following keyword spam purely exist so I definitely see it with highlighting.
|
|
||||||
// NOTE, TODO, FIXME, DEPRECATED, HACK, IMPORTANT: always initialize all values to be null when the inode table is created!!!!
|
|
||||||
// TODO: Change currently hardcoded value to actually accurately describe the size of the filesystem, only for temporary purposes.
|
|
||||||
Inode* inodes[640000];
|
|
||||||
uint32_t size;
|
|
||||||
uint32_t used_inodes;
|
|
||||||
uint32_t free_inodes;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Inode {
|
struct Inode {
|
||||||
// file information
|
// file information
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32_t filesize;
|
uint32_t filesize;
|
||||||
|
|
||||||
// ownership and permissions
|
// ownership and permissions
|
||||||
uint8_t user_permissions;
|
uint16_t permissions;
|
||||||
uint8_t group_permissions;
|
|
||||||
|
|
||||||
// UID
|
|
||||||
uint16_t owner;
|
uint16_t owner;
|
||||||
// GID
|
|
||||||
uint16_t group;
|
uint16_t group;
|
||||||
|
|
||||||
// timestamps
|
// timestamps
|
||||||
tm created;
|
tm created;
|
||||||
tm last_modified;
|
tm last_modified;
|
||||||
|
|
||||||
// needed to determine file size
|
// fs attributes
|
||||||
|
uint32_t index;
|
||||||
uint16_t block_count;
|
uint16_t block_count;
|
||||||
|
block* data_block;
|
||||||
// Data block pointers!!
|
|
||||||
struct data_block* first_data_block;
|
|
||||||
struct data_block* second_data_block;
|
|
||||||
struct data_block* third_data_block;
|
|
||||||
struct data_block* fourth_data_block;
|
|
||||||
struct data_block* fifth_data_block;
|
|
||||||
struct data_block* sixth_data_block;
|
|
||||||
struct data_block* seventh_data_block;
|
|
||||||
struct data_block* eighth_data_block;
|
|
||||||
struct data_block* nineth_data_block;
|
|
||||||
struct data_block* tenth_data_block;
|
|
||||||
struct data_block* eleventh_data_block;
|
|
||||||
struct data_block* twelveth_data_block;
|
|
||||||
struct indirect_data_block* file_indirect_data_block;
|
|
||||||
struct doubly_indirect_data_block* file_doubly_indirect_data_block;
|
|
||||||
struct trebly_indirect_data_block* file_trebly_indirect_data_block;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Inode* create_empty_inode(char name[64], uint8_t user_permissions, uint8_t group_permissions, uint16_t owner, uint16_t group, struct data_block* data_block);
|
Inode* create_inode(char name[64], uint16_t owner, uint16_t group, block* data_block);
|
||||||
Inode* find_inode(char filename[64], struct inode_table* itable);
|
|
||||||
bool inode_exists(struct inode_table* itable, char filename[64]);
|
|
||||||
void delete_inode(struct inode_table* itable, char filename[64]);
|
|
||||||
|
|
||||||
#endif // INODE_H_
|
#endif // INODE_H_
|
||||||
|
|
25
io.c
25
io.c
|
@ -1,25 +0,0 @@
|
||||||
#include "io.h"
|
|
||||||
|
|
||||||
struct file_descriptor emmafs_stdin {
|
|
||||||
*inode = NONE;
|
|
||||||
off_t = NONE;
|
|
||||||
flags = NONE;
|
|
||||||
int ref_count = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Process* initialize_process() {
|
|
||||||
struct Process* new_proc = (struct Process*) malloc(sizeof(struct Process));
|
|
||||||
if (new_proc == NULL) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
perror("Failed memory allocation for Process");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
new_proc->fd_table[0] = emmafs_stdin;
|
|
||||||
}
|
|
||||||
|
|
||||||
int allocate_fd(struct Process proc, Inode inode, int flags, ...) {
|
|
||||||
va_list argptr;
|
|
||||||
va_start(argptr, flags);
|
|
||||||
|
|
||||||
va_end(argptr);
|
|
||||||
}
|
|
14
io.h
14
io.h
|
@ -3,15 +3,10 @@
|
||||||
|
|
||||||
#define MAX_FDS 1024
|
#define MAX_FDS 1024
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdlib.h>
|
||||||
#include "inode.h"
|
#include <sys/types.h>
|
||||||
|
|
||||||
enum Flags {
|
#include "inode.h"
|
||||||
O_READ = 1,
|
|
||||||
O_WRITE = 2,
|
|
||||||
O_APPEND = 4,
|
|
||||||
O_CREATE = 8
|
|
||||||
};
|
|
||||||
|
|
||||||
struct file_descriptor {
|
struct file_descriptor {
|
||||||
Inode *inode;
|
Inode *inode;
|
||||||
|
@ -24,8 +19,7 @@ struct Process {
|
||||||
struct file_descriptor fd_table[MAX_FDS];
|
struct file_descriptor fd_table[MAX_FDS];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Process* initialize_process();
|
int allocate_fd(struct Process proc, Inode inode, int flags);
|
||||||
int allocate_fd(struct Process proc, Inode inode, int flags, ...);
|
|
||||||
int emmafs_open(char name[]);
|
int emmafs_open(char name[]);
|
||||||
int emmafs_close(char name[]);
|
int emmafs_close(char name[]);
|
||||||
//int emmafs_read(int fd)
|
//int emmafs_read(int fd)
|
||||||
|
|
17
super.c
17
super.c
|
@ -9,6 +9,14 @@
|
||||||
#define VERSION 0.0.0.1
|
#define VERSION 0.0.0.1
|
||||||
#define BLOCKSIZE 4096
|
#define BLOCKSIZE 4096
|
||||||
|
|
||||||
|
uint32_t free_blocks;
|
||||||
|
uint32_t inode_count;
|
||||||
|
|
||||||
|
struct inode_table {
|
||||||
|
// TODO: Change currently hardcoded value to actually accurately describe the size of the filesystem, only for temporary purposes.
|
||||||
|
Inode* inodes[640000];
|
||||||
|
};
|
||||||
|
|
||||||
struct super_block {
|
struct super_block {
|
||||||
// fs info
|
// fs info
|
||||||
char version[8];
|
char version[8];
|
||||||
|
@ -27,4 +35,13 @@ struct super_block {
|
||||||
struct inode_table* inode_table;
|
struct inode_table* inode_table;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO: Do research on how the fuck to actually do this kind of Array operation
|
||||||
|
Inode* find_inode(char filename[], struct super_block sblock) {
|
||||||
|
struct inode_table* itable = sblock.inode_table;
|
||||||
|
// while (itable[inode] != NULL; inode++) {
|
||||||
|
// if (strcmp(filename, itable[inode]->filesize))
|
||||||
|
// }
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // SUPER_H_
|
#endif // SUPER_H_
|
||||||
|
|
11
util.c
11
util.c
|
@ -4,22 +4,21 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
// DEPRECATED(?) This code will likely never be used. I have to handle it differently.
|
// DEPRECATED(?) This code will likely never be used. I have to handle it differently.
|
||||||
int find_number_of_inodes(size_t fs_size) {
|
int find_number_of_inodes(uint64_t fs_size) {
|
||||||
int number_of_inodes = fs_size / BITS_PER_INODE;
|
int number_of_inodes = fs_size / BITS_PER_INODE;
|
||||||
return number_of_inodes;
|
return number_of_inodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: formerly part of inode. Now transferred to util because it's both used in Inodes and the Superblock. The superblock does include inode.h, but this makes the code ordering easier to understand.
|
// NOTE: formerly part of inode. Now transferred to util because it's both used in Inodes and the Superblock. The superblock does include inode.h, but this makes the code ordering easier to understand.
|
||||||
// FIXME: Make this actually return a timestamp and not an integer. Stupid Emma.
|
tm* get_local_time() {
|
||||||
//tmp get_local_time() {
|
return localtime(¤t_time);
|
||||||
// return localtime(¤t_time);
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
// TODO Implement file struct so this function can be implemented
|
// TODO Implement file struct so this function can be implemented
|
||||||
// uint16_t calc_needed_blocks(struct *file )
|
// uint16_t calc_needed_blocks(struct *file )
|
||||||
|
|
||||||
// returns in bytes.
|
// returns in bytes.
|
||||||
size_t get_file_size(uint16_t block_count) {
|
uint32_t get_file_size(uint16_t block_count) {
|
||||||
return BLOCKSIZE * block_count;
|
return BLOCKSIZE * block_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
57
util.h
57
util.h
|
@ -1,7 +1,8 @@
|
||||||
#ifndef BLOCK_H_
|
#ifndef BLOCK_H_
|
||||||
#define BLOCK_H_
|
#define BLOCK_H_
|
||||||
|
|
||||||
#include "emmafs.h"
|
#include <stdint.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
#define BLOCKSIZE 4096
|
#define BLOCKSIZE 4096
|
||||||
|
@ -9,67 +10,21 @@
|
||||||
#define BITS_PER_INODE 16384
|
#define BITS_PER_INODE 16384
|
||||||
|
|
||||||
typedef struct tm tm;
|
typedef struct tm tm;
|
||||||
|
typedef struct block block;
|
||||||
|
|
||||||
struct data_block {
|
struct block {
|
||||||
char data[BLOCKSIZE];
|
char data[BLOCKSIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct indirect_data_block {
|
|
||||||
struct data_block* first_data_block;
|
|
||||||
struct data_block* second_data_block;
|
|
||||||
struct data_block* third_data_block;
|
|
||||||
struct data_block* fourth_data_block;
|
|
||||||
struct data_block* fifth_data_block;
|
|
||||||
struct data_block* sixth_data_block;
|
|
||||||
struct data_block* seventh_data_block;
|
|
||||||
struct data_block* eighth_data_block;
|
|
||||||
struct data_block* nineth_data_block;
|
|
||||||
struct data_block* tenth_data_block;
|
|
||||||
struct data_block* eleventh_data_block;
|
|
||||||
struct data_block* twelveth_data_block;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct doubly_indirect_data_block {
|
|
||||||
struct data_block* first_indirect_data_block;
|
|
||||||
struct data_block* second_indirect_data_block;
|
|
||||||
struct data_block* third_indirect_data_block;
|
|
||||||
struct data_block* fourth_indirect_data_block;
|
|
||||||
struct data_block* fifth_indirect_data_block;
|
|
||||||
struct data_block* sixth_indirect_data_block;
|
|
||||||
struct data_block* seventh_indirect_data_block;
|
|
||||||
struct data_block* eighth_indirect_data_block;
|
|
||||||
struct data_block* nineth_indirect_data_block;
|
|
||||||
struct data_block* tenth_indirect_data_block;
|
|
||||||
struct data_block* eleventh_indirect_data_block;
|
|
||||||
struct data_block* twelveth_indirect_data_block;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct trebly_indirect_data_block {
|
|
||||||
struct data_block* first_doubly_indirect_data_block;
|
|
||||||
struct data_block* second_doubly_indirect_data_block;
|
|
||||||
struct data_block* third_doubly_indirect_data_block;
|
|
||||||
struct data_block* fourth_doubly_indirect_data_block;
|
|
||||||
struct data_block* fifth_doubly_indirect_data_block;
|
|
||||||
struct data_block* sixth_doubly_indirect_data_block;
|
|
||||||
struct data_block* seventh_doubly_indirect_data_block;
|
|
||||||
struct data_block* eighth_doubly_indirect_data_block;
|
|
||||||
struct data_block* nineth_doubly_indirect_data_block;
|
|
||||||
struct data_block* tenth_doubly_indirect_data_block;
|
|
||||||
struct data_block* eleventh_doubly_indirect_data_block;
|
|
||||||
struct data_block* twelveth_doubly_indirect_data_block;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct tm *local_time;
|
struct tm *local_time;
|
||||||
|
|
||||||
// Global Variables
|
// Global Variables
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
|
|
||||||
// Provide fs size in bytes
|
// Provide fs size in bytes
|
||||||
int find_number_of_inodes(size_t fs_size);
|
int find_number_of_inodes(uint64_t fs_size);
|
||||||
tm* get_local_time();
|
tm* get_local_time();
|
||||||
size_t get_file_size(uint16_t block_count);
|
uint32_t get_file_size(uint16_t block_count);
|
||||||
|
|
||||||
// DEPRECATED? Probably unneeded and will soon be removed. This should not be handled on the fs level.
|
|
||||||
uint16_t bytes_to_kb(uint32_t bytes);
|
uint16_t bytes_to_kb(uint32_t bytes);
|
||||||
uint16_t kb_to_mb(uint16_t kb);
|
uint16_t kb_to_mb(uint16_t kb);
|
||||||
uint16_t mb_to_gb(uint16_t mb);
|
uint16_t mb_to_gb(uint16_t mb);
|
||||||
|
|
Loading…
Reference in a new issue