diff --git a/Makefile b/Makefile index 1091a04..011aad7 100644 --- a/Makefile +++ b/Makefile @@ -6,22 +6,23 @@ all: compile link compile: gcc $(INC) -c -o build/main.o src/main.c - gcc $(INC) -c -o build/stuffy.o src/stuffy.c + gcc $(INC) -c -o build/fuse.o src/fuse.c + gcc $(INC) -c -o build/fuseactions.o src/fuseactions.c link: - gcc -o bin/stuffy.out build/stuffy.o build/main.o + gcc -o bin/fuse.out build/fuseactions.o build/fuse.o build/main.o test: testCompile testLink testExec testCompile: gcc $(INC) $(UNITY) -g -c -o build/unity.o $(UNITYPATH)/unity.c gcc $(INC) -c -o build/main.o src/main.c - gcc $(INC) -g -c -o build/stuffy.o src/stuffy.c + gcc $(INC) -g -c -o build/fuse.o src/fuse.c gcc $(INC) -g -c -o build/test.o test/test.c testLink: - gcc -g -o bin/test.out build/stuffy.o build/test.o build/unity.o - gcc -o bin/stuffy.out build/stuffy.o build/main.o + gcc -g -o bin/test.out build/fuse.o build/test.o build/unity.o + gcc -o bin/fuse.out build/fuse.o build/main.o testExec: ./bin/test.out diff --git a/include/fuse.h b/include/fuse.h new file mode 100644 index 0000000..3457ea9 --- /dev/null +++ b/include/fuse.h @@ -0,0 +1,27 @@ +#ifndef FUSE_H +#define FUSE_H + +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; + +void Fuse(int argc, char* argv[]); +void FuseCheckArgs(int argc, char* argv[], fuseArgStruct* fuseArgs); +void FuseGivenTest(fuseArgStruct* fuseArgs, char* programPath); +void FuseStructInit(fuseArgStruct* fuseStruct); +void FuseUsageError(char* programPath); +int zerosize(int fd); + +#endif diff --git a/include/fuseactions.h b/include/fuseactions.h new file mode 100644 index 0000000..63ed27f --- /dev/null +++ b/include/fuseactions.h @@ -0,0 +1,17 @@ +#ifndef FUSEACTIONS_H +#define FUSEACTIONS_H + +#define FSSIZE 10000000 + +extern unsigned char* fs; + +void mapfs(int fd); +void unmapfs(); +void formatfs(); +void loadfs(); +void lsfs(); +void addfilefs(char* fname); +void removefilefs(char* fname); +void extractfilefs(char* fname); + +#endif \ No newline at end of file diff --git a/include/fuze.h b/include/fuze.h deleted file mode 100644 index e69de29..0000000 diff --git a/src/fuse.c b/src/fuse.c index e69de29..250a4c7 100644 --- a/src/fuse.c +++ b/src/fuse.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fuse.h" +#include "fuseactions.h" + +// Main handler for Fuse +void Fuse(int argc, char* argv[]) +{ + fuseArgStruct fuseArgs; + FuseCheckArgs(argc, argv, &fuseArgs); + FuseGivenTest(&fuseArgs, argv[0]); +} + +// Originally given method for getting arguments +void FuseCheckArgs(int argc, char* argv[], fuseArgStruct* fuseArgs) +{ + int opt; + while ((opt = getopt(argc, argv, "la:r:e:")) != -1) + { + switch (opt) + { + case 'l': + fuseArgs->list = 1; + break; + case 'a': + fuseArgs->add = 1; + fuseArgs->toAdd = strdup(optarg); + break; + case 'r': + fuseArgs->remove = 1; + fuseArgs->toRemove = strdup(optarg); + break; + case 'e': + fuseArgs->extract = 1; + fuseArgs->toExtract = strdup(optarg); + break; + default: + FuseUsageError(argv[0]); + } + } +} + +// Given code for default functionality +void FuseGivenTest(fuseArgStruct* fuseArgs, char* programPath) +{ + if (!fuseArgs->filefsname) + FuseUsageError(programPath); + fuseArgs->fd = open(fuseArgs->fsname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); + if (fuseArgs->fd == -1) + { + perror("open failed"); + exit(EXIT_FAILURE); + } + if (zerosize(fuseArgs->fd)) + fuseArgs->newfs = 1; + if (fuseArgs->newfs) + { + if (lseek(fuseArgs->fd, FSSIZE-1, SEEK_SET) == -1) + { + perror("seek failed"); + exit(EXIT_FAILURE); + } + if (write(fuseArgs->fd, "\0", 1) == -1) + { + perror("write failed"); + exit(EXIT_FAILURE); + } + } + mapfs(fuseArgs->fd); + if (fuseArgs->newfs) + formatfs(); + loadfs(); + if (fuseArgs->add) + addfilefs(fuseArgs->toAdd); + if (fuseArgs->remove) + removefilefs(fuseArgs->toRemove); + if (fuseArgs->extract) + extractfilefs(fuseArgs->toExtract); + if(fuseArgs->list) + lsfs(); + unmapfs(); +} + +// Initialize entire fuseStruct +void FuseStructInit(fuseArgStruct* fuseStruct) +{ + fuseStruct->create = 0; + fuseStruct->list = 0; + fuseStruct->add = 0; + fuseStruct->remove = 0; + fuseStruct->extract = 0; + fuseStruct->toAdd = NULL; + fuseStruct->toRemove = NULL; + fuseStruct->toExtract = NULL; + fuseStruct->fsname = NULL; + fuseStruct->fd = -1; + fuseStruct->newfs = 0; + fuseStruct->filefsname = 0; +} + +// Print error if usage is wrong +void FuseUsageError(char* programPath) +{ + fprintf(stderr, "Usage %s [-l] [-a path] [-e path] [-r path] -f name\n", + programPath); + exit(EXIT_FAILURE); +} + +// Return bool of if the size is 0 +int zerosize(int fd) +{ + struct stat stats; + fstat(fd, &stats); + if(stats.st_size == 0) + return 1; + return 0; +} \ No newline at end of file diff --git a/src/fuseactions.c b/src/fuseactions.c new file mode 100644 index 0000000..e17b1d6 --- /dev/null +++ b/src/fuseactions.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include "fuseactions.h" + +unsigned char* fs; + +void mapfs(int fd) +{ + fs = mmap(NULL, FSSIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (fs == NULL) + { + perror("mmap failed"); + exit(EXIT_FAILURE); + } +} + +void unmapfs() +{ + munmap(fs, FSSIZE); +} + +void formatfs() +{ + +} + +void loadfs() +{ + +} + +void lsfs() +{ + +} + +void addfilefs(char* fname) +{ + +} + +void removefilefs(char* fname) +{ + +} + +void extractfilefs(char* fname) +{ + +} diff --git a/src/main.c b/src/main.c index e69de29..364981a 100644 --- a/src/main.c +++ b/src/main.c @@ -0,0 +1,7 @@ +#include "fuse.h" + +int main(int argc, char* argv[]) +{ + Fuse(argc, argv); + return 0; +}