diff --git a/setter/src/amiga/frag.c b/setter/src/amiga/frag.c index da3c9db..e7706bb 100644 --- a/setter/src/amiga/frag.c +++ b/setter/src/amiga/frag.c @@ -22,9 +22,299 @@ Aaru Data Preservation Suite Copyright (C) 2011-2021 Natalia Portillo *****************************************************************************/ +#include +#include + +#include "../include/consts.h" #include "../include/defs.h" +#include "../log.h" void Fragmentation(const char* path, size_t clusterSize) { - // TODO + BPTR pathLock; + BPTR dirLock; + size_t halfCluster = clusterSize / 2; + size_t quarterCluster = clusterSize / 4; + size_t twoCluster = clusterSize * 2; + size_t threeQuartersCluster = halfCluster + quarterCluster; + size_t twoAndThreeQuartCluster = threeQuartersCluster + twoCluster; + unsigned char* buffer; + long i; + int ret; + BPTR h; + int rc, wRc, cRc; + + pathLock = Lock((CONST_STRPTR)path, SHARED_LOCK); + + if(!pathLock) + { + log_write("Error %d changing to specified path.\n", IoErr()); + return; + } + + CurrentDir(pathLock); + + dirLock = CreateDir((CONST_STRPTR) "FRAGS"); + + if(!dirLock) + { + log_write("Error %d creating working directory.\n", IoErr()); + return; + } + + CurrentDir(dirLock); + + log_write("Writing fragmented files:\n"); + + h = Open((CONST_STRPTR) "HALFCLST", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(halfCluster); + memset(buffer, 0, halfCluster); + + for(i = 0; i < halfCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, halfCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "HALFCLST", halfCluster, rc, wRc, cRc); + + h = Open((CONST_STRPTR) "QUARCLST", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(quarterCluster); + memset(buffer, 0, quarterCluster); + + for(i = 0; i < quarterCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, quarterCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write( + "\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "QUARCLST", quarterCluster, rc, wRc, cRc); + + h = Open((CONST_STRPTR) "TWOCLST", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, twoCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWOCLST", twoCluster, rc, wRc, cRc); + + h = Open((CONST_STRPTR) "TRQTCLST", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(threeQuartersCluster); + memset(buffer, 0, threeQuartersCluster); + + for(i = 0; i < threeQuartersCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, threeQuartersCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", + "TRQTCLST", + threeQuartersCluster, + rc, + wRc, + cRc); + + h = Open((CONST_STRPTR) "TWTQCLST", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(twoAndThreeQuartCluster); + memset(buffer, 0, twoAndThreeQuartCluster); + + for(i = 0; i < twoAndThreeQuartCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, twoAndThreeQuartCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", + "TWTQCLST", + twoAndThreeQuartCluster, + rc, + wRc, + cRc); + + h = Open((CONST_STRPTR) "TWO1", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, twoCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO1", twoCluster, rc, wRc, cRc); + + h = Open((CONST_STRPTR) "TWO2", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, twoCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO2", twoCluster, rc, wRc, cRc); + + h = Open((CONST_STRPTR) "TWO3", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, twoCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tDeleting \"TWO2\".\n"); + ret = DeleteFile((CONST_STRPTR) "TWO2"); + if(!ret) rc = errno; + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO3", twoCluster, rc, wRc, cRc); + + h = Open((CONST_STRPTR) "FRAGTHRQ", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(threeQuartersCluster); + memset(buffer, 0, threeQuartersCluster); + + for(i = 0; i < threeQuartersCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, threeQuartersCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tDeleting \"TWO1\".\n"); + ret = DeleteFile((CONST_STRPTR) "TWO1"); + if(!ret) rc = errno; + log_write("\tDeleting \"TWO3\".\n"); + ret = DeleteFile((CONST_STRPTR) "TWO3"); + if(!ret) rc = errno; + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", + "FRAGTHRQ", + threeQuartersCluster, + rc, + wRc, + cRc); + + h = Open((CONST_STRPTR) "FRAGSIXQ", MODE_NEWFILE); + rc = 0; + wRc = 0; + cRc = 0; + if(!h) rc = IoErr(); + else + { + buffer = malloc(twoAndThreeQuartCluster); + memset(buffer, 0, twoAndThreeQuartCluster); + + for(i = 0; i < twoAndThreeQuartCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + ret = Write(h, buffer, twoAndThreeQuartCluster); + if(ret < 0) wRc = IoErr(); + + ret = Close(h); + if(!ret) cRc = IoErr(); + free(buffer); + } + + log_write("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", + "FRAGSIXQ", + twoAndThreeQuartCluster, + rc, + wRc, + cRc); }