in hfs/catalog.c [1140:1248]
int attrFile(const char* pathName, const char* flags, Volume* volume) {
HFSPlusCatalogRecord* record;
uint16_t flag = 0;
uint16_t mask = 0;
uint16_t file_mask = kIsOnDesk|kColor|kIsShared|kHasNoINITs|kHasBeenInited|kHasCustomIcon|kIsStationery|kNameLocked|kHasBundle|kIsInvisible|kIsAlias;
uint16_t folder_mask = kIsOnDesk|kColor|kHasCustomIcon|kNameLocked|kIsInvisible;
while (*flags != 0) {
switch(*flags++) {
// custom icon
case 'C':
flag |= kHasCustomIcon;
case 'c':
mask |= kHasCustomIcon;
break;
// invisible
case 'V':
flag |= kIsInvisible;
case 'v':
mask |= kIsInvisible;
break;
// inited
case 'I':
flag |= kHasBeenInited;
case 'i':
mask |= kHasBeenInited;
break;
// no INIT resource
case 'N':
flag |= kHasNoINITs;
case 'n':
mask |= kHasNoINITs;
break;
// located on the desktop
case 'D':
flag |= kIsOnDesk;
case 'd':
mask |= kIsOnDesk;
break;
// name locked
case 'S':
flag |= kNameLocked;
case 's':
mask |= kNameLocked;
break;
// stationery pad file
case 'T':
flag |= kIsStationery;
case 't':
mask |= kIsStationery;
break;
// shared
case 'M':
flag |= kIsShared;
case 'm':
mask |= kIsShared;
break;
// alias file
case 'A':
flag |= kIsAlias;
case 'a':
mask |= kIsAlias;
break;
// has bundle
case 'B':
flag |= kHasBundle;
case 'b':
mask |= kHasBundle;
break;
}
}
record = getRecordFromPath(pathName, volume, NULL, NULL);
if(record == NULL) {
printf("Path '%s' not found.\n", pathName);
return FALSE;
}
if(record->recordType == kHFSPlusFolderRecord) {
flag &= folder_mask;
mask &= folder_mask;
((HFSPlusCatalogFolder*)record)->userInfo.finderFlags = (((HFSPlusCatalogFolder*)record)->userInfo.finderFlags & (~mask)) | flag;
printf("%x\n", ((HFSPlusCatalogFolder*)record)->userInfo.finderFlags);
} else if(record->recordType == kHFSPlusFileRecord) {
flag &= file_mask;
mask &= file_mask;
((HFSPlusCatalogFile*)record)->userInfo.finderFlags = (((HFSPlusCatalogFile*)record)->userInfo.finderFlags & (~mask)) | flag;
printf("%x\n", ((HFSPlusCatalogFile*)record)->userInfo.finderFlags);
} else {
printf("unknown record type %x\n", record->recordType);
return FALSE;
}
updateCatalog(volume, record);
free(record);
return TRUE;
}