int attrFile()

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;
}