-
- INIT_CATALOGDATA(&catalogInfo.nodeData, 0);
- catalogInfo.nodeData.cnd_iNodeNumCopy = 0;
-
- /* The packing call below expects a struct hfsCatalogInfo */
- bcopy(cnp, &catalogInfo.nodeData, (cnp->cnd_type == kCatalogFileNode) ?
- sizeof(HFSPlusCatalogFile) : sizeof(HFSPlusCatalogFolder));
-
- catalogInfo.nodeData.cnm_parID = isHFSPlus ? key->hfsPlus.parentID : key->hfs.parentID;
-
- /* hide open files that have been deleted */
- if ((privateDir != 0) && (catalogInfo.nodeData.cnm_parID == privateDir))
- return (0);
-
- /* hide our private meta data directory */
- if ((privateDir != 0) && (catalogInfo.nodeData.cnd_nodeID == privateDir))
- return (0);
-
- if ( returnAttrList->commonattr & ATTR_CMN_NAME ) {
- size_t utf8len = 0;
-
- catalogInfo.nodeData.cnm_nameptr = catalogInfo.nodeData.cnm_namespace;
-
- /* Return result in UTF-8 */
- if ( isHFSPlus ) {
- err = utf8_encodestr(key->hfsPlus.nodeName.unicode,
- key->hfsPlus.nodeName.length * sizeof(UniChar),
- catalogInfo.nodeData.cnm_namespace,
- &utf8len,
- MAXHFSVNODELEN + 1, ':', 0);
- if (err == ENAMETOOLONG) {
- utf8len = utf8_encodelen(key->hfsPlus.nodeName.unicode,
- key->hfsPlus.nodeName.length * sizeof(UniChar), ':', 0);
- MALLOC(catalogInfo.nodeData.cnm_nameptr, char *, utf8len+1, M_TEMP, M_WAITOK);
- catalogInfo.nodeData.cnm_flags |= kCatNameIsAllocated;
- err = utf8_encodestr(key->hfsPlus.nodeName.unicode,
- key->hfsPlus.nodeName.length * sizeof(UniChar),
- catalogInfo.nodeData.cnm_nameptr,
- &utf8len,
- utf8len + 1, ':', 0);
- }
- } else {
- err = hfs_to_utf8(vcb,
- key->hfs.nodeName,
- MAXHFSVNODELEN + 1,
- (ByteCount*) &utf8len,
- catalogInfo.nodeData.cnm_namespace);
- if (err == ENAMETOOLONG) {
- MALLOC(catalogInfo.nodeData.cnm_nameptr, char *, utf8len+1, M_TEMP, M_WAITOK);
- catalogInfo.nodeData.cnm_flags |= kCatNameIsAllocated;
- err = hfs_to_utf8(vcb,
- key->hfs.nodeName,
- utf8len + 1,
- (ByteCount*) &utf8len,
- catalogInfo.nodeData.cnm_nameptr);
- } else if (err) {
- /*
- * When an HFS name cannot be encoded with the current
- * volume encoding we use MacRoman as a fallback.
- */
- err = mac_roman_to_utf8(key->hfs.nodeName, MAXHFSVNODELEN + 1,
- (ByteCount*) &utf8len,
- catalogInfo.nodeData.cnm_namespace);
- }
- }
- catalogInfo.nodeData.cnm_length = utf8len;
- if (err && (catalogInfo.nodeData.cnm_flags & kCatNameIsAllocated))
- {
- DisposePtr(catalogInfo.nodeData.cnm_nameptr);
- catalogInfo.nodeData.cnm_flags &= ~kCatNameIsAllocated;
- catalogInfo.nodeData.cnm_nameptr = catalogInfo.nodeData.cnm_namespace;
- catalogInfo.nodeData.cnm_namespace[0] = 0;
+
+ /* Convert catalog record into cat_attr format. */
+ cat_convertattr(hfsmp, rec, &c_attr, &datafork, &rsrcfork);
+
+ /* Hide our private meta data directories */
+ if (c_attr.ca_fileid == hfsmp->hfs_private_desc[FILE_HARDLINKS].cd_cnid ||
+ c_attr.ca_fileid == hfsmp->hfs_private_desc[DIR_HARDLINKS].cd_cnid) {
+ err = 0;
+ goto exit;
+ }
+
+ /* Hide the private journal files */
+ if (hfsmp->jnl &&
+ ((c_attr.ca_fileid == hfsmp->hfs_jnlfileid) ||
+ (c_attr.ca_fileid == hfsmp->hfs_jnlinfoblkid))) {
+ err = 0;
+ goto exit;
+ }
+
+ if (returnAttrList->commonattr & ATTR_CMN_NAME) {
+ err = cat_convertkey(hfsmp, key, rec, &c_desc);
+ if (err) {
+ /* This means that we probably had a CNID error */
+ goto exit;