From 5b90ff52527a00c0e2323397185145dab4545c47 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 12 Mar 2021 01:31:24 +0000 Subject: [PATCH] Split MacOS code. --- setter/src/macos.c | 2158 -------------------------------- setter/src/macos/attr.c | 689 ++++++++++ setter/src/macos/deleted.c | 96 ++ setter/src/macos/dirdepth.c | 98 ++ setter/src/macos/filename.c | 107 ++ setter/src/macos/files.c | 96 ++ setter/src/macos/frag.c | 306 +++++ setter/src/macos/links.c | 164 +++ setter/src/{ => macos}/macos.h | 0 setter/src/{ => macos}/macos.r | 0 setter/src/macos/os.c | 85 ++ setter/src/macos/perms.c | 51 + setter/src/macos/rsrcfork.c | 261 ++++ setter/src/macos/sparse.c | 51 + setter/src/macos/time.c | 559 +++++++++ setter/src/macos/volume.c | 156 +++ setter/src/macos/xattr.c | 51 + 17 files changed, 2770 insertions(+), 2158 deletions(-) delete mode 100644 setter/src/macos.c create mode 100644 setter/src/macos/attr.c create mode 100644 setter/src/macos/deleted.c create mode 100644 setter/src/macos/dirdepth.c create mode 100644 setter/src/macos/filename.c create mode 100644 setter/src/macos/files.c create mode 100644 setter/src/macos/frag.c create mode 100644 setter/src/macos/links.c rename setter/src/{ => macos}/macos.h (100%) rename setter/src/{ => macos}/macos.r (100%) create mode 100644 setter/src/macos/os.c create mode 100644 setter/src/macos/perms.c create mode 100644 setter/src/macos/rsrcfork.c create mode 100644 setter/src/macos/sparse.c create mode 100644 setter/src/macos/time.c create mode 100644 setter/src/macos/volume.c create mode 100644 setter/src/macos/xattr.c diff --git a/setter/src/macos.c b/setter/src/macos.c deleted file mode 100644 index b450ef5..0000000 --- a/setter/src/macos.c +++ /dev/null @@ -1,2158 +0,0 @@ -/**************************************************************************** -Aaru Data Preservation Suite ------------------------------------------------------------------------------ - -Filename : macos.c -Author(s) : Natalia Portillo - ---[ Description ] ----------------------------------------------------------- - -Contains Mac OS code. - ---[ License ] --------------------------------------------------------------- - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - ------------------------------------------------------------------------------ -Copyright (C) 2011-2021 Natalia Portillo -*****************************************************************************/ - -#if defined(macintosh) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "macos.h" - -#include "include/consts.h" -#include "include/defs.h" - -void GetOsInfo() -{ - int32_t gestaltResponse; - OSErr rc; - - printf("OS information:\n"); - - rc = Gestalt(gestaltAUXVersion, &gestaltResponse); - if(!rc) { printf("Running under A/UX version 0x%08X\n", gestaltResponse); } - else - { - rc = Gestalt(gestaltSystemVersion, &gestaltResponse); - if(rc) { printf("Could not get Mac OS version.\n"); } - else - { - printf("Running under Mac OS version %d.%d.%d", - (gestaltResponse & 0xF00) >> 8, - (gestaltResponse & 0xF0) >> 4, - gestaltResponse & 0xF); - rc = Gestalt(gestaltSysArchitecture, &gestaltResponse); - if(!rc) - { - printf(" for "); - switch(gestaltResponse) - { - case 1: printf("Motorola 68k architecture."); break; - case 2: printf("PowerPC architecture."); break; - case 3: printf("x86 architecture."); break; - default: printf("unknown architecture code %d.", gestaltResponse); break; - } - } - printf("\n"); - } - rc = Gestalt(gestaltMacOSCompatibilityBoxAttr, &gestaltResponse); - if(!rc) { printf("Running under Classic.\n"); } - } -} - -void GetVolumeInfo(const char* path, size_t* clusterSize) -{ - OSErr rc; - Str255 str255; - HVolumeParam hpb; - XVolumeParam xpb; - int32_t gestaltResponse; - int16_t drvInfo; - int16_t refNum; - uint64_t totalBlocks; - uint64_t freeBlocks; - uint32_t crDate; - uint32_t lwDate; - uint32_t bkDate; - uint16_t fsId; - uint64_t totalBytes; - uint64_t freeBytes; - int hfsPlusApis = 0; - int bigVol = 0; - *clusterSize = 0; - - snprintf((char*)str255, 255, "%s", path); - - rc = Gestalt(gestaltFSAttr, &gestaltResponse); - if(!rc) - { - hfsPlusApis = gestaltResponse & (1 << gestaltHasHFSPlusAPIs); - bigVol = gestaltResponse & (1 << gestaltFSSupports2TBVols); - } - - if(!bigVol) - { - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - drvInfo = hpb.ioVDrvInfo; - refNum = hpb.ioVRefNum; - totalBlocks = hpb.ioVNmAlBlks; - freeBlocks = hpb.ioVFrBlk; - crDate = hpb.ioVCrDate; - lwDate = hpb.ioVLsMod; - bkDate = hpb.ioVBkUp; - fsId = hpb.ioVSigWord; - *clusterSize = hpb.ioVAlBlkSiz; - totalBytes = totalBlocks * *clusterSize; - freeBytes = freeBlocks * *clusterSize; - if(hpb.ioVFSID != 0) { fsId = hpb.ioVFSID; } - } - else - { - xpb.ioNamePtr = str255; - xpb.ioVRefNum = 0; - xpb.ioVolIndex = -1; - rc = PBXGetVolInfo((XVolumeParamPtr)&xpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - drvInfo = xpb.ioVDrvInfo; - refNum = xpb.ioVRefNum; - totalBlocks = xpb.ioVTotalBytes / xpb.ioVAlBlkSiz; - freeBlocks = xpb.ioVFreeBytes / xpb.ioVAlBlkSiz; - crDate = xpb.ioVCrDate; - lwDate = xpb.ioVLsMod; - bkDate = xpb.ioVBkUp; - fsId = xpb.ioVSigWord; - *clusterSize = xpb.ioVAlBlkSiz; - totalBytes = xpb.ioVTotalBytes; - freeBytes = xpb.ioVFreeBytes; - if(xpb.ioVFSID != 0) { fsId = xpb.ioVFSID; } - } - - printf("Volume information:\n"); - printf("\tPath: %s\n", path); - if(bigVol) { printf("\tVolume supports up to 2Tb disks.\n"); } - if(hfsPlusApis) { printf("\tVolume supports HFS Plus APIs.\n"); } - printf("\tDrive number: %d\n", drvInfo); - printf("\tVolume number: %d\n", refNum); - printf("\tVolume name: %#s\n", str255); - printf("\t%llu allocation blocks in volume, %llu free\n", totalBlocks, freeBlocks); - printf("\t%llu bytes in volume, %llu free\n", totalBytes, freeBytes); - printf("\t%d bytes per allocation block.\n", *clusterSize); - printf("\tVolume created on 0x%08X\n", crDate); - printf("\tVolume last written on 0x%08X\n", lwDate); - printf("\tVolume last backed up on 0x%08X\n", bkDate); - printf("\tFilesystem type: "); - switch(fsId) - { - case 0xD2D7: printf("MFS\n"); break; - case 0x4244: printf("HFS\n"); break; - case 0x482B: printf("HFS Plus\n"); break; - case 0x4147: printf("ISO9660\n"); break; - case 0x55DF: printf("UDF\n"); break; - case 0x4242: printf("High Sierra\n"); break; - case 0x4A48: printf("Audio CD\n"); break; - case 0x0100: printf("ProDOS\n"); break; - case 0x4953: printf("FAT\n"); break; - default: printf("unknown id 0x%04X\n", fsId); break; - } -} - -void FileAttributes(const char* path) -{ - OSErr rc, wRc, cRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - FInfo finderInfo; - int32_t count; - HFileInfo* fpb; - CInfoPBRec cipbr; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pATTRS", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating attribute files.\n"); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pNONE", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pNONE", 0, &refFile); - if(!rc) - { - count = strlen(noAttributeText); - wRc = FSWrite(refFile, &count, noAttributeText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - rc = HSetFInfo(refNum, dirId, "\pNONE", &finderInfo); - } - } - printf("\tFile with no attributes: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "NONE", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pINDESK", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pINDESK", 0, &refFile); - if(!rc) - { - count = strlen(desktopText); - wRc = FSWrite(refFile, &count, desktopText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kIsOnDesk; - rc = HSetFInfo(refNum, dirId, "\pINDESK", &finderInfo); - } - } - printf("\tFile is in desktop: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "INDESK", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pBROWN", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pBROWN", 0, &refFile); - if(!rc) - { - count = strlen(color2Text); - wRc = FSWrite(refFile, &count, color2Text); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0x02; - rc = HSetFInfo(refNum, dirId, "\pBROWN", &finderInfo); - } - } - printf("\tFile is colored brown: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "BROWN", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pGREEN", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pGREEN", 0, &refFile); - if(!rc) - { - count = strlen(color4Text); - wRc = FSWrite(refFile, &count, color4Text); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0x04; - rc = HSetFInfo(refNum, dirId, "\pGREEN", &finderInfo); - } - } - printf("\tFile is colored green: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "GREEN", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pLILAC", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pLILAC", 0, &refFile); - if(!rc) - { - count = strlen(color6Text); - wRc = FSWrite(refFile, &count, color6Text); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0x06; - rc = HSetFInfo(refNum, dirId, "\pLILAC", &finderInfo); - } - } - printf("\tFile is colored lilac: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "LILAC", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pBLUE", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pBLUE", 0, &refFile); - if(!rc) - { - count = strlen(color8Text); - wRc = FSWrite(refFile, &count, color8Text); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0x08; - rc = HSetFInfo(refNum, dirId, "\pBLUE", &finderInfo); - } - } - printf("\tFile is colored blue: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "BLUE", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pMAGENTA", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMAGENTA", 0, &refFile); - if(!rc) - { - count = strlen(colorAText); - wRc = FSWrite(refFile, &count, colorAText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0x0A; - rc = HSetFInfo(refNum, dirId, "\pMAGENTA", &finderInfo); - } - } - printf("\tFile is colored magenta: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "MAGENTA", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pRED", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pRED", 0, &refFile); - if(!rc) - { - count = strlen(colorCText); - wRc = FSWrite(refFile, &count, colorCText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0x0C; - rc = HSetFInfo(refNum, dirId, "\pRED", &finderInfo); - } - } - printf("\tFile is colored red: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "RED", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pORANGE", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pORANGE", 0, &refFile); - if(!rc) - { - count = strlen(colorEText); - wRc = FSWrite(refFile, &count, colorEText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0x0E; - rc = HSetFInfo(refNum, dirId, "\pORANGE", &finderInfo); - } - } - printf("\tFile is colored orange: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ORANGE", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pSWITCH", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pSWITCH", 0, &refFile); - if(!rc) - { - count = strlen(requireSwitchText); - wRc = FSWrite(refFile, &count, requireSwitchText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kRequireSwitchLaunch; - rc = HSetFInfo(refNum, dirId, "\pSWITCH", &finderInfo); - } - } - printf("\tFile require switch launch: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "SWITCH", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pSHARED", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pSHARED", 0, &refFile); - if(!rc) - { - count = strlen(sharedText); - wRc = FSWrite(refFile, &count, sharedText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kIsShared; - rc = HSetFInfo(refNum, dirId, "\pSHARED", &finderInfo); - } - } - printf("\tFile is shared: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "SHARED", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pNOINIT", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pNOINIT", 0, &refFile); - if(!rc) - { - count = strlen(noInitText); - wRc = FSWrite(refFile, &count, noInitText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kHasNoINITs; - rc = HSetFInfo(refNum, dirId, "\pNOINIT", &finderInfo); - } - } - printf("\tFile has no INITs: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "NOINIT", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pINITED", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pINITED", 0, &refFile); - if(!rc) - { - count = strlen(initedText); - wRc = FSWrite(refFile, &count, initedText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kHasBeenInited; - rc = HSetFInfo(refNum, dirId, "\pINITED", &finderInfo); - } - } - printf("\tFile has been INITed: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "INITED", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pAOCE", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pAOCE", 0, &refFile); - if(!rc) - { - count = strlen(aoceText); - wRc = FSWrite(refFile, &count, aoceText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kAOCE; - rc = HSetFInfo(refNum, dirId, "\pAOCE", &finderInfo); - } - } - printf("\tFile with AOCE set: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "AOCE", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pICON", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pICON", 0, &refFile); - if(!rc) - { - count = strlen(customIconText); - wRc = FSWrite(refFile, &count, customIconText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kHasCustomIcon; - rc = HSetFInfo(refNum, dirId, "\pICON", &finderInfo); - } - } - printf("\tFile has custom icon (not really): name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ICON", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pSTATIONERY", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pSTATIONERY", 0, &refFile); - if(!rc) - { - count = strlen(stationeryText); - wRc = FSWrite(refFile, &count, stationeryText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kIsStationery; - rc = HSetFInfo(refNum, dirId, "\pSTATIONERY", &finderInfo); - } - } - printf("\tFile is stationery: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "STATIONERY", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pLOCKED", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pLOCKED", 0, &refFile); - if(!rc) - { - count = strlen(nameLockText); - wRc = FSWrite(refFile, &count, nameLockText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kNameLocked; - rc = HSetFInfo(refNum, dirId, "\pLOCKED", &finderInfo); - } - } - printf("\tFile is locked: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "LOCKED", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pBUNDLE", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pBUNDLE", 0, &refFile); - if(!rc) - { - count = strlen(bundleText); - wRc = FSWrite(refFile, &count, bundleText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kHasBundle; - rc = HSetFInfo(refNum, dirId, "\pBUNDLE", &finderInfo); - } - } - printf("\tFile has bundle (not really): name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "BUNDLE", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pINVISIBLE", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pINVISIBLE", 0, &refFile); - if(!rc) - { - count = strlen(invisibleText); - wRc = FSWrite(refFile, &count, invisibleText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kIsInvisible; - rc = HSetFInfo(refNum, dirId, "\pINVISIBLE", &finderInfo); - } - } - printf("\tFile is invisible: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "INVISIBLE", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pALIAS", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pALIAS", 0, &refFile); - if(!rc) - { - count = strlen(aliasText); - wRc = FSWrite(refFile, &count, aliasText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = kIsAlias; - rc = HSetFInfo(refNum, dirId, "\pALIAS", &finderInfo); - } - } - printf("\tFile is alias to nowhere: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ALIAS", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pSIMPLE", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pSIMPLE", 0, &refFile); - if(!rc) - { - count = strlen(simpletextText); - wRc = FSWrite(refFile, &count, simpletextText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostSimpleText; - rc = HSetFInfo(refNum, dirId, "\pSIMPLE", &finderInfo); - } - } - printf("\tFile with creator SimpleText: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "SIMPLE", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pAARU", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pAARU", 0, &refFile); - if(!rc) - { - count = strlen(aaruText); - wRc = FSWrite(refFile, &count, aaruText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostAaru; - rc = HSetFInfo(refNum, dirId, "\pAARU", &finderInfo); - } - } - printf("\tFile with creator 'aaru': name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "AARU", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_M32_M32", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_M32_M32", 0, &refFile); - if(!rc) - { - count = strlen(pos_m32_m32); - wRc = FSWrite(refFile, &count, pos_m32_m32); - cRc = FSClose(refFile); - - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = -32768; - finderInfo.fdLocation.v = -32768; - rc = HSetFInfo(refNum, dirId, "\pPOS_M32_M32", &finderInfo); - } - } - printf("\tFile with position -32768,-32768: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", - "POS_M32_M32", - rc, - wRc, - cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_32_32", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_32_32", 0, &refFile); - if(!rc) - { - count = strlen(pos_32_32); - wRc = FSWrite(refFile, &count, pos_32_32); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = 32767; - finderInfo.fdLocation.v = 32767; - rc = HSetFInfo(refNum, dirId, "\pPOS_32_32", &finderInfo); - } - } - printf("\tFile with position 32767,32767: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_32_32", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_M1_M1", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_M1_M1", 0, &refFile); - if(!rc) - { - count = strlen(pos_m1_m1); - wRc = FSWrite(refFile, &count, pos_m1_m1); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = -1024; - finderInfo.fdLocation.v = -1024; - rc = HSetFInfo(refNum, dirId, "\pPOS_M1_M1", &finderInfo); - } - } - printf("\tFile with position -1024,-1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_M1", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_M1_M32", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_M1_M32", 0, &refFile); - if(!rc) - { - count = strlen(pos_m1_m32); - wRc = FSWrite(refFile, &count, pos_m1_m32); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = -1024; - finderInfo.fdLocation.v = -32768; - rc = HSetFInfo(refNum, dirId, "\pPOS_M1_M32", &finderInfo); - } - } - printf( - "\tFile with position -1024,-32768: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_M32", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_M1_32", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_M1_32", 0, &refFile); - if(!rc) - { - count = strlen(pos_m1_32); - wRc = FSWrite(refFile, &count, pos_m1_32); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = -1024; - finderInfo.fdLocation.v = 32767; - rc = HSetFInfo(refNum, dirId, "\pPOS_M1_32", &finderInfo); - } - } - printf("\tFile with position -1024,32767: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_32", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_M1_1", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_M1_1", 0, &refFile); - if(!rc) - { - count = strlen(pos_m1_1); - wRc = FSWrite(refFile, &count, pos_m1_1); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = -1024; - finderInfo.fdLocation.v = 1024; - rc = HSetFInfo(refNum, dirId, "\pPOS_M1_1", &finderInfo); - } - } - printf("\tFile with position -1024,1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_1", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_1_M1", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_1_M1", 0, &refFile); - if(!rc) - { - count = strlen(pos_1_m1); - wRc = FSWrite(refFile, &count, pos_1_m1); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = 1024; - finderInfo.fdLocation.v = -1024; - rc = HSetFInfo(refNum, dirId, "\pPOS_1_M1", &finderInfo); - } - } - printf("\tFile with position 1024,-1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_M1", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_1_M32", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_1_M32", 0, &refFile); - if(!rc) - { - count = strlen(pos_1_m32); - wRc = FSWrite(refFile, &count, pos_1_m32); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = 1024; - finderInfo.fdLocation.v = -32768; - rc = HSetFInfo(refNum, dirId, "\pPOS_1_M32", &finderInfo); - } - } - printf("\tFile with position 1024,-32768: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_M32", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_1_32", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_1_32", 0, &refFile); - if(!rc) - { - count = strlen(pos_1_32); - wRc = FSWrite(refFile, &count, pos_1_32); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = 1024; - finderInfo.fdLocation.v = 32767; - rc = HSetFInfo(refNum, dirId, "\pPOS_1_32", &finderInfo); - } - } - printf("\tFile with position 1024,32767: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_32", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPOS_1_1", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pPOS_1_1", 0, &refFile); - if(!rc) - { - count = strlen(pos_1_1); - wRc = FSWrite(refFile, &count, pos_1_1); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdLocation.h = 1024; - finderInfo.fdLocation.v = 1024; - rc = HSetFInfo(refNum, dirId, "\pPOS_1_1", &finderInfo); - } - } - printf("\tFile with position 1024,1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_1", rc, wRc, cRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pALL", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pALL", 0, &refFile); - if(!rc) - { - count = strlen(allText); - wRc = FSWrite(refFile, &count, allText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostUnknown; - finderInfo.fdFlags = 0xFFFF; - rc = HSetFInfo(refNum, dirId, "\pALL", &finderInfo); - } - } - printf("\tFile has all flags bits set: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ALL", rc, wRc, cRc); -} - -void FilePermissions(const char* path) -{ /* Do nothing, not supported by target operating system */ -} - -void ExtendedAttributes(const char* path) -{ /* Do nothing, not supported by target operating system */ -} - -static OSErr SaveResourceToNewFile(int16_t vRefNum, - int32_t dirID, - Str255 filename, - ResType type, - int16_t resId, - Str255 resName, - unsigned char* buffer, - size_t length) -{ - Handle h; - OSErr rc; - int16_t resRef; - - h = NewHandle(length); - - if(!h) return notEnoughMemoryErr; - - memcpy(*h, buffer, length); - - HCreateResFile(vRefNum, dirID, filename); - - resRef = HOpenResFile(vRefNum, dirID, filename, fsCurPerm); - rc = ResError(); - - if(resRef == -1 || rc) return rc; - - UseResFile(resRef); - - AddResource(h, type, resId, resName); - rc = ResError(); - - CloseResFile(resRef); - - DisposeHandle(h); - - return rc; -} - -void ResourceFork(const char* path) -{ - OSErr rc, wRc, cRc, rRc, rRc2, rRc3; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - FInfo finderInfo; - int32_t count; - HFileInfo* fpb; - CInfoPBRec cipbr; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pRSRC", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating resource forks.\n"); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pICON", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rRc = SaveResourceToNewFile(refNum, - dirId, - "\pICON", - rtIcons, - -16455, - "\pIcon resource", - (unsigned char*)IcnsResource, - sizeof(IcnsResource)); - rc = HOpenDF(refNum, dirId, "\pICON", 0, &refFile); - if(!rc) - { - count = strlen(rsrcText); - wRc = FSWrite(refFile, &count, rsrcText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostAaru; - finderInfo.fdFlags = kHasCustomIcon; - rc = HSetFInfo(refNum, dirId, "\pICON", &finderInfo); - } - } - printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d\n", - "ICON", - rc, - wRc, - cRc, - rRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pPICT", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rRc = SaveResourceToNewFile(refNum, - dirId, - "\pPICT", - ftPICTFile, - 29876, - "\pPicture resource", - (unsigned char*)PictResource, - sizeof(PictResource)); - rc = HOpenDF(refNum, dirId, "\pPICT", 0, &refFile); - if(!rc) - { - count = strlen(rsrcText); - wRc = FSWrite(refFile, &count, rsrcText); - cRc = FSClose(refFile); - finderInfo.fdType = ftPICTFile; - finderInfo.fdCreator = ostAaru; - rc = HSetFInfo(refNum, dirId, "\pPICT", &finderInfo); - } - } - printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d\n", - "PICT", - rc, - wRc, - cRc, - rRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pVERSION", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rRc = SaveResourceToNewFile(refNum, - dirId, - "\pVERSION", - rtVersion, - 1, - "\pVersion resource", - (unsigned char*)VersResource, - sizeof(VersResource)); - rc = HOpenDF(refNum, dirId, "\pVERSION", 0, &refFile); - if(!rc) - { - count = strlen(rsrcText); - wRc = FSWrite(refFile, &count, rsrcText); - cRc = FSClose(refFile); - finderInfo.fdType = ftGenericDocumentPC; - finderInfo.fdCreator = ostAaru; - rc = HSetFInfo(refNum, dirId, "\pVERSION", &finderInfo); - } - } - printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d\n", - "VERSION", - rc, - wRc, - cRc, - rRc); - - memset(&finderInfo, 0, sizeof(FInfo)); - rc = HCreate(refNum, dirId, "\pALL", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rRc = SaveResourceToNewFile(refNum, - dirId, - "\pALL", - rtIcons, - -16455, - "\pIcon resource", - (unsigned char*)IcnsResource, - sizeof(IcnsResource)); - rRc2 = SaveResourceToNewFile(refNum, - dirId, - "\pALL", - ftPICTFile, - 29876, - "\pPicture resource", - (unsigned char*)PictResource, - sizeof(PictResource)); - rRc3 = SaveResourceToNewFile(refNum, - dirId, - "\pALL", - rtVersion, - 1, - "\pVersion resource", - (unsigned char*)VersResource, - sizeof(VersResource)); - rc = HOpenDF(refNum, dirId, "\pALL", 0, &refFile); - if(!rc) - { - count = strlen(rsrcText); - wRc = FSWrite(refFile, &count, rsrcText); - cRc = FSClose(refFile); - finderInfo.fdType = ftPICTFile; - finderInfo.fdCreator = ostAaru; - finderInfo.fdFlags = kHasCustomIcon; - rc = HSetFInfo(refNum, dirId, "\pALL", &finderInfo); - } - } - printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d, rRc2 = " - "%d, rRc3 = %d\n", - "ALL", - rc, - wRc, - cRc, - rRc, - rRc2, - rRc3); -} - -void Filenames(const char* path) -{ - OSErr rc, wRc, cRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - FInfo finderInfo; - int32_t count; - char message[300]; - int pos = 0; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pFILENAME", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating files with different filenames.\n"); - - for(pos = 0; filenames[pos]; pos++) - { - count = strlen(filenames[pos]); - memset(&str255, 0, sizeof(Str255)); - if(count > 255) { continue; } - str255[0] = (char)count; - memcpy(str255 + 1, filenames[pos], count); - - rc = HCreate(refNum, dirId, str255, ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, str255, 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, FILENAME_FORMAT, filenames[pos]); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - } - - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", filenames[pos], rc, wRc, cRc); - } -} - -void Timestamps(const char* path) -{ - OSErr rc, wRc, cRc, tRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - FInfo finderInfo; - int32_t count; - HFileInfo* fpb; - CInfoPBRec cipbr; - char message[300]; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pTIMES", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating timestamped files.\n"); - - rc = HCreate(refNum, dirId, "\pMAXCTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMAXCTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "creation"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMAXCTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = MAXTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXCTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pMAXMTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMAXMTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "modification"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMAXMTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = MAXTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXMTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pMAXBTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMAXBTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "backup"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMAXBTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = MAXTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXBTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pMINCTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMINCTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "creation"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMINCTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = MINTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINCTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pMINMTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMINMTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "modification"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMINMTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = MINTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINMTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pMINBTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMINBTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "backup"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMINBTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = MINTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINBTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY2KCTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY2KCTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "creation"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY2KCTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = Y2KTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KCTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY2KMTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY2KMTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "modification"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY2KMTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = Y2KTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KMTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY2KBTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY2KBTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "backup"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY2KBTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = Y2KTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KBTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY1KCTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY1KCTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "creation"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY1KCTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = Y1KTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KCTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY1KMTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY1KMTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "modification"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY1KMTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = Y1KTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KMTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY1KBTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY1KBTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "backup"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY1KBTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = Y1KTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KBTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pMAXTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMAXTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "all"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMAXTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = MAXTIMESTAMP; - fpb->ioFlMdDat = MAXTIMESTAMP; - fpb->ioFlBkDat = MAXTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pMINTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pMINTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "all"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pMINTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = MINTIMESTAMP; - fpb->ioFlMdDat = MINTIMESTAMP; - fpb->ioFlBkDat = MINTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pNOTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pNOTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, NONDATETIME, "all"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pNOTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = NONTIMESTAMP; - fpb->ioFlMdDat = NONTIMESTAMP; - fpb->ioFlBkDat = NONTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "NOTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY2KTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY2KTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "all"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY2KTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = Y2KTIMESTAMP; - fpb->ioFlMdDat = Y2KTIMESTAMP; - fpb->ioFlBkDat = Y2KTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KTIME", rc, wRc, cRc, tRc); - - rc = HCreate(refNum, dirId, "\pY1KTIME", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pY1KTIME", 0, &refFile); - if(!rc) - { - memset(&message, 0, 300); - sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "all"); - count = strlen(message); - wRc = FSWrite(refFile, &count, message); - cRc = FSClose(refFile); - } - memset(&cipbr, 0, sizeof(CInfoPBRec)); - fpb = (HFileInfo*)&cipbr; - fpb->ioVRefNum = refNum; - fpb->ioNamePtr = "\pY1KTIME"; - fpb->ioDirID = dirId; - fpb->ioFDirIndex = 0; - PBGetCatInfoSync(&cipbr); - - fpb->ioFlCrDat = Y1KTIMESTAMP; - fpb->ioFlMdDat = Y1KTIMESTAMP; - fpb->ioFlBkDat = Y1KTIMESTAMP; - fpb->ioDirID = dirId; - tRc = PBSetCatInfoSync(&cipbr); - } - printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KTIME", rc, wRc, cRc, tRc); -} - -void DirectoryDepth(const char* path) -{ - OSErr rc, wRc, cRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - FInfo finderInfo; - int32_t count; - char filename[9]; - int pos = 0; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pDEPTH", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating deepest directory tree.\n"); - - while(!rc) - { - memset(&filename, 0, 9); - sprintf((char*)filename, "%08d", pos); - str255[0] = 8; - memcpy(str255 + 1, filename, 8); - - rc = DirCreate(refNum, dirId, str255, &dirId); - - pos++; - /* Mac OS has no limit, but it will crash because the catalog is single threaded */ - if(pos == 500) break; - } - - printf("\tCreated %d levels of directory hierarchy\n", pos); -} - -void Fragmentation(const char* path, size_t clusterSize) -{ - 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; - OSErr rc, wRc, cRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - int32_t count; - long i; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pFRAGS", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - rc = HCreate(refNum, dirId, "\pHALFCLST", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pHALFCLST", 0, &refFile); - if(!rc) - { - buffer = malloc(halfCluster); - memset(buffer, 0, halfCluster); - - for(i = 0; i < halfCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = halfCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "HALFCLST", halfCluster, rc, wRc, cRc); - - rc = HCreate(refNum, dirId, "\pQUARCLST", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pQUARCLST", 0, &refFile); - if(!rc) - { - buffer = malloc(quarterCluster); - memset(buffer, 0, quarterCluster); - - for(i = 0; i < quarterCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = quarterCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "QUARCLST", quarterCluster, rc, wRc, cRc); - - rc = HCreate(refNum, dirId, "\pTWOCLST", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pTWOCLST", 0, &refFile); - if(!rc) - { - buffer = malloc(twoCluster); - memset(buffer, 0, twoCluster); - - for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = twoCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWOCLST", twoCluster, rc, wRc, cRc); - - rc = HCreate(refNum, dirId, "\pTRQTCLST", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pTRQTCLST", 0, &refFile); - if(!rc) - { - buffer = malloc(threeQuartersCluster); - memset(buffer, 0, threeQuartersCluster); - - for(i = 0; i < threeQuartersCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = threeQuartersCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", - "TRQTCLST", - threeQuartersCluster, - rc, - wRc, - cRc); - - rc = HCreate(refNum, dirId, "\pTWOQCLST", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pTWOQCLST", 0, &refFile); - if(!rc) - { - buffer = malloc(twoAndThreeQuartCluster); - memset(buffer, 0, twoAndThreeQuartCluster); - - for(i = 0; i < twoAndThreeQuartCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = twoAndThreeQuartCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", - "TWTQCLST", - twoAndThreeQuartCluster, - rc, - wRc, - cRc); - - rc = HCreate(refNum, dirId, "\pTWO1", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pTWO1", 0, &refFile); - if(!rc) - { - buffer = malloc(twoCluster); - memset(buffer, 0, twoCluster); - - for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = twoCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO1", twoCluster, rc, wRc, cRc); - - rc = HCreate(refNum, dirId, "\pTWO2", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pTWO2", 0, &refFile); - if(!rc) - { - buffer = malloc(twoCluster); - memset(buffer, 0, twoCluster); - - for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = twoCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO2", twoCluster, rc, wRc, cRc); - - rc = HCreate(refNum, dirId, "\pTWO3", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pTWO3", 0, &refFile); - if(!rc) - { - buffer = malloc(twoCluster); - memset(buffer, 0, twoCluster); - - for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = twoCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tDeleting \"TWO2\".\n"); - rc = HDelete(refNum, dirId, "\pTWO2"); - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO3", twoCluster, rc, wRc, cRc); - - rc = HCreate(refNum, dirId, "\pFRAGTHRQ", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pFRAGTHRQ", 0, &refFile); - if(!rc) - { - buffer = malloc(threeQuartersCluster); - memset(buffer, 0, threeQuartersCluster); - - for(i = 0; i < threeQuartersCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = threeQuartersCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tDeleting \"TWO1\".\n"); - rc = HDelete(refNum, dirId, "\pTWO1"); - printf("\tDeleting \"TWO3\".\n"); - rc = HDelete(refNum, dirId, "\pTWO3"); - - rc = HCreate(refNum, dirId, "\pFRAGSIXQ", ostUnknown, ftGenericDocumentPC); - if(!rc) - { - rc = HOpenDF(refNum, dirId, "\pFRAGSIXQ", 0, &refFile); - if(!rc) - { - buffer = malloc(twoAndThreeQuartCluster); - memset(buffer, 0, twoAndThreeQuartCluster); - - for(i = 0; i < twoAndThreeQuartCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; - - count = twoAndThreeQuartCluster; - wRc = FSWrite(refFile, &count, buffer); - cRc = FSClose(refFile); - free(buffer); - } - } - - printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", - "FRAGSIXQ", - twoAndThreeQuartCluster, - rc, - wRc, - cRc); -} - -void Sparse(const char* path) -{ /* Do nothing, not supported by target operating system */ -} - -static pascal OSErr - - CreateAliasFile(const FSSpec* targetFile, const FSSpec* aliasFile, OSType fileCreator, OSType fileType) -{ - short rsrcID; - short aliasRefnum; - FInfo finf; - OSErr err; - AliasHandle alias; - - FSpCreateResFile(aliasFile, fileCreator, fileType, 0); - err = ResError(); - if(err != noErr) return err; - - err = NewAlias(aliasFile, targetFile, &alias); - if(err != noErr || alias == NULL) return err; - - aliasRefnum = FSpOpenResFile(aliasFile, fsRdWrPerm); - - AddResource((Handle)alias, rAliasType, 0, "\pAaru alias"); - err = ResError(); - - CloseResFile(aliasRefnum); - FSpGetFInfo(aliasFile, &finf); - - finf.fdCreator = fileCreator; - finf.fdType = fileType; - finf.fdFlags |= 0x8000; - finf.fdFlags &= (~0x0100); - - FSpSetFInfo(aliasFile, &finf); - - return err; -} - -void Links(const char* path) -{ - int32_t gestaltResponse; - OSErr rc, wRc, cRc, oRc, aRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - char filename[9]; - int pos = 0; - FSSpec targetSpec, aliasSpec; - int32_t count; - - rc = Gestalt(gestaltAliasMgrAttr, &gestaltResponse); - if(rc || !(gestaltResponse & (1 << gestaltAliasMgrPresent))) - { - printf("Alias Manager not present, cannot create aliases.\n"); - return; - } - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pLINKS", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating aliases.\n"); - - for(pos = 0; pos < 64; pos++) - { - memset(&filename, 0, 9); - sprintf((char*)filename, "TARGET%02d", pos); - str255[0] = 8; - memcpy(str255 + 1, filename, 8); - - rc = HCreate(refNum, dirId, str255, ostSimpleText, ftGenericDocumentPC); - - if(rc) break; - - oRc = HOpenDF(refNum, dirId, str255, 0, &refFile); - if(oRc) break; - - count = strlen(targetText); - wRc = FSWrite(refFile, &count, targetText); - cRc = FSClose(refFile); - - memset(&targetSpec, 0, sizeof(FSSpec)); - targetSpec.vRefNum = refNum; - targetSpec.parID = dirId; - targetSpec.name[0] = 8; - memcpy(targetSpec.name + 1, filename, 8); - - memset(&filename, 0, 9); - sprintf((char*)filename, "ALIAS_%02d", pos); - memset(&aliasSpec, 0, sizeof(FSSpec)); - aliasSpec.vRefNum = refNum; - aliasSpec.parID = dirId; - aliasSpec.name[0] = 8; - memcpy(aliasSpec.name + 1, filename, 8); - - aRc = CreateAliasFile(&targetSpec, &aliasSpec, ostSimpleText, ftGenericDocumentPC); - - if(aRc) break; - } - - printf("pos = %d, rc = %d, wRc = %d, cRc = %d, oRc = %d, aRc = %d\n", pos, rc, wRc, cRc, oRc, aRc); -} - -void MillionFiles(const char* path) -{ - OSErr rc, wRc, cRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - FInfo finderInfo; - int32_t count; - char filename[9]; - int pos = 0; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pMILLION", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating lots of files.\n"); - - for(pos = 0; pos < 5000; pos++) - { - memset(&filename, 0, 9); - sprintf((char*)filename, "%08d", pos); - str255[0] = 8; - memcpy(str255 + 1, filename, 8); - - rc = HCreate(refNum, dirId, str255, ostUnknown, ftGenericDocumentPC); - - if(rc) break; - } - - printf("\tCreated %d files\n", pos); -} - -void DeleteFiles(const char* path) -{ - OSErr rc, wRc, cRc; - Str255 str255; - HVolumeParam hpb; - int16_t refNum; - int16_t refFile; - int32_t dirId; - FInfo finderInfo; - int32_t count; - char filename[9]; - int pos = 0; - - snprintf((char*)str255, 255, "%s", path); - hpb.ioNamePtr = str255; - hpb.ioVRefNum = 0; - hpb.ioVolIndex = -1; - rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); - if(rc) - { - printf("Could not get volume information.\n"); - return; - } - refNum = hpb.ioVRefNum; - - rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pDELETED", &dirId); - if(rc) - { - printf("Error %d creating working directory.\n", rc); - return; - } - - printf("Creating and deleting files.\n"); - - for(pos = 0; pos < 64; pos++) - { - memset(&filename, 0, 9); - sprintf((char*)filename, "%08d", pos); - str255[0] = 8; - memcpy(str255 + 1, filename, 8); - - rc = HCreate(refNum, dirId, str255, ostUnknown, ftGenericDocumentPC); - - if(rc) break; - - HDelete(refNum, dirId, str255); - } -} -#endif diff --git a/setter/src/macos/attr.c b/setter/src/macos/attr.c new file mode 100644 index 0000000..1e1bff6 --- /dev/null +++ b/setter/src/macos/attr.c @@ -0,0 +1,689 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void FileAttributes(const char* path) +{ + OSErr rc, wRc, cRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + FInfo finderInfo; + int32_t count; + HFileInfo* fpb; + CInfoPBRec cipbr; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pATTRS", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating attribute files.\n"); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pNONE", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pNONE", 0, &refFile); + if(!rc) + { + count = strlen(noAttributeText); + wRc = FSWrite(refFile, &count, noAttributeText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + rc = HSetFInfo(refNum, dirId, "\pNONE", &finderInfo); + } + } + printf("\tFile with no attributes: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "NONE", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pINDESK", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pINDESK", 0, &refFile); + if(!rc) + { + count = strlen(desktopText); + wRc = FSWrite(refFile, &count, desktopText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kIsOnDesk; + rc = HSetFInfo(refNum, dirId, "\pINDESK", &finderInfo); + } + } + printf("\tFile is in desktop: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "INDESK", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pBROWN", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pBROWN", 0, &refFile); + if(!rc) + { + count = strlen(color2Text); + wRc = FSWrite(refFile, &count, color2Text); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0x02; + rc = HSetFInfo(refNum, dirId, "\pBROWN", &finderInfo); + } + } + printf("\tFile is colored brown: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "BROWN", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pGREEN", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pGREEN", 0, &refFile); + if(!rc) + { + count = strlen(color4Text); + wRc = FSWrite(refFile, &count, color4Text); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0x04; + rc = HSetFInfo(refNum, dirId, "\pGREEN", &finderInfo); + } + } + printf("\tFile is colored green: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "GREEN", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pLILAC", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pLILAC", 0, &refFile); + if(!rc) + { + count = strlen(color6Text); + wRc = FSWrite(refFile, &count, color6Text); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0x06; + rc = HSetFInfo(refNum, dirId, "\pLILAC", &finderInfo); + } + } + printf("\tFile is colored lilac: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "LILAC", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pBLUE", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pBLUE", 0, &refFile); + if(!rc) + { + count = strlen(color8Text); + wRc = FSWrite(refFile, &count, color8Text); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0x08; + rc = HSetFInfo(refNum, dirId, "\pBLUE", &finderInfo); + } + } + printf("\tFile is colored blue: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "BLUE", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pMAGENTA", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMAGENTA", 0, &refFile); + if(!rc) + { + count = strlen(colorAText); + wRc = FSWrite(refFile, &count, colorAText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0x0A; + rc = HSetFInfo(refNum, dirId, "\pMAGENTA", &finderInfo); + } + } + printf("\tFile is colored magenta: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "MAGENTA", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pRED", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pRED", 0, &refFile); + if(!rc) + { + count = strlen(colorCText); + wRc = FSWrite(refFile, &count, colorCText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0x0C; + rc = HSetFInfo(refNum, dirId, "\pRED", &finderInfo); + } + } + printf("\tFile is colored red: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "RED", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pORANGE", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pORANGE", 0, &refFile); + if(!rc) + { + count = strlen(colorEText); + wRc = FSWrite(refFile, &count, colorEText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0x0E; + rc = HSetFInfo(refNum, dirId, "\pORANGE", &finderInfo); + } + } + printf("\tFile is colored orange: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ORANGE", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pSWITCH", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pSWITCH", 0, &refFile); + if(!rc) + { + count = strlen(requireSwitchText); + wRc = FSWrite(refFile, &count, requireSwitchText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kRequireSwitchLaunch; + rc = HSetFInfo(refNum, dirId, "\pSWITCH", &finderInfo); + } + } + printf("\tFile require switch launch: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "SWITCH", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pSHARED", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pSHARED", 0, &refFile); + if(!rc) + { + count = strlen(sharedText); + wRc = FSWrite(refFile, &count, sharedText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kIsShared; + rc = HSetFInfo(refNum, dirId, "\pSHARED", &finderInfo); + } + } + printf("\tFile is shared: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "SHARED", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pNOINIT", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pNOINIT", 0, &refFile); + if(!rc) + { + count = strlen(noInitText); + wRc = FSWrite(refFile, &count, noInitText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kHasNoINITs; + rc = HSetFInfo(refNum, dirId, "\pNOINIT", &finderInfo); + } + } + printf("\tFile has no INITs: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "NOINIT", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pINITED", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pINITED", 0, &refFile); + if(!rc) + { + count = strlen(initedText); + wRc = FSWrite(refFile, &count, initedText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kHasBeenInited; + rc = HSetFInfo(refNum, dirId, "\pINITED", &finderInfo); + } + } + printf("\tFile has been INITed: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "INITED", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pAOCE", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pAOCE", 0, &refFile); + if(!rc) + { + count = strlen(aoceText); + wRc = FSWrite(refFile, &count, aoceText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kAOCE; + rc = HSetFInfo(refNum, dirId, "\pAOCE", &finderInfo); + } + } + printf("\tFile with AOCE set: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "AOCE", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pICON", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pICON", 0, &refFile); + if(!rc) + { + count = strlen(customIconText); + wRc = FSWrite(refFile, &count, customIconText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kHasCustomIcon; + rc = HSetFInfo(refNum, dirId, "\pICON", &finderInfo); + } + } + printf("\tFile has custom icon (not really): name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ICON", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pSTATIONERY", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pSTATIONERY", 0, &refFile); + if(!rc) + { + count = strlen(stationeryText); + wRc = FSWrite(refFile, &count, stationeryText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kIsStationery; + rc = HSetFInfo(refNum, dirId, "\pSTATIONERY", &finderInfo); + } + } + printf("\tFile is stationery: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "STATIONERY", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pLOCKED", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pLOCKED", 0, &refFile); + if(!rc) + { + count = strlen(nameLockText); + wRc = FSWrite(refFile, &count, nameLockText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kNameLocked; + rc = HSetFInfo(refNum, dirId, "\pLOCKED", &finderInfo); + } + } + printf("\tFile is locked: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "LOCKED", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pBUNDLE", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pBUNDLE", 0, &refFile); + if(!rc) + { + count = strlen(bundleText); + wRc = FSWrite(refFile, &count, bundleText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kHasBundle; + rc = HSetFInfo(refNum, dirId, "\pBUNDLE", &finderInfo); + } + } + printf("\tFile has bundle (not really): name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "BUNDLE", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pINVISIBLE", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pINVISIBLE", 0, &refFile); + if(!rc) + { + count = strlen(invisibleText); + wRc = FSWrite(refFile, &count, invisibleText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kIsInvisible; + rc = HSetFInfo(refNum, dirId, "\pINVISIBLE", &finderInfo); + } + } + printf("\tFile is invisible: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "INVISIBLE", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pALIAS", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pALIAS", 0, &refFile); + if(!rc) + { + count = strlen(aliasText); + wRc = FSWrite(refFile, &count, aliasText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = kIsAlias; + rc = HSetFInfo(refNum, dirId, "\pALIAS", &finderInfo); + } + } + printf("\tFile is alias to nowhere: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ALIAS", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pSIMPLE", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pSIMPLE", 0, &refFile); + if(!rc) + { + count = strlen(simpletextText); + wRc = FSWrite(refFile, &count, simpletextText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostSimpleText; + rc = HSetFInfo(refNum, dirId, "\pSIMPLE", &finderInfo); + } + } + printf("\tFile with creator SimpleText: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "SIMPLE", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pAARU", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pAARU", 0, &refFile); + if(!rc) + { + count = strlen(aaruText); + wRc = FSWrite(refFile, &count, aaruText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostAaru; + rc = HSetFInfo(refNum, dirId, "\pAARU", &finderInfo); + } + } + printf("\tFile with creator 'aaru': name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "AARU", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_M32_M32", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_M32_M32", 0, &refFile); + if(!rc) + { + count = strlen(pos_m32_m32); + wRc = FSWrite(refFile, &count, pos_m32_m32); + cRc = FSClose(refFile); + + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = -32768; + finderInfo.fdLocation.v = -32768; + rc = HSetFInfo(refNum, dirId, "\pPOS_M32_M32", &finderInfo); + } + } + printf("\tFile with position -32768,-32768: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", + "POS_M32_M32", + rc, + wRc, + cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_32_32", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_32_32", 0, &refFile); + if(!rc) + { + count = strlen(pos_32_32); + wRc = FSWrite(refFile, &count, pos_32_32); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = 32767; + finderInfo.fdLocation.v = 32767; + rc = HSetFInfo(refNum, dirId, "\pPOS_32_32", &finderInfo); + } + } + printf("\tFile with position 32767,32767: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_32_32", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_M1_M1", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_M1_M1", 0, &refFile); + if(!rc) + { + count = strlen(pos_m1_m1); + wRc = FSWrite(refFile, &count, pos_m1_m1); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = -1024; + finderInfo.fdLocation.v = -1024; + rc = HSetFInfo(refNum, dirId, "\pPOS_M1_M1", &finderInfo); + } + } + printf("\tFile with position -1024,-1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_M1", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_M1_M32", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_M1_M32", 0, &refFile); + if(!rc) + { + count = strlen(pos_m1_m32); + wRc = FSWrite(refFile, &count, pos_m1_m32); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = -1024; + finderInfo.fdLocation.v = -32768; + rc = HSetFInfo(refNum, dirId, "\pPOS_M1_M32", &finderInfo); + } + } + printf( + "\tFile with position -1024,-32768: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_M32", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_M1_32", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_M1_32", 0, &refFile); + if(!rc) + { + count = strlen(pos_m1_32); + wRc = FSWrite(refFile, &count, pos_m1_32); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = -1024; + finderInfo.fdLocation.v = 32767; + rc = HSetFInfo(refNum, dirId, "\pPOS_M1_32", &finderInfo); + } + } + printf("\tFile with position -1024,32767: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_32", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_M1_1", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_M1_1", 0, &refFile); + if(!rc) + { + count = strlen(pos_m1_1); + wRc = FSWrite(refFile, &count, pos_m1_1); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = -1024; + finderInfo.fdLocation.v = 1024; + rc = HSetFInfo(refNum, dirId, "\pPOS_M1_1", &finderInfo); + } + } + printf("\tFile with position -1024,1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_M1_1", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_1_M1", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_1_M1", 0, &refFile); + if(!rc) + { + count = strlen(pos_1_m1); + wRc = FSWrite(refFile, &count, pos_1_m1); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = 1024; + finderInfo.fdLocation.v = -1024; + rc = HSetFInfo(refNum, dirId, "\pPOS_1_M1", &finderInfo); + } + } + printf("\tFile with position 1024,-1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_M1", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_1_M32", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_1_M32", 0, &refFile); + if(!rc) + { + count = strlen(pos_1_m32); + wRc = FSWrite(refFile, &count, pos_1_m32); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = 1024; + finderInfo.fdLocation.v = -32768; + rc = HSetFInfo(refNum, dirId, "\pPOS_1_M32", &finderInfo); + } + } + printf("\tFile with position 1024,-32768: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_M32", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_1_32", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_1_32", 0, &refFile); + if(!rc) + { + count = strlen(pos_1_32); + wRc = FSWrite(refFile, &count, pos_1_32); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = 1024; + finderInfo.fdLocation.v = 32767; + rc = HSetFInfo(refNum, dirId, "\pPOS_1_32", &finderInfo); + } + } + printf("\tFile with position 1024,32767: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_32", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPOS_1_1", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pPOS_1_1", 0, &refFile); + if(!rc) + { + count = strlen(pos_1_1); + wRc = FSWrite(refFile, &count, pos_1_1); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdLocation.h = 1024; + finderInfo.fdLocation.v = 1024; + rc = HSetFInfo(refNum, dirId, "\pPOS_1_1", &finderInfo); + } + } + printf("\tFile with position 1024,1024: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "POS_1_1", rc, wRc, cRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pALL", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pALL", 0, &refFile); + if(!rc) + { + count = strlen(allText); + wRc = FSWrite(refFile, &count, allText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostUnknown; + finderInfo.fdFlags = 0xFFFF; + rc = HSetFInfo(refNum, dirId, "\pALL", &finderInfo); + } + } + printf("\tFile has all flags bits set: name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", "ALL", rc, wRc, cRc); +} +#endif diff --git a/setter/src/macos/deleted.c b/setter/src/macos/deleted.c new file mode 100644 index 0000000..1b0960b --- /dev/null +++ b/setter/src/macos/deleted.c @@ -0,0 +1,96 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void DeleteFiles(const char* path) +{ + OSErr rc, wRc, cRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + FInfo finderInfo; + int32_t count; + char filename[9]; + int pos = 0; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pDELETED", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating and deleting files.\n"); + + for(pos = 0; pos < 64; pos++) + { + memset(&filename, 0, 9); + sprintf((char*)filename, "%08d", pos); + str255[0] = 8; + memcpy(str255 + 1, filename, 8); + + rc = HCreate(refNum, dirId, str255, ostUnknown, ftGenericDocumentPC); + + if(rc) break; + + HDelete(refNum, dirId, str255); + } +} +#endif diff --git a/setter/src/macos/dirdepth.c b/setter/src/macos/dirdepth.c new file mode 100644 index 0000000..0009812 --- /dev/null +++ b/setter/src/macos/dirdepth.c @@ -0,0 +1,98 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void DirectoryDepth(const char* path) +{ + OSErr rc, wRc, cRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + FInfo finderInfo; + int32_t count; + char filename[9]; + int pos = 0; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pDEPTH", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating deepest directory tree.\n"); + + while(!rc) + { + memset(&filename, 0, 9); + sprintf((char*)filename, "%08d", pos); + str255[0] = 8; + memcpy(str255 + 1, filename, 8); + + rc = DirCreate(refNum, dirId, str255, &dirId); + + pos++; + /* Mac OS has no limit, but it will crash because the catalog is single threaded */ + if(pos == 500) break; + } + + printf("\tCreated %d levels of directory hierarchy\n", pos); +} +#endif diff --git a/setter/src/macos/filename.c b/setter/src/macos/filename.c new file mode 100644 index 0000000..28c8189 --- /dev/null +++ b/setter/src/macos/filename.c @@ -0,0 +1,107 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void Filenames(const char* path) +{ + OSErr rc, wRc, cRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + FInfo finderInfo; + int32_t count; + char message[300]; + int pos = 0; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pFILENAME", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating files with different filenames.\n"); + + for(pos = 0; filenames[pos]; pos++) + { + count = strlen(filenames[pos]); + memset(&str255, 0, sizeof(Str255)); + if(count > 255) { continue; } + str255[0] = (char)count; + memcpy(str255 + 1, filenames[pos], count); + + rc = HCreate(refNum, dirId, str255, ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, str255, 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, FILENAME_FORMAT, filenames[pos]); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + } + + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d\n", filenames[pos], rc, wRc, cRc); + } +} +#endif diff --git a/setter/src/macos/files.c b/setter/src/macos/files.c new file mode 100644 index 0000000..a54a2d6 --- /dev/null +++ b/setter/src/macos/files.c @@ -0,0 +1,96 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void MillionFiles(const char* path) +{ + OSErr rc, wRc, cRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + FInfo finderInfo; + int32_t count; + char filename[9]; + int pos = 0; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pMILLION", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating lots of files.\n"); + + for(pos = 0; pos < 5000; pos++) + { + memset(&filename, 0, 9); + sprintf((char*)filename, "%08d", pos); + str255[0] = 8; + memcpy(str255 + 1, filename, 8); + + rc = HCreate(refNum, dirId, str255, ostUnknown, ftGenericDocumentPC); + + if(rc) break; + } + + printf("\tCreated %d files\n", pos); +} +#endif diff --git a/setter/src/macos/frag.c b/setter/src/macos/frag.c new file mode 100644 index 0000000..67c0df8 --- /dev/null +++ b/setter/src/macos/frag.c @@ -0,0 +1,306 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void Fragmentation(const char* path, size_t clusterSize) +{ + 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; + OSErr rc, wRc, cRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + int32_t count; + long i; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pFRAGS", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + rc = HCreate(refNum, dirId, "\pHALFCLST", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pHALFCLST", 0, &refFile); + if(!rc) + { + buffer = malloc(halfCluster); + memset(buffer, 0, halfCluster); + + for(i = 0; i < halfCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = halfCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "HALFCLST", halfCluster, rc, wRc, cRc); + + rc = HCreate(refNum, dirId, "\pQUARCLST", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pQUARCLST", 0, &refFile); + if(!rc) + { + buffer = malloc(quarterCluster); + memset(buffer, 0, quarterCluster); + + for(i = 0; i < quarterCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = quarterCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "QUARCLST", quarterCluster, rc, wRc, cRc); + + rc = HCreate(refNum, dirId, "\pTWOCLST", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pTWOCLST", 0, &refFile); + if(!rc) + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = twoCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWOCLST", twoCluster, rc, wRc, cRc); + + rc = HCreate(refNum, dirId, "\pTRQTCLST", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pTRQTCLST", 0, &refFile); + if(!rc) + { + buffer = malloc(threeQuartersCluster); + memset(buffer, 0, threeQuartersCluster); + + for(i = 0; i < threeQuartersCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = threeQuartersCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", + "TRQTCLST", + threeQuartersCluster, + rc, + wRc, + cRc); + + rc = HCreate(refNum, dirId, "\pTWOQCLST", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pTWOQCLST", 0, &refFile); + if(!rc) + { + buffer = malloc(twoAndThreeQuartCluster); + memset(buffer, 0, twoAndThreeQuartCluster); + + for(i = 0; i < twoAndThreeQuartCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = twoAndThreeQuartCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", + "TWTQCLST", + twoAndThreeQuartCluster, + rc, + wRc, + cRc); + + rc = HCreate(refNum, dirId, "\pTWO1", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pTWO1", 0, &refFile); + if(!rc) + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = twoCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO1", twoCluster, rc, wRc, cRc); + + rc = HCreate(refNum, dirId, "\pTWO2", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pTWO2", 0, &refFile); + if(!rc) + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = twoCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO2", twoCluster, rc, wRc, cRc); + + rc = HCreate(refNum, dirId, "\pTWO3", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pTWO3", 0, &refFile); + if(!rc) + { + buffer = malloc(twoCluster); + memset(buffer, 0, twoCluster); + + for(i = 0; i < twoCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = twoCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tDeleting \"TWO2\".\n"); + rc = HDelete(refNum, dirId, "\pTWO2"); + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", "TWO3", twoCluster, rc, wRc, cRc); + + rc = HCreate(refNum, dirId, "\pFRAGTHRQ", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pFRAGTHRQ", 0, &refFile); + if(!rc) + { + buffer = malloc(threeQuartersCluster); + memset(buffer, 0, threeQuartersCluster); + + for(i = 0; i < threeQuartersCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = threeQuartersCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tDeleting \"TWO1\".\n"); + rc = HDelete(refNum, dirId, "\pTWO1"); + printf("\tDeleting \"TWO3\".\n"); + rc = HDelete(refNum, dirId, "\pTWO3"); + + rc = HCreate(refNum, dirId, "\pFRAGSIXQ", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pFRAGSIXQ", 0, &refFile); + if(!rc) + { + buffer = malloc(twoAndThreeQuartCluster); + memset(buffer, 0, twoAndThreeQuartCluster); + + for(i = 0; i < twoAndThreeQuartCluster; i++) buffer[i] = clauniaBytes[i % CLAUNIA_SIZE]; + + count = twoAndThreeQuartCluster; + wRc = FSWrite(refFile, &count, buffer); + cRc = FSClose(refFile); + free(buffer); + } + } + + printf("\tFile name = \"%s\", size = %d, rc = %d, wRc = %d, cRc = %d\n", + "FRAGSIXQ", + twoAndThreeQuartCluster, + rc, + wRc, + cRc); +} + +#endif diff --git a/setter/src/macos/links.c b/setter/src/macos/links.c new file mode 100644 index 0000000..cd0555a --- /dev/null +++ b/setter/src/macos/links.c @@ -0,0 +1,164 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +static pascal OSErr + + CreateAliasFile(const FSSpec* targetFile, const FSSpec* aliasFile, OSType fileCreator, OSType fileType) +{ + short rsrcID; + short aliasRefnum; + FInfo finf; + OSErr err; + AliasHandle alias; + + FSpCreateResFile(aliasFile, fileCreator, fileType, 0); + err = ResError(); + if(err != noErr) return err; + + err = NewAlias(aliasFile, targetFile, &alias); + if(err != noErr || alias == NULL) return err; + + aliasRefnum = FSpOpenResFile(aliasFile, fsRdWrPerm); + + AddResource((Handle)alias, rAliasType, 0, "\pAaru alias"); + err = ResError(); + + CloseResFile(aliasRefnum); + FSpGetFInfo(aliasFile, &finf); + + finf.fdCreator = fileCreator; + finf.fdType = fileType; + finf.fdFlags |= 0x8000; + finf.fdFlags &= (~0x0100); + + FSpSetFInfo(aliasFile, &finf); + + return err; +} + +void Links(const char* path) +{ + int32_t gestaltResponse; + OSErr rc, wRc, cRc, oRc, aRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + char filename[9]; + int pos = 0; + FSSpec targetSpec, aliasSpec; + int32_t count; + + rc = Gestalt(gestaltAliasMgrAttr, &gestaltResponse); + if(rc || !(gestaltResponse & (1 << gestaltAliasMgrPresent))) + { + printf("Alias Manager not present, cannot create aliases.\n"); + return; + } + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pLINKS", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating aliases.\n"); + + for(pos = 0; pos < 64; pos++) + { + memset(&filename, 0, 9); + sprintf((char*)filename, "TARGET%02d", pos); + str255[0] = 8; + memcpy(str255 + 1, filename, 8); + + rc = HCreate(refNum, dirId, str255, ostSimpleText, ftGenericDocumentPC); + + if(rc) break; + + oRc = HOpenDF(refNum, dirId, str255, 0, &refFile); + if(oRc) break; + + count = strlen(targetText); + wRc = FSWrite(refFile, &count, targetText); + cRc = FSClose(refFile); + + memset(&targetSpec, 0, sizeof(FSSpec)); + targetSpec.vRefNum = refNum; + targetSpec.parID = dirId; + targetSpec.name[0] = 8; + memcpy(targetSpec.name + 1, filename, 8); + + memset(&filename, 0, 9); + sprintf((char*)filename, "ALIAS_%02d", pos); + memset(&aliasSpec, 0, sizeof(FSSpec)); + aliasSpec.vRefNum = refNum; + aliasSpec.parID = dirId; + aliasSpec.name[0] = 8; + memcpy(aliasSpec.name + 1, filename, 8); + + aRc = CreateAliasFile(&targetSpec, &aliasSpec, ostSimpleText, ftGenericDocumentPC); + + if(aRc) break; + } + + printf("pos = %d, rc = %d, wRc = %d, cRc = %d, oRc = %d, aRc = %d\n", pos, rc, wRc, cRc, oRc, aRc); +} +#endif diff --git a/setter/src/macos.h b/setter/src/macos/macos.h similarity index 100% rename from setter/src/macos.h rename to setter/src/macos/macos.h diff --git a/setter/src/macos.r b/setter/src/macos/macos.r similarity index 100% rename from setter/src/macos.r rename to setter/src/macos/macos.r diff --git a/setter/src/macos/os.c b/setter/src/macos/os.c new file mode 100644 index 0000000..0996f3f --- /dev/null +++ b/setter/src/macos/os.c @@ -0,0 +1,85 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void GetOsInfo() +{ + int32_t gestaltResponse; + OSErr rc; + + printf("OS information:\n"); + + rc = Gestalt(gestaltAUXVersion, &gestaltResponse); + if(!rc) { printf("Running under A/UX version 0x%08X\n", gestaltResponse); } + else + { + rc = Gestalt(gestaltSystemVersion, &gestaltResponse); + if(rc) { printf("Could not get Mac OS version.\n"); } + else + { + printf("Running under Mac OS version %d.%d.%d", + (gestaltResponse & 0xF00) >> 8, + (gestaltResponse & 0xF0) >> 4, + gestaltResponse & 0xF); + rc = Gestalt(gestaltSysArchitecture, &gestaltResponse); + if(!rc) + { + printf(" for "); + switch(gestaltResponse) + { + case 1: printf("Motorola 68k architecture."); break; + case 2: printf("PowerPC architecture."); break; + case 3: printf("x86 architecture."); break; + default: printf("unknown architecture code %d.", gestaltResponse); break; + } + } + printf("\n"); + } + rc = Gestalt(gestaltMacOSCompatibilityBoxAttr, &gestaltResponse); + if(!rc) { printf("Running under Classic.\n"); } + } +} +#endif diff --git a/setter/src/macos/perms.c b/setter/src/macos/perms.c new file mode 100644 index 0000000..62d64c0 --- /dev/null +++ b/setter/src/macos/perms.c @@ -0,0 +1,51 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void FilePermissions(const char* path) +{ /* Do nothing, not supported by target operating system */ +} +#endif diff --git a/setter/src/macos/rsrcfork.c b/setter/src/macos/rsrcfork.c new file mode 100644 index 0000000..381f6eb --- /dev/null +++ b/setter/src/macos/rsrcfork.c @@ -0,0 +1,261 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +static OSErr SaveResourceToNewFile(int16_t vRefNum, + int32_t dirID, + Str255 filename, + ResType type, + int16_t resId, + Str255 resName, + unsigned char* buffer, + size_t length) +{ + Handle h; + OSErr rc; + int16_t resRef; + + h = NewHandle(length); + + if(!h) return notEnoughMemoryErr; + + memcpy(*h, buffer, length); + + HCreateResFile(vRefNum, dirID, filename); + + resRef = HOpenResFile(vRefNum, dirID, filename, fsCurPerm); + rc = ResError(); + + if(resRef == -1 || rc) return rc; + + UseResFile(resRef); + + AddResource(h, type, resId, resName); + rc = ResError(); + + CloseResFile(resRef); + + DisposeHandle(h); + + return rc; +} + +void ResourceFork(const char* path) +{ + OSErr rc, wRc, cRc, rRc, rRc2, rRc3; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + FInfo finderInfo; + int32_t count; + HFileInfo* fpb; + CInfoPBRec cipbr; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pRSRC", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating resource forks.\n"); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pICON", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rRc = SaveResourceToNewFile(refNum, + dirId, + "\pICON", + rtIcons, + -16455, + "\pIcon resource", + (unsigned char*)IcnsResource, + sizeof(IcnsResource)); + rc = HOpenDF(refNum, dirId, "\pICON", 0, &refFile); + if(!rc) + { + count = strlen(rsrcText); + wRc = FSWrite(refFile, &count, rsrcText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostAaru; + finderInfo.fdFlags = kHasCustomIcon; + rc = HSetFInfo(refNum, dirId, "\pICON", &finderInfo); + } + } + printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d\n", + "ICON", + rc, + wRc, + cRc, + rRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pPICT", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rRc = SaveResourceToNewFile(refNum, + dirId, + "\pPICT", + ftPICTFile, + 29876, + "\pPicture resource", + (unsigned char*)PictResource, + sizeof(PictResource)); + rc = HOpenDF(refNum, dirId, "\pPICT", 0, &refFile); + if(!rc) + { + count = strlen(rsrcText); + wRc = FSWrite(refFile, &count, rsrcText); + cRc = FSClose(refFile); + finderInfo.fdType = ftPICTFile; + finderInfo.fdCreator = ostAaru; + rc = HSetFInfo(refNum, dirId, "\pPICT", &finderInfo); + } + } + printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d\n", + "PICT", + rc, + wRc, + cRc, + rRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pVERSION", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rRc = SaveResourceToNewFile(refNum, + dirId, + "\pVERSION", + rtVersion, + 1, + "\pVersion resource", + (unsigned char*)VersResource, + sizeof(VersResource)); + rc = HOpenDF(refNum, dirId, "\pVERSION", 0, &refFile); + if(!rc) + { + count = strlen(rsrcText); + wRc = FSWrite(refFile, &count, rsrcText); + cRc = FSClose(refFile); + finderInfo.fdType = ftGenericDocumentPC; + finderInfo.fdCreator = ostAaru; + rc = HSetFInfo(refNum, dirId, "\pVERSION", &finderInfo); + } + } + printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d\n", + "VERSION", + rc, + wRc, + cRc, + rRc); + + memset(&finderInfo, 0, sizeof(FInfo)); + rc = HCreate(refNum, dirId, "\pALL", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rRc = SaveResourceToNewFile(refNum, + dirId, + "\pALL", + rtIcons, + -16455, + "\pIcon resource", + (unsigned char*)IcnsResource, + sizeof(IcnsResource)); + rRc2 = SaveResourceToNewFile(refNum, + dirId, + "\pALL", + ftPICTFile, + 29876, + "\pPicture resource", + (unsigned char*)PictResource, + sizeof(PictResource)); + rRc3 = SaveResourceToNewFile(refNum, + dirId, + "\pALL", + rtVersion, + 1, + "\pVersion resource", + (unsigned char*)VersResource, + sizeof(VersResource)); + rc = HOpenDF(refNum, dirId, "\pALL", 0, &refFile); + if(!rc) + { + count = strlen(rsrcText); + wRc = FSWrite(refFile, &count, rsrcText); + cRc = FSClose(refFile); + finderInfo.fdType = ftPICTFile; + finderInfo.fdCreator = ostAaru; + finderInfo.fdFlags = kHasCustomIcon; + rc = HSetFInfo(refNum, dirId, "\pALL", &finderInfo); + } + } + printf("\tFile with three items in the resource fork: name = \"%s\", rc = %d, wRc = %d, cRc = %d, rRc = %d, rRc2 = " + "%d, rRc3 = %d\n", + "ALL", + rc, + wRc, + cRc, + rRc, + rRc2, + rRc3); +} +#endif diff --git a/setter/src/macos/sparse.c b/setter/src/macos/sparse.c new file mode 100644 index 0000000..7ee06f1 --- /dev/null +++ b/setter/src/macos/sparse.c @@ -0,0 +1,51 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void Sparse(const char* path) +{ /* Do nothing, not supported by target operating system */ +} +#endif diff --git a/setter/src/macos/time.c b/setter/src/macos/time.c new file mode 100644 index 0000000..1934be5 --- /dev/null +++ b/setter/src/macos/time.c @@ -0,0 +1,559 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void Timestamps(const char* path) +{ + OSErr rc, wRc, cRc, tRc; + Str255 str255; + HVolumeParam hpb; + int16_t refNum; + int16_t refFile; + int32_t dirId; + FInfo finderInfo; + int32_t count; + HFileInfo* fpb; + CInfoPBRec cipbr; + char message[300]; + + snprintf((char*)str255, 255, "%s", path); + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + refNum = hpb.ioVRefNum; + + rc = DirCreate(refNum, fsRtDirID, (unsigned char*)"\pTIMES", &dirId); + if(rc) + { + printf("Error %d creating working directory.\n", rc); + return; + } + + printf("Creating timestamped files.\n"); + + rc = HCreate(refNum, dirId, "\pMAXCTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMAXCTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "creation"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMAXCTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = MAXTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXCTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pMAXMTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMAXMTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "modification"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMAXMTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = MAXTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXMTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pMAXBTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMAXBTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "backup"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMAXBTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = MAXTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXBTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pMINCTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMINCTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "creation"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMINCTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = MINTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINCTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pMINMTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMINMTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "modification"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMINMTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = MINTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINMTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pMINBTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMINBTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "backup"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMINBTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = MINTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINBTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY2KCTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY2KCTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "creation"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY2KCTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = Y2KTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KCTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY2KMTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY2KMTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "modification"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY2KMTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = Y2KTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KMTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY2KBTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY2KBTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "backup"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY2KBTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = Y2KTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KBTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY1KCTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY1KCTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "creation"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY1KCTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = Y1KTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KCTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY1KMTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY1KMTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "modification"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY1KMTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = Y1KTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KMTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY1KBTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY1KBTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "backup"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY1KBTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = Y1KTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KBTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pMAXTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMAXTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MAXDATETIME, "all"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMAXTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = MAXTIMESTAMP; + fpb->ioFlMdDat = MAXTIMESTAMP; + fpb->ioFlBkDat = MAXTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MAXTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pMINTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pMINTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, MINDATETIME, "all"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pMINTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = MINTIMESTAMP; + fpb->ioFlMdDat = MINTIMESTAMP; + fpb->ioFlBkDat = MINTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "MINTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pNOTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pNOTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, NONDATETIME, "all"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pNOTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = NONTIMESTAMP; + fpb->ioFlMdDat = NONTIMESTAMP; + fpb->ioFlBkDat = NONTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "NOTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY2KTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY2KTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y2KDATETIME, "all"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY2KTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = Y2KTIMESTAMP; + fpb->ioFlMdDat = Y2KTIMESTAMP; + fpb->ioFlBkDat = Y2KTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y2KTIME", rc, wRc, cRc, tRc); + + rc = HCreate(refNum, dirId, "\pY1KTIME", ostUnknown, ftGenericDocumentPC); + if(!rc) + { + rc = HOpenDF(refNum, dirId, "\pY1KTIME", 0, &refFile); + if(!rc) + { + memset(&message, 0, 300); + sprintf((char*)message, DATETIME_FORMAT, Y1KDATETIME, "all"); + count = strlen(message); + wRc = FSWrite(refFile, &count, message); + cRc = FSClose(refFile); + } + memset(&cipbr, 0, sizeof(CInfoPBRec)); + fpb = (HFileInfo*)&cipbr; + fpb->ioVRefNum = refNum; + fpb->ioNamePtr = "\pY1KTIME"; + fpb->ioDirID = dirId; + fpb->ioFDirIndex = 0; + PBGetCatInfoSync(&cipbr); + + fpb->ioFlCrDat = Y1KTIMESTAMP; + fpb->ioFlMdDat = Y1KTIMESTAMP; + fpb->ioFlBkDat = Y1KTIMESTAMP; + fpb->ioDirID = dirId; + tRc = PBSetCatInfoSync(&cipbr); + } + printf("\tFile name = \"%s\", rc = %d, wRc = %d, cRc = %d, tRc = %d\n", "Y1KTIME", rc, wRc, cRc, tRc); +} +#endif diff --git a/setter/src/macos/volume.c b/setter/src/macos/volume.c new file mode 100644 index 0000000..d0cd796 --- /dev/null +++ b/setter/src/macos/volume.c @@ -0,0 +1,156 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void GetVolumeInfo(const char* path, size_t* clusterSize) +{ + OSErr rc; + Str255 str255; + HVolumeParam hpb; + XVolumeParam xpb; + int32_t gestaltResponse; + int16_t drvInfo; + int16_t refNum; + uint64_t totalBlocks; + uint64_t freeBlocks; + uint32_t crDate; + uint32_t lwDate; + uint32_t bkDate; + uint16_t fsId; + uint64_t totalBytes; + uint64_t freeBytes; + int hfsPlusApis = 0; + int bigVol = 0; + *clusterSize = 0; + + snprintf((char*)str255, 255, "%s", path); + + rc = Gestalt(gestaltFSAttr, &gestaltResponse); + if(!rc) + { + hfsPlusApis = gestaltResponse & (1 << gestaltHasHFSPlusAPIs); + bigVol = gestaltResponse & (1 << gestaltFSSupports2TBVols); + } + + if(!bigVol) + { + hpb.ioNamePtr = str255; + hpb.ioVRefNum = 0; + hpb.ioVolIndex = -1; + rc = PBHGetVInfo((HParmBlkPtr)&hpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + drvInfo = hpb.ioVDrvInfo; + refNum = hpb.ioVRefNum; + totalBlocks = hpb.ioVNmAlBlks; + freeBlocks = hpb.ioVFrBlk; + crDate = hpb.ioVCrDate; + lwDate = hpb.ioVLsMod; + bkDate = hpb.ioVBkUp; + fsId = hpb.ioVSigWord; + *clusterSize = hpb.ioVAlBlkSiz; + totalBytes = totalBlocks * *clusterSize; + freeBytes = freeBlocks * *clusterSize; + if(hpb.ioVFSID != 0) { fsId = hpb.ioVFSID; } + } + else + { + xpb.ioNamePtr = str255; + xpb.ioVRefNum = 0; + xpb.ioVolIndex = -1; + rc = PBXGetVolInfo((XVolumeParamPtr)&xpb, 0); + if(rc) + { + printf("Could not get volume information.\n"); + return; + } + drvInfo = xpb.ioVDrvInfo; + refNum = xpb.ioVRefNum; + totalBlocks = xpb.ioVTotalBytes / xpb.ioVAlBlkSiz; + freeBlocks = xpb.ioVFreeBytes / xpb.ioVAlBlkSiz; + crDate = xpb.ioVCrDate; + lwDate = xpb.ioVLsMod; + bkDate = xpb.ioVBkUp; + fsId = xpb.ioVSigWord; + *clusterSize = xpb.ioVAlBlkSiz; + totalBytes = xpb.ioVTotalBytes; + freeBytes = xpb.ioVFreeBytes; + if(xpb.ioVFSID != 0) { fsId = xpb.ioVFSID; } + } + + printf("Volume information:\n"); + printf("\tPath: %s\n", path); + if(bigVol) { printf("\tVolume supports up to 2Tb disks.\n"); } + if(hfsPlusApis) { printf("\tVolume supports HFS Plus APIs.\n"); } + printf("\tDrive number: %d\n", drvInfo); + printf("\tVolume number: %d\n", refNum); + printf("\tVolume name: %#s\n", str255); + printf("\t%llu allocation blocks in volume, %llu free\n", totalBlocks, freeBlocks); + printf("\t%llu bytes in volume, %llu free\n", totalBytes, freeBytes); + printf("\t%d bytes per allocation block.\n", *clusterSize); + printf("\tVolume created on 0x%08X\n", crDate); + printf("\tVolume last written on 0x%08X\n", lwDate); + printf("\tVolume last backed up on 0x%08X\n", bkDate); + printf("\tFilesystem type: "); + switch(fsId) + { + case 0xD2D7: printf("MFS\n"); break; + case 0x4244: printf("HFS\n"); break; + case 0x482B: printf("HFS Plus\n"); break; + case 0x4147: printf("ISO9660\n"); break; + case 0x55DF: printf("UDF\n"); break; + case 0x4242: printf("High Sierra\n"); break; + case 0x4A48: printf("Audio CD\n"); break; + case 0x0100: printf("ProDOS\n"); break; + case 0x4953: printf("FAT\n"); break; + default: printf("unknown id 0x%04X\n", fsId); break; + } +} + +#endif diff --git a/setter/src/macos/xattr.c b/setter/src/macos/xattr.c new file mode 100644 index 0000000..3f02988 --- /dev/null +++ b/setter/src/macos/xattr.c @@ -0,0 +1,51 @@ +/**************************************************************************** +Aaru Data Preservation Suite +----------------------------------------------------------------------------- + +Filename : macos.c +Author(s) : Natalia Portillo + +--[ Description ] ----------------------------------------------------------- + +Contains Mac OS code. + +--[ License ] --------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +----------------------------------------------------------------------------- +Copyright (C) 2011-2021 Natalia Portillo +*****************************************************************************/ + +#if defined(macintosh) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/consts.h" +#include "../include/defs.h" +#include "macos.h" + +void ExtendedAttributes(const char* path) +{ /* Do nothing, not supported by target operating system */ +} +#endif