69 return m_AdvisoryOwner;
73 return m_AdvisoryOwner.identity();
76 File* getFile()
const {
77 return path ? path->node() : anonymousFile;
80 ReadyMask queryFileReady(
bool reading,
bool writing)
const;
92 size_t descriptorOwnerCount()
const;
101 int initialStatusFlags);
103 void addDescriptorOwner();
104 void removeDescriptorOwner();
105 void ensureVfsLease();
121 const int accessFlags;
123 size_t descriptorOwners;
125 bool allowTruncate =
true;
133 uint64_t offset()
const {
134 return m_Description->offset;
137 int statusFlags()
const {
138 return m_Description->statusFlags;
142 return m_Description->getFile();
145 bool isNoopSeekEndpoint()
const {
146 return m_Description->timerFdImpl || m_Description->signalFdImpl ||
147 m_Description->fanotifyImpl;
150 void setOffset(uint64_t offset) {
151 m_Description->offset = offset;
154 void advanceOffset(uint64_t amount) {
155 m_Description->offset += amount;
169 enum class Endpoint { Input, Output };
176 int statusFlags(Endpoint endpoint)
const;
177 uint64_t offset(Endpoint endpoint)
const;
178 void commitOffset(Endpoint endpoint, uint64_t finalOffset);
179 bool sameDescription()
const;
184#if THREADS && !defined(STANDALONE_MUTEXES)
199 FileDescriptor(
File* newFile, uint64_t newOffset = 0,
size_t newFd = 0xFFFFFFFF,
int fdFlags = 0,
203 int fdFlags = 0,
int flFlags = 0);
218 void setFlags(
int newFlags);
221 void addFlag(
int newFlag);
224 int getFlags()
const;
227 void setStatusFlags(
int newFlags);
230 void addStatusFlag(
int newFlag);
233 void removeStatusFlag(
int flag);
236 int getStatusFlags()
const;
237 bool truncateAllowed()
const {
238 return m_OpenFile && m_OpenFile->allowTruncate;
241 void setTruncateAllowed(
bool allowed) {
243 m_OpenFile->allowTruncate = allowed;
248 int getAccessFlags()
const {
249 return m_OpenFile->accessFlags;
253 OpenFileDescriptionLease acquireOpenFileDescription()
const;
259 bool networkPublished()
const;
268 bool eventFdPublished()
const;
272 bool timerFdPublished()
const;
276 bool signalFdPublished()
const;
293 PositionGuard lockPosition()
const;
296 uint64_t getOffset()
const;
299 void setOffset(uint64_t offset);
302 uint64_t read(uint64_t size, uintptr_t buffer,
bool canBlock =
true);
305 uint64_t write(uint64_t size, uintptr_t buffer,
bool canBlock =
true);
320 bool terminalHungUp()
const;
321 bool terminalAvailable()
const;
323 uint64_t readFile(uint64_t location, uint64_t size, uintptr_t buffer,
bool canBlock);
324 uint64_t writeFile(uint64_t location, uint64_t size, uintptr_t buffer,
bool canBlock);
326 File* getFile()
const {
327 return m_OpenFile ? m_OpenFile->getFile() :
nullptr;
357 bool m_TimerFdPublished =
false;
358 bool m_SignalFdPublished =
false;