#ifndef FUSE_H #define FUSE_H #include #define DEFAULTINODEMAX 128 #define DEFAULTBLOCKSIZE 512 // Size in bytes #define DEFAULTBLOCKMAX 16384 typedef struct fuseArgStruct { int create; int list; int add; int remove; int extract; char* toAdd; char* toRemove; char* toExtract; char* fsname; int fd; int newfs; int filefsname; } fuseArgStruct; typedef struct SuperBlock { blksize_t blockSize; blkcnt_t blockCount; unsigned long inodeCount; } SuperBlock; typedef struct FreeBlockList { int freeList[DEFAULTINODEMAX/32]; } FreeBlockList; // 128 Blocks typedef struct DataBlock { char byte[DEFAULTBLOCKSIZE]; } DataBlock; // typedef struct InodeInfo // { // // char filePath[256]; // // off_t fileSize; // ino_t inode; // unsigned int isDirectory : 1; // unsigned int isPrinted : 1; // unsigned int isValid : 1; // } InodeInfo; // Inode * 128 + number // Directblock == Files/Directories inside an inode? typedef struct DirectBlock { unsigned int isValid : 1; unsigned int isDirectory : 1; char name[256]; ino_t inode; off_t size; } DirectBlock; // Inode 0 is root // Inode * 128 typedef struct Inode { unsigned int isValid : 1; DirectBlock inodeBlocks[DEFAULTINODEMAX]; } Inode; typedef struct FileSystem { SuperBlock superBlock; FreeBlockList fbl; Inode inodes[DEFAULTINODEMAX]; DataBlock dataBlocks[DEFAULTBLOCKMAX]; } FileSystem; void Fuse(int argc, char* argv[]); void GetArguments(int argc, char* argv[], fuseArgStruct* fuseArgs); void OpenFS(fuseArgStruct* fuseArgs, char* programPath); FileSystem* SetupFS(fuseArgStruct* fuseArgs); void RunFuse(FileSystem* fs, fuseArgStruct* fuseArgs); void TearDownFS(void); void FuseStructInit(fuseArgStruct* fuseStruct); void FuseUsageError(char* programPath); int zerosize(int fd); int FindEmptyBitPosition(int number); ino_t GetFreeInodeNumber(Inode inodes[]); ino_t GetFreeBlockNumber(int fbl[]); void SetFileSystemDefaults(FileSystem* fs); void SetupRootDirectory(FileSystem* fs); #endif