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
80#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
81using UnixStreamControlLockHook = void (*)();
82void setUnixStreamControlLockHookForTest(UnixStreamControlLockHook hook);
104 size_t write(
const uint8_t* buffer,
size_t count,
bool block,
106 bool* interrupted =
nullptr);
107 size_t writeVectors(
const struct iovec* vectors,
size_t vectorCount,
bool block,
109 size_t read(uint8_t* buffer,
size_t count,
bool block,
111 size_t readVectors(
struct iovec* vectors,
size_t vectorCount,
bool block,
114 bool canWrite(
bool block);
115 bool canRead(
bool block);
116 uint64_t readableGeneration()
const;
117 uint64_t writableGeneration()
const;
118 void disableWrites();
123 void cullMonitorTargets(
Event* event);
142 : byteOffset(offset), rights(newRights) {}
148 void discardControls();
149 void discardControlsIfRequested();
157 uint64_t m_BytesWritten;
158 uint64_t m_BytesRead;
166 bool m_ReadShutdown[2];
167 bool m_WriteShutdown[2];
168 struct ucred m_Creds[2];
180 return SyncStatus::Success;
195 return m_VolumeLabel;
200 static Mutex& namespaceLock();
202 virtual void truncate(
File* pFile) {}
204 virtual void fileAttributeChanged(
File* pFile) {}
206 virtual void cacheDirectoryContents(
File* pFile) {
213 virtual void extend(
File* pFile,
size_t size) {}
229 static String m_VolumeLabel;
230 static Mutex m_NamespaceLock;
232 virtual bool isBytewise()
const {
242 enum SocketType { Streaming, Datagram };
253 SocketType type = Datagram);
256 virtual uint64_t
readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
257 bool bCanBlock =
true);
258 virtual uint64_t
writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
259 bool bCanBlock =
true);
261 uint64_t recvfrom(uint64_t size, uintptr_t buffer,
bool bCanBlock,
String& from);
264 bool sendDatagram(uint64_t size, uintptr_t buffer,
bool bCanBlock, uintptr_t source,
270 uint64_t& datagramLength);
273 uint64_t
sendStream(uint64_t size, uintptr_t buffer,
bool bCanBlock,
275 uint64_t
sendStream(
const struct iovec* vectors,
size_t vectorCount,
bool bCanBlock,
279 uint64_t
receiveStream(uint64_t size, uintptr_t buffer,
bool bCanBlock,
281 uint64_t
receiveStream(
struct iovec* vectors,
size_t vectorCount,
bool bCanBlock,
284 virtual int select(
bool bWriting =
false,
int timeout = 0);
296 bool bind(
UnixSocket* other,
bool block =
false);
302 bool shutdown(
int how);
305 bool writeShutdown()
const;
308 bool readShutdown()
const;
311 void acknowledgeBind();
329 void removeWaiter(
Event* event);
332 SocketType getType()
const {
337 SocketState getState()
const;
341 bool wasConnected()
const;
347 void failConnection();
350 bool markListening();
353 struct ucred getCredentials() const {
358 struct ucred getPeerCredentials() const;
364 SocketState getStateLocked()
const;
378 size_t remotePathLen;
382 static void destroyDatagram(
struct buf* datagram);
401 bool m_ConnectionSide;
407 struct ucred m_Creds;
411 static Mutex m_ConnectionLock;
422 bool addEntry(
const String& filename,
File* pFile);
423 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()
Utility class to provide a ring buffer.
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
A vector / dynamic array.