btrfs: [] on the end of a struct field is a variable length array.
[haiku.git] / src / add-ons / kernel / file_systems / exfat / DataStream.cpp
blob5a9647e7c8453f7be92cd833a99d2d45e5597733
1 /*
2 * Copyright 2011, Haiku Inc. All rights reserved.
3 * This file may be used under the terms of the MIT License.
5 * Authors:
6 * Jérôme Duval
7 */
10 #include "DataStream.h"
12 #include "Volume.h"
15 //#define TRACE_EXFAT
16 #ifdef TRACE_EXFAT
17 # define TRACE(x...) dprintf("\33[34mexfat:\33[0m " x)
18 #else
19 # define TRACE(x...) ;
20 #endif
21 #define ERROR(x...) dprintf("\33[34mexfat:\33[0m " x)
24 DataStream::DataStream(Volume* volume, Inode* inode, off_t size)
26 kBlockSize(volume->BlockSize()),
27 kClusterSize(volume->ClusterSize()),
28 fVolume(volume),
29 fInode(inode),
30 fSize(size)
32 fNumBlocks = size == 0 ? 0 : ((size - 1) / kBlockSize) + 1;
36 DataStream::~DataStream()
41 status_t
42 DataStream::FindBlock(off_t pos, off_t& physical, off_t *_length)
44 if (pos >= fSize) {
45 TRACE("FindBlock: offset larger than size\n");
46 return B_ENTRY_NOT_FOUND;
48 cluster_t clusterIndex = pos / kClusterSize;
49 uint32 offset = pos % kClusterSize;
51 cluster_t cluster = fInode->StartCluster();
52 for (uint32 i = 0; i < clusterIndex; i++)
53 cluster = fInode->NextCluster(cluster);
54 fsblock_t block;
55 fVolume->ClusterToBlock(cluster, block);
56 physical = block * kBlockSize + offset;
57 for (uint32 i = 0; i < 64; i++) {
58 cluster_t extentEnd = fInode->NextCluster(cluster);
59 if (extentEnd == EXFAT_CLUSTER_END || extentEnd == cluster + 1)
60 break;
61 cluster = extentEnd;
63 *_length = min_c((cluster - clusterIndex + 1) * kClusterSize - offset,
64 fSize - pos);
65 TRACE("inode %" B_PRIdINO ": cluster %" B_PRIu32 ", pos %" B_PRIdOFF ", %"
66 B_PRIdOFF "\n", fInode->ID(), clusterIndex, pos, physical);
67 return B_OK;