2022-11-14 21:46:44 -06:00
|
|
|
#include <errno.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include "fuse.h"
|
|
|
|
#include "fuseactions.h"
|
|
|
|
|
|
|
|
// Main handler for Fuse
|
|
|
|
void Fuse(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
fuseArgStruct fuseArgs;
|
2022-11-17 19:43:46 -06:00
|
|
|
FuseGetArgs(argc, argv, &fuseArgs);
|
2022-11-14 21:46:44 -06:00
|
|
|
FuseGivenTest(&fuseArgs, argv[0]);
|
|
|
|
}
|
|
|
|
|
2022-11-16 16:08:14 -06:00
|
|
|
// New method for getting arguments
|
|
|
|
void FuseGetArgs(int argc, char* argv[], fuseArgStruct* fuseArgs)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < argc; i++)
|
|
|
|
{
|
|
|
|
if (argv[i][0] == '-' && argv[i][1] == 'l')
|
|
|
|
fuseArgs->list = 1;
|
|
|
|
if (argv[i][0] == '-' && argv[i][1] == 'a')
|
|
|
|
{
|
|
|
|
fuseArgs->add = 1;
|
|
|
|
fuseArgs->toAdd = strdup(argv[i+1]);
|
|
|
|
}
|
|
|
|
if (argv[i][0] == '-' && argv[i][1] == 'r')
|
|
|
|
{
|
|
|
|
fuseArgs->remove = 1;
|
|
|
|
fuseArgs->toRemove = strdup(argv[i+1]);
|
|
|
|
}
|
|
|
|
if (argv[i][0] == '-' && argv[i][1] == 'e')
|
|
|
|
{
|
|
|
|
fuseArgs->extract = 1;
|
|
|
|
fuseArgs->toExtract = strdup(argv[i+1]);
|
|
|
|
}
|
|
|
|
if (argv[i][0] == '-' && argv[i][1] == 'f')
|
|
|
|
{
|
|
|
|
fuseArgs->filefsname = 1;
|
|
|
|
fuseArgs->fsname = strdup(argv[i+1]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-14 21:46:44 -06:00
|
|
|
// Given code for default functionality
|
|
|
|
void FuseGivenTest(fuseArgStruct* fuseArgs, char* programPath)
|
|
|
|
{
|
2022-11-25 18:03:45 -06:00
|
|
|
FileSystemStruct fileSystem;
|
2022-11-14 21:46:44 -06:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
2022-11-25 18:03:45 -06:00
|
|
|
MapFS(&fileSystem, fuseArgs->fd);
|
2022-11-14 21:46:44 -06:00
|
|
|
if (fuseArgs->newfs)
|
2022-11-25 20:55:43 -06:00
|
|
|
FormatFS(&fileSystem);
|
|
|
|
LoadFS(&fileSystem);
|
2022-11-14 21:46:44 -06:00
|
|
|
if (fuseArgs->add)
|
2022-11-25 20:55:43 -06:00
|
|
|
AddFileToFS(&fileSystem, fuseArgs->toAdd);
|
2022-11-14 21:46:44 -06:00
|
|
|
if (fuseArgs->remove)
|
2022-11-25 20:55:43 -06:00
|
|
|
RemoveFileFromFS(&fileSystem, fuseArgs->toRemove);
|
2022-11-14 21:46:44 -06:00
|
|
|
if (fuseArgs->extract)
|
2022-11-25 20:55:43 -06:00
|
|
|
ExtractFileFromFS(&fileSystem, fuseArgs->toExtract);
|
2022-11-14 21:46:44 -06:00
|
|
|
if(fuseArgs->list)
|
2022-11-25 20:55:43 -06:00
|
|
|
ListFS(&fileSystem);
|
2022-11-25 18:03:45 -06:00
|
|
|
UnmapFS(&fileSystem);
|
2022-11-14 21:46:44 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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;
|
2022-11-16 16:08:14 -06:00
|
|
|
}
|
2022-11-25 18:03:45 -06:00
|
|
|
|
|
|
|
// Finds next empty bit in Free Block List
|
|
|
|
int FindEmptyBitPosition(int number)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
|
if ((~number & (1 << i)) == (1 << i))
|
|
|
|
return i;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|