Example #1
0
static long ResolvePathToCatalogEntry(char * filePath, long * flags,
                                      void * entry, long dirID, long long * dirIndex)
{
    char                 *restPath;
    long                 result, cnt, subFolderID = 0;
    long long tmpDirIndex;
    HFSPlusCatalogFile   *hfsPlusFile;
	
    // Copy the file name to gTempStr
    cnt = 0;
    while ((filePath[cnt] != '/') && (filePath[cnt] != '\0')) cnt++;
    strlcpy(gTempStr, filePath, cnt+1);
	
    // Move restPath to the right place.
    if (filePath[cnt] != '\0') cnt++;
    restPath = filePath + cnt;
	
    // gTempStr is a name in the current Dir.
    // restPath is the rest of the path if any.
	
    result = ReadCatalogEntry(gTempStr, dirID, entry, dirIndex);
    if (result == -1) {
		return -1;
    }
	
    GetCatalogEntryInfo(entry, flags, 0, 0, 0);
	
    if ((*flags & kFileTypeMask) == kFileTypeDirectory) {
        if (gIsHFSPlus)
            subFolderID = SWAP_BE32(((HFSPlusCatalogFolder *)entry)->folderID);
        else
            subFolderID = SWAP_BE32(((HFSCatalogFolder *)entry)->folderID);
    }
	
    if ((*flags & kFileTypeMask) == kFileTypeDirectory)
        result = ResolvePathToCatalogEntry(restPath, flags, entry,
                                           subFolderID, dirIndex);
	
    if (gIsHFSPlus && ((*flags & kFileTypeMask) == kFileTypeFlat)) {
        hfsPlusFile = (HFSPlusCatalogFile *)entry;
        if ((SWAP_BE32(hfsPlusFile->userInfo.fdType) == kHardLinkFileType) &&
            (SWAP_BE32(hfsPlusFile->userInfo.fdCreator) == kHFSPlusCreator)) {
			
#ifdef __i386__
            snprintf(gLinkTemp, 64 ,"%s/%s%ld", HFSPLUSMETADATAFOLDER,
					 HFS_INODE_PREFIX, SWAP_BE32(hfsPlusFile->bsdInfo.special.iNodeNum));
#else
            snprintf(gLinkTemp, sizeof(gLinkTemp),"%s/%s%ld", HFSPLUSMETADATAFOLDER,
					 HFS_INODE_PREFIX, SWAP_BE32(hfsPlusFile->bsdInfo.special.iNodeNum));
#endif
            
			result = ResolvePathToCatalogEntry(gLinkTemp, flags, entry,
											   kHFSRootFolderID, &tmpDirIndex);
        }
    }
	
    return result;
}
Example #2
0
File: hfs.c Project: aosm/BootX
static long ResolvePathToCatalogEntry(char *filePath, long *flags, void *entry,
                                      unsigned long dirID, unsigned long *dirIndex)
{
  char                 *restPath;
  long                 result, cnt;
  unsigned long        subFolderID = 0, tmpDirIndex;
  HFSPlusCatalogFile   *hfsPlusFile;
  
  // Copy the file name to gTempStr
  cnt = 0;
  while ((filePath[cnt] != '\\') && (filePath[cnt] != '\0')) cnt++;
  strncpy(gTempStr, filePath, cnt);
  
  // Move restPath to the right place.
  if (filePath[cnt] != '\0') cnt++;
  restPath = filePath + cnt;
  
  // gTempStr is a name in the current Dir.
  // restPath is the rest of the path if any.
  
  result = ReadCatalogEntry(gTempStr, dirID, entry, dirIndex);
  if (result == -1) return -1;
  
  GetCatalogEntryInfo(entry, flags, 0);
  
  if ((*flags & kFileTypeMask) == kFileTypeDirectory) {
    if (gIsHFSPlus) subFolderID = ((HFSPlusCatalogFolder *)entry)->folderID;
    else subFolderID = ((HFSCatalogFolder *)entry)->folderID;
  }
  
  if ((*flags & kFileTypeMask) == kFileTypeDirectory)
    result = ResolvePathToCatalogEntry(restPath, flags, entry,
				       subFolderID, dirIndex);
  
  if (gIsHFSPlus && ((*flags & kFileTypeMask) == kFileTypeFlat)) {
    hfsPlusFile = (HFSPlusCatalogFile *)entry;
    if ((hfsPlusFile->userInfo.fdType == kHardLinkFileType) &&
	(hfsPlusFile->userInfo.fdCreator == kHFSPlusCreator)) {
      sprintf(gLinkTemp, "%s\\%s%d", HFSPLUSMETADATAFOLDER,
	      HFS_INODE_PREFIX, hfsPlusFile->bsdInfo.special.iNodeNum);
      result = ResolvePathToCatalogEntry(gLinkTemp, flags, entry,
					 kHFSRootFolderID, &tmpDirIndex);
    }
  }
  
  return result;
}