Extracted fixed and working

This commit is contained in:
TriantaTV 2022-11-11 00:29:37 -06:00
parent 22fadea36c
commit 074fb0507b
3 changed files with 13 additions and 22 deletions

View File

@ -27,7 +27,6 @@ void RemoveFromArchive(char* archiveName, char* filename);
void ListArchive(char* archiveName); void ListArchive(char* archiveName);
int Test_ListArchive(char* archiveName); int Test_ListArchive(char* archiveName);
void ExtractArchive(int argc, char* argv[]); void ExtractArchive(int argc, char* argv[]);
int _ExtractArchive(char* archiveName, char* filenameIn, int fd); int _ExtractArchive(char* archiveName, char* filenameIn);
void _ExtractArchiveToFile(char* filenameOut);
#endif #endif

View File

@ -4,6 +4,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h>
#include "stuffy.h" #include "stuffy.h"
// Put a module header into a HeaderStruct and read (skip) module data // Put a module header into a HeaderStruct and read (skip) module data
@ -148,7 +149,10 @@ void AddToArchive(char* archiveName, char* filename)
ssize_t readSize; ssize_t readSize;
ModuleStruct module; ModuleStruct module;
do do
{
readSize = ReadSingleModule(archiveFile, &(module)); readSize = ReadSingleModule(archiveFile, &(module));
free(module.moduleData);
}
while (readSize > 0); while (readSize > 0);
strcpy(module.moduleHeader.moduleName, filenameCleaned); strcpy(module.moduleHeader.moduleName, filenameCleaned);
stat(filename, &(module.moduleHeader.moduleInfo)); stat(filename, &(module.moduleHeader.moduleInfo));
@ -189,6 +193,7 @@ void RemoveFromArchive(char* archiveName, char* filename)
{ {
if (strcmp(module.moduleHeader.moduleName, filenameCleaned) != 0) if (strcmp(module.moduleHeader.moduleName, filenameCleaned) != 0)
WriteSingleModule(newArchiveFile, &module); WriteSingleModule(newArchiveFile, &module);
free(module.moduleData);
readSize = ReadSingleModule(archiveFile, &(module)); readSize = ReadSingleModule(archiveFile, &(module));
} }
close(archiveFile); close(archiveFile);
@ -213,6 +218,7 @@ void ListArchive(char* archiveName)
{ {
printf("Name: %s | Size: %ld\n", module.moduleHeader.moduleName, printf("Name: %s | Size: %ld\n", module.moduleHeader.moduleName,
module.moduleHeader.moduleInfo.st_size); module.moduleHeader.moduleInfo.st_size);
free(module.moduleData);
readSize = ReadSingleModule(archiveFile, &module); readSize = ReadSingleModule(archiveFile, &module);
} }
return; return;
@ -236,6 +242,7 @@ int Test_ListArchive(char* archiveName)
sizeTotal += sizeof(module.moduleHeader); sizeTotal += sizeof(module.moduleHeader);
sizeTotal += module.moduleHeader.moduleInfo.st_size; sizeTotal += module.moduleHeader.moduleInfo.st_size;
} }
free(module.moduleData);
} }
while (readSize > 0); while (readSize > 0);
return sizeTotal; return sizeTotal;
@ -243,9 +250,8 @@ int Test_ListArchive(char* archiveName)
// Extract data of name file from archive to stdout, which is then redirected // Extract data of name file from archive to stdout, which is then redirected
// Extracted data remains in archive // Extracted data remains in archive
int _ExtractArchive(char* archiveName, char* filenameIn, int fd) int _ExtractArchive(char* archiveName, char* filenameIn)
{ {
ssize_t readSize; ssize_t readSize;
ssize_t writeSize = 0; ssize_t writeSize = 0;
long long int moduleSize; long long int moduleSize;
@ -261,7 +267,8 @@ int _ExtractArchive(char* archiveName, char* filenameIn, int fd)
while (readSize > 0) while (readSize > 0)
{ {
if (strcmp(module.moduleHeader.moduleName, filenameCleaned) == 0) if (strcmp(module.moduleHeader.moduleName, filenameCleaned) == 0)
writeSize += write(1, module.moduleData, sizeof(module.moduleData)); writeSize += write(STDOUT_FILENO, module.moduleData, module.moduleHeader.moduleInfo.st_size);
free(module.moduleData);
readSize = ReadSingleModule(archiveFile, &(module)); readSize = ReadSingleModule(archiveFile, &(module));
} }
close(archiveFile); close(archiveFile);
@ -269,24 +276,9 @@ int _ExtractArchive(char* archiveName, char* filenameIn, int fd)
return writeSize; return writeSize;
} }
void _ExtractArchiveToFile(char* filenameOut)
{
int fd = open(filenameOut, O_WRONLY | O_CREAT, 0644);
char buffer[1024];
while (read(1, &buffer, sizeof(buffer)) > 0)
{
write(fd, &buffer, sizeof(buffer));
}
close(fd);
}
void ExtractArchive(int argc, char* argv[]) void ExtractArchive(int argc, char* argv[])
{ {
int writeSize; int writeSize;
writeSize = _ExtractArchive(argv[2], argv[3], 0); writeSize = _ExtractArchive(argv[2], argv[3]);
if (writeSize < 0)
return;
if (argc == 6)
_ExtractArchiveToFile(argv[5]);
return; return;
} }

View File

@ -105,7 +105,7 @@ void Test_ListArchive_Should_ListCorrectly(void)
void Test_ExtractArchive_Should_ExtractCorrectly(void) void Test_ExtractArchive_Should_ExtractCorrectly(void)
{ {
// TEST_IGNORE_MESSAGE("Implementation Required: ExtractArchive"); // TEST_IGNORE_MESSAGE("Implementation Required: ExtractArchive");
int outputFileSize = _ExtractArchive("test/files/newstuffyarchive.test", argv[3], 0); int outputFileSize = _ExtractArchive("test/files/newstuffyarchive.test", argv[3]);
TEST_ASSERT_GREATER_THAN(0, outputFileSize); TEST_ASSERT_GREATER_THAN(0, outputFileSize);
} }