/****************************************************************************
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)
#if defined(HAVE_ALIASES_H) || !defined(HAVE_MULTIVERSE_H)
#include
#endif
#if defined(HAVE_FILE_TYPES_AND_CREATORS_H) || !defined(HAVE_MULTIVERSE_H)
#include
#endif
#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 = PBHGetVInfoSync((HParmBlkPtr)&hpb);
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