20#ifndef _UNIX_FILESYSTEM_H
21#define _UNIX_FILESYSTEM_H
23#include "pedigree/kernel/LockGuard.h"
24#include "pedigree/kernel/process/Semaphore.h"
25#include "pedigree/kernel/utilities/Buffer.h"
26#include "pedigree/kernel/utilities/List.h"
27#include "pedigree/kernel/utilities/RingBuffer.h"
28#include "pedigree/kernel/utilities/SharedPointer.h"
29#include "pedigree/kernel/utilities/Vector.h"
31#include "modules/system/vfs/Directory.h"
32#include "modules/system/vfs/File.h"
33#include "modules/system/vfs/Filesystem.h"
40#if defined(PEDIGREE_EXTERNAL_SOURCE)
49 enum :
size_t { MaximumDescriptors = 253, MaximumInFlight = 16384 };
60#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
61 static size_t inFlightForTest();
73 static Mutex m_InFlightLock;
74 static size_t m_InFlight;
77#define MAX_UNIX_DGRAM_BACKLOG 65536
78#define MAX_UNIX_STREAM_QUEUE 65536
79#define MAX_UNIX_PACKET_BACKLOG 64
81#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
82using UnixStreamControlLockHook = void (*)();
83void setUnixStreamControlLockHookForTest(UnixStreamControlLockHook hook);
102 explicit Stream(
bool packets);
105 size_t write(
const uint8_t* buffer,
size_t count,
bool block,
107 bool* interrupted =
nullptr);
108 size_t writeVectors(
const struct iovec* vectors,
size_t vectorCount,
bool block,
110 size_t read(uint8_t* buffer,
size_t count,
bool block,
112 size_t readVectors(
struct iovec* vectors,
size_t vectorCount,
bool block,
115 bool writePacket(
const uint8_t* buffer,
size_t count,
bool block,
118 uint64_t& bytesRead, uint64_t& packetLength,
bool* interrupted);
124 bool canWrite(
bool block);
125 bool canRead(
bool block);
126 uint64_t readableGeneration()
const;
127 uint64_t writableGeneration()
const;
128 void disableWrites();
133 void cullMonitorTargets(
Event* event);
152 : byteOffset(offset), rights(newRights) {}
158 void discardControls();
159 void discardControlsIfRequested();
162 Packet() : bytes(
nullptr), length(0), rights() {}
171 const bool m_Packets;
180 uint64_t m_BytesWritten;
181 uint64_t m_BytesRead;
189 bool m_ReadShutdown[2];
190 bool m_WriteShutdown[2];
191 struct ucred m_Creds[2];
203 return SyncStatus::Success;
218 return m_VolumeLabel;
223 static Mutex& namespaceLock();
225 virtual void truncate(
File* pFile) {}
227 virtual void fileAttributeChanged(
File* pFile) {}
229 virtual void cacheDirectoryContents(
File* pFile) {
236 virtual void extend(
File* pFile,
size_t size) {}
252 static String m_VolumeLabel;
253 static Mutex m_NamespaceLock;
255 virtual bool isBytewise()
const {
265 enum SocketType { Streaming, Datagram, SequencedPacket };
276 SocketType type = Datagram);
279 virtual uint64_t
readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
280 bool bCanBlock =
true);
281 virtual uint64_t
writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
282 bool bCanBlock =
true);
284 uint64_t recvfrom(uint64_t size, uintptr_t buffer,
bool bCanBlock,
String& from);
287 bool sendDatagram(uint64_t size, uintptr_t buffer,
bool bCanBlock, uintptr_t source,
293 uint64_t& datagramLength);
296 uint64_t
sendStream(uint64_t size, uintptr_t buffer,
bool bCanBlock,
298 uint64_t
sendStream(
const struct iovec* vectors,
size_t vectorCount,
bool bCanBlock,
302 uint64_t
receiveStream(uint64_t size, uintptr_t buffer,
bool bCanBlock,
304 uint64_t
receiveStream(
struct iovec* vectors,
size_t vectorCount,
bool bCanBlock,
308 bool sendPacket(uint64_t size, uintptr_t buffer,
bool bCanBlock,
310 bool receivePacket(uint64_t size, uintptr_t buffer,
bool bCanBlock,
312 uint64_t& packetLength,
bool* interrupted =
nullptr);
314 virtual int select(
bool bWriting =
false,
int timeout = 0);
326 bool bind(
UnixSocket* other,
bool block =
false);
332 bool shutdown(
int how);
335 bool writeShutdown()
const;
338 bool readShutdown()
const;
341 void acknowledgeBind();
359 void removeWaiter(
Event* event);
362 SocketType getType()
const {
367 SocketState getState()
const;
371 bool wasConnected()
const;
377 void failConnection();
380 bool markListening();
383 struct ucred getCredentials() const {
388 struct ucred getPeerCredentials() const;
395 SocketState getStateLocked()
const;
409 size_t remotePathLen;
413 static void destroyDatagram(
struct buf* datagram);
432 bool m_ConnectionSide;
438 struct ucred m_Creds;
442 static Mutex m_ConnectionLock;
453 bool addEntry(
const String& filename,
File* pFile);
454 bool removeEntry(
const String& filename,
File* pFile);
static Directory * fromFile(File *pF)
virtual void cacheDirectoryContents()
virtual uint64_t read(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true) final
virtual uint64_t write(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true) final
virtual bool isDirectory()
static bool create(size_t descriptorCount, SharedPointer< SocketRights > &rights)
virtual void cacheDirectoryContents()
virtual bool renameNode(Directory *, const String &, File *, Directory *, const String &, File *)
virtual bool createFile(File *parent, const String &filename, uint32_t mask)
SyncStatus sync() override
virtual const String & getVolumeLabel() const
virtual bool removeNode(File *parent, const String &filename, File *file)
virtual bool createDirectory(File *parent, const String &filename, uint32_t mask)
virtual File * getRoot() const
virtual bool initialise(Disk *pDisk)
virtual bool createSymlink(File *parent, const String &filename, const String &value)
uint64_t sendStream(uint64_t size, uintptr_t buffer, bool bCanBlock, const SharedPointer< SocketRights > &rights, bool *interrupted=nullptr)
virtual bool isBytewise() const
bool sendDatagram(uint64_t size, uintptr_t buffer, bool bCanBlock, uintptr_t source, const SharedPointer< SocketRights > &rights, int *error=nullptr)
virtual bool isSeekable() const
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
virtual bool isSocket() const
uint64_t receiveStream(uint64_t size, uintptr_t buffer, bool bCanBlock, SharedPointer< SocketRights > *rights, bool *interrupted=nullptr)
virtual int select(bool bWriting=false, int timeout=0)
bool receiveDatagram(uint64_t size, uintptr_t buffer, bool bCanBlock, String &from, SharedPointer< SocketRights > &rights, uint64_t &bytesRead, uint64_t &datagramLength)
ReadinessGenerations readinessGenerations() override
bool sendPacket(uint64_t size, uintptr_t buffer, bool bCanBlock, const SharedPointer< SocketRights > &rights, int *error=nullptr)
A vector / dynamic array.