add linux absolute path functions

This commit is contained in:
Matthew 2026-06-21 11:42:39 +10:00
parent 53eb211a1e
commit d5399fdbac

View File

@ -1737,26 +1737,40 @@ ViewChanges(Watcher* watcher)
void void
SetEventType(WatchEvent* ev, u32 mask) SetEventType(WatchEvent* ev, u32 mask)
{ {
if(mask & IN_ACCESS) ev.type |= (mask & IN_ACCESS) ? WET.Accessed : WET.None;
{ ev.type |= (mask & IN_ATTRIB) ? WET.Metadata : WET.None;
ev.type |= WET.Accessed; ev.type |= (mask & IN_CREATE) ? WET.Created : WET.None;
} ev.type |= (mask & IN_MODIFY) ? WET.Modified : WET.None;
else if(mask & IN_ATTRIB) ev.type |= (mask & IN_DELETE) ? WET.Deleted : WET.None;
{ }
ev.type |= WET.Metadata;
} pragma(inline, true)
else if(mask & IN_CREATE) bool IsAbsolutePath(string path) => path.length && path[0] == '/';
{
ev.type |= WET.Created; string
} AbsolutePath(string path)
else if(mask & IN_MODIFY) {
{ import core.sys.posix.stdlib : realpath;
ev.type |= WET.Modified;
} const u64 MAX_PATH = 4096;
else if(mask & IN_DELETE) string result = path;
{
ev.type |= WET.Deleted; if(!IsAbsolutePath(result))
} {
static char[MAX_PATH] path_input;
static char[MAX_PATH] absolute_path;
path_input[0 .. result.length] = result[0 .. $];
path_input[result.length] = '\0';
absolute_path = '\0';
realpath(path_input.ptr, absolute_path.ptr);
result = Str(absolute_path[0 .. strlen(absolute_path.ptr)]);
}
return result;
} }
version(DLIB_TEST) unittest version(DLIB_TEST) unittest
@ -1792,32 +1806,32 @@ version(DLIB_TEST) unittest
enum WatchEventType enum WatchEventType
{ {
None = 0x0000, None = 0x0000,
File = 0x0001, File = 0x0001,
Dir = 0x0002, Dir = 0x0002,
Self = 0x0004, Self = 0x0004,
Created = 0x0008, Created = 0x0008,
Modified = 0x0010, Modified = 0x0010,
Deleted = 0x0020, Deleted = 0x0020,
Moved = 0x0040, Moved = 0x0040,
Metadata = 0x0080, Metadata = 0x0080,
Accessed = 0x0100, Accessed = 0x0100,
FileCreated = WET.File | WET.Created, FileCreated = WET.File | WET.Created,
FileModified = WET.File | WET.Modified, FileModified = WET.File | WET.Modified,
FileDeleted = WET.File | WET.Deleted, FileDeleted = WET.File | WET.Deleted,
FileMoved = WET.File | WET.Moved, FileMoved = WET.File | WET.Moved,
FileMetadata = WET.File | WET.Metadata, FileMetadata = WET.File | WET.Metadata,
FileAccessed = WET.File | WET.Accessed, FileAccessed = WET.File | WET.Accessed,
DirCreated = WET.Dir | WET.Created, DirCreated = WET.Dir | WET.Created,
DirModified = WET.Dir | WET.Modified, DirModified = WET.Dir | WET.Modified,
DirDeleted = WET.Dir | WET.Deleted, DirDeleted = WET.Dir | WET.Deleted,
DirMoved = WET.Dir | WET.Moved, DirMoved = WET.Dir | WET.Moved,
DirMetadata = WET.Dir | WET.Metadata, DirMetadata = WET.Dir | WET.Metadata,
DirAccessed = WET.Dir | WET.Accessed, DirAccessed = WET.Dir | WET.Accessed,
SelfCreated = WET.Self | WET.Created, SelfCreated = WET.Self | WET.Created,
SelfModified = WET.Self | WET.Modified, SelfModified = WET.Self | WET.Modified,
SelfDeleted = WET.Self | WET.Deleted, SelfDeleted = WET.Self | WET.Deleted,
SelfMoved = WET.Self | WET.Moved, SelfMoved = WET.Self | WET.Moved,
SelfMetadata = WET.Self | WET.Metadata, SelfMetadata = WET.Self | WET.Metadata,
SelfAccessed = WET.Self | WET.Accessed, SelfAccessed = WET.Self | WET.Accessed,
} }