int BLGetVolumeFinderInfo(BLContextPtr context, const char * mountpoint, uint32_t * words) { int err, i; struct volinfobuf vinfo; struct attrlist alist; alist.bitmapcount = 5; alist.reserved = 0; alist.commonattr = ATTR_CMN_FNDRINFO; alist.volattr = ATTR_VOL_INFO; alist.dirattr = 0; alist.fileattr = 0; alist.forkattr = 0; err = getattrlist(mountpoint, &alist, &vinfo, sizeof(vinfo), 0); if(err) { contextprintf(context, kBLLogLevelError, "Can't get volume information for %s\n", mountpoint ); return 1; } /* Finder info words are just opaque and in big-endian format on disk for HFS+ */ for(i=0; i<6; i++) { words[i] = CFSwapInt32BigToHost(vinfo.finderinfo[i]); } *(uint64_t *)&words[6] = CFSwapInt64BigToHost( (*(uint64_t *)&vinfo.finderinfo[6])); return 0; }
//Swap int64 to system endianness int64_t swapBytes_i64(int64_t val, bql_file *blendfile) { if(blendfile->endianness == CFByteOrderLittleEndian) return CFSwapInt64LittleToHost(val); else if(blendfile->endianness == CFByteOrderBigEndian) return CFSwapInt64BigToHost(val); else return val; }