23#include <sys/sysmacros.h>
30#include <unordered_map>
46 if(stat(filePath.c_str(), &fileStat) != 0)
53 dev_t device = fileStat.st_dev;
54 auto majorNum = major(device);
55 auto minorNum = minor(device);
59 if(devicePath.empty())
61 std::cerr <<
"Failed to find the device path.\n";
85 if(stat(filePath.c_str(), &fileStat) != 0)
92 dev_t device = fileStat.st_dev;
93 auto majorNum = major(device);
94 auto minorNum = minor(device);
98 if(devicePath.empty())
102 std::string blockSizePath =
103 "/sys/class/block/" +
getDeviceName(devicePath) +
"/queue/logical_block_size";
104 std::ifstream blockSizeFile(blockSizePath);
106 if(blockSizeFile >> blockSize)
110 std::cerr <<
"Failed to get block size.\n";
115 std::cerr <<
"The file is not on iSCSI storage.\n";
123 struct stat fileStat;
124 if(stat(filePath.c_str(), &fileStat) != 0)
131 dev_t device = fileStat.st_dev;
132 auto majorNum = major(device);
133 auto minorNum = minor(device);
137 if(devicePath.empty())
141 std::string optimalSizePath =
142 "/sys/class/block/" +
getDeviceName(devicePath) +
"/queue/optimal_io_size";
143 std::ifstream optimalSizeFile(optimalSizePath);
144 int optimalSize = -1;
145 if(optimalSizeFile >> optimalSize)
150 std::cerr <<
"Failed to get optimal fetch size.\n";
164 std::ifstream mounts(
"/proc/mounts");
167 while(std::getline(mounts, line))
169 std::istringstream iss(line);
170 std::string devPath, mountPoint, fsType;
172 iss >> devPath >> mountPoint >> fsType;
175 if(filePath.find(mountPoint) == 0 && (fsType ==
"nfs" || fsType ==
"cifs"))
192 std::ifstream mounts(
"/proc/mounts");
195 while(std::getline(mounts, line))
197 std::istringstream iss(line);
198 std::string devPath, mountPoint;
200 iss >> devPath >> mountPoint;
203 if(stat(devPath.c_str(), &devStat) == 0)
205 if(major(devStat.st_rdev) == majorNum && minor(devStat.st_rdev) == minorNum)
219 std::string modaliasPath =
"/sys/class/block/" +
getDeviceName(devicePath) +
"/device/modalias";
220 std::ifstream modaliasFile(modaliasPath);
221 std::string modalias;
222 if(modaliasFile >> modalias)
224 return modalias.find(
"scsi") != std::string::npos;
232 size_t pos = devicePath.find_last_of(
'/');
233 if(pos != std::string::npos)
235 return devicePath.substr(pos + 1);
bool isIscsi(const std::string &filePath)
Definition NetworkFileChecker.h:41
int getOptimalFetchSize(const std::string &filePath)
Definition NetworkFileChecker.h:120
bool isNetworkDrive(const std::string &filePath)
Definition NetworkFileChecker.h:154
NetworkFileChecker()=default
bool isIscsiDevice(const std::string &devicePath)
Definition NetworkFileChecker.h:216
std::string getDevicePath(uint32_t majorNum, uint32_t minorNum)
Definition NetworkFileChecker.h:189
std::unordered_map< std::string, bool > deviceCache
Definition NetworkFileChecker.h:186
std::string getDeviceName(const std::string &devicePath)
Definition NetworkFileChecker.h:230
int getBlockSize(const std::string &filePath)
Definition NetworkFileChecker.h:79
ResWindow.
Definition CompressedChunkCache.h:36