#include #include #include #include #include #include #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) { ssize_t readSize; 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 not found.\n"); exit(1); } HeaderStruct moduleHeader; readSize = read(archiveFile, &moduleHeader, sizeof(moduleHeader)); while (readSize > 0) { ; } return; } 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; readSize = read(archiveFile, &moduleHeader, sizeof(moduleHeader)); while (readSize > 0) { moduleSize = (long long) moduleHeader.moduleInfo.st_size; printf("Name: %s | Size: %lld\n", moduleHeader.moduleName, moduleSize); char moduleData[moduleSize]; read(archiveFile, &moduleData, moduleSize); readSize = read(archiveFile, &moduleHeader, sizeof(moduleHeader)); } return; } void ExtractArchive(char* argv[]) { ; }