124 lines
3.2 KiB
C
124 lines
3.2 KiB
C
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include "stuffy.h"
|
|
|
|
void Stuffy(int argc, char* argv[])
|
|
{
|
|
// Check for argument
|
|
int archiveAction = StuffyArgument(argc, argv);
|
|
if (archiveAction < 0)
|
|
{
|
|
fprintf(stderr, "Usage: stuffy.out [OPTION] [ARCHIVE] [FILE]");
|
|
exit(1);
|
|
}
|
|
// Perform action based on argument
|
|
StuffyAction(argv, archiveAction);
|
|
// Check for redirection
|
|
// If redirection, then perform redirection
|
|
return;
|
|
}
|
|
|
|
int StuffyArgument(int argc, char* argv[])
|
|
{
|
|
for (int i = 1; i < argc; i++)
|
|
{
|
|
if ((argv[i][0] == '-') && (argv[i][1] == 'a'))
|
|
return 0;
|
|
if ((argv[i][0] == '-') && (argv[i][1] == 'r'))
|
|
return 1;
|
|
if ((argv[i][0] == '-') && (argv[i][1] == 'l'))
|
|
return 2;
|
|
if ((argv[i][0] == '-') && (argv[i][1] == 'e'))
|
|
return 3;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void StuffyAction(char* argv[], int archiveAction)
|
|
{
|
|
if (archiveAction == 0)
|
|
AddToArchive(argv[2], argv[3]);
|
|
if (archiveAction == 1)
|
|
RemoveFromArchive(argv[2], argv[3]);
|
|
if (archiveAction == 2)
|
|
ListArchive(argv[2]);
|
|
if (archiveAction == 3)
|
|
ExtractArchive(argv);
|
|
}
|
|
|
|
int IsFileArchived(int archiveFile, char* fileName)
|
|
{
|
|
ssize_t readSize;
|
|
long long int moduleSize;
|
|
HeaderStruct moduleHeader;
|
|
readSize = read(archiveFile, &moduleHeader, sizeof(HeaderStruct));
|
|
if (!strcmp(moduleHeader.moduleName, fileName))
|
|
return 1;
|
|
while (readSize > 0)
|
|
{
|
|
moduleSize = (long long) moduleHeader.moduleInfo.st_size;
|
|
char moduleData[moduleSize];
|
|
readSize = read(archiveFile, &moduleData, moduleSize);
|
|
readSize = read(archiveFile, &moduleHeader, sizeof(HeaderStruct));
|
|
if (!strcmp(moduleHeader.moduleName, fileName))
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void AddToArchive(char* archiveName, char* fileName)
|
|
{
|
|
int archiveFile = open(archiveName, O_RDWR | O_CREAT, 0644);
|
|
if (archiveFile < 0)
|
|
{
|
|
fprintf(stderr, "%s failed to open.\n", archiveName);
|
|
exit(1);
|
|
}
|
|
if (IsFileArchived(archiveFile, fileName))
|
|
{
|
|
fprintf(stderr, "File already exists\n");
|
|
exit(1);
|
|
}
|
|
HeaderStruct newModuleHeader;
|
|
strcpy(newModuleHeader.moduleName, fileName);
|
|
stat(fileName, &(newModuleHeader.moduleInfo));
|
|
write(archiveFile, &newModuleHeader, sizeof(newModuleHeader));
|
|
long long int newModuleSize = (long long) newModuleHeader.moduleInfo.st_size;
|
|
char newModuleData[newModuleSize];
|
|
write(archiveFile, newModuleData, newModuleSize);
|
|
close(archiveFile);
|
|
return;
|
|
}
|
|
|
|
void RemoveFromArchive(char* archiveName, char* fileName)
|
|
{
|
|
;
|
|
}
|
|
|
|
void ListArchive(char* archiveName)
|
|
{
|
|
int archiveFile = open(archiveName, O_RDONLY);
|
|
ssize_t readSize;
|
|
long long int moduleSize;
|
|
if (archiveFile < 0)
|
|
{
|
|
fprintf(stderr, "%s does not exist.\n", archiveName);
|
|
exit(1);
|
|
}
|
|
HeaderStruct moduleHeader;
|
|
while (readSize > 0)
|
|
{
|
|
moduleSize = (long long) moduleHeader.moduleInfo.st_size;
|
|
char moduleData[moduleSize];
|
|
}
|
|
}
|
|
|
|
void ExtractArchive(char* argv[])
|
|
{
|
|
;
|
|
}
|