mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-04-05 18:17:45 +02:00
* WASI Filesystem support, initial implementation
This commit is contained in:
parent
a7db8e9f8b
commit
013f0bbdf5
File diff suppressed because it is too large
Load Diff
682
packages/wasi/src/wasitypes.pas
Normal file
682
packages/wasi/src/wasitypes.pas
Normal file
@ -0,0 +1,682 @@
|
||||
unit wasitypes;
|
||||
|
||||
{$mode ObjFPC}
|
||||
{$INTERFACES CORBA}
|
||||
|
||||
interface
|
||||
|
||||
uses JS;
|
||||
|
||||
Type
|
||||
TWasmMemoryLocation = Integer;
|
||||
// The imports as expected by WASI
|
||||
IWASI = interface ['{A03AC61B-3C68-4DA8-AC4F-53ED01814673}']
|
||||
// Please keep these sorted !!
|
||||
function args_get(argc, argvBufSize : NativeInt) : NativeInt;
|
||||
function args_sizes_get(argc, argvBufSize : NativeInt) : NativeInt;
|
||||
function clock_res_get(clockId, resolution: NativeInt): NativeInt;
|
||||
|
||||
function clock_time_get(clockId, precision : NativeInt; time: TWasmMemoryLocation): NativeInt;
|
||||
function environ_get(environ, environBuf : NativeInt) : NativeInt;
|
||||
function environ_sizes_get(environCount, environBufSize : NativeInt) : NativeInt;
|
||||
function fd_advise (fd, offset, len, advice : NativeInt) : NativeInt;
|
||||
function fd_allocate (fd, offset, len : NativeInt) : NativeInt;
|
||||
function fd_close(fd : NativeInt) : NativeInt;
|
||||
function fd_datasync (fd : NativeInt) : NativeInt;
|
||||
function fd_fdstat_get(fd : NativeInt; bufPtr: TWasmMemoryLocation) : NativeInt;
|
||||
function fd_fdstat_set_flags (fd, flags: NativeInt) : NativeInt;
|
||||
function fd_fdstat_set_rights (fd, fsRightsBase, fsRightsInheriting: NativeInt) : NativeInt;
|
||||
function fd_filestat_get (fd : NativeInt; bufPtr: TWasmMemoryLocation) : NativeInt;
|
||||
function fd_filestat_set_size (fd, stSize: NativeInt) : NativeInt;
|
||||
function fd_filestat_set_times (fd, stAtim, stMtim, fstflags: NativeInt) : NativeInt;
|
||||
function fd_pread(fd: NativeInt; iovs : TWasmMemoryLocation; iovsLen, offset: NativeInt; nread : TWasmMemoryLocation) : NativeInt;
|
||||
function fd_prestat_dir_name(fd : NativeInt; pathPtr : TWasmMemoryLocation; pathLen : NativeInt) : NativeInt;
|
||||
function fd_prestat_get(fd: NativeInt; bufPtr: TWasmMemoryLocation) : NativeInt;
|
||||
function fd_pwrite(fd, iovs, iovsLen, offset, nwritten : NativeInt) : NativeInt;
|
||||
function fd_read(fd: NativeInt; iovs : TWasmMemoryLocation; iovsLen: NativeInt; nread : TWasmMemoryLocation) : NativeInt;
|
||||
function fd_readdir(fd, bufPtr, bufLen, cookie, bufusedPtr : NativeInt) : NativeInt;
|
||||
function fd_renumber(afrom,ato : NativeInt) : NativeInt;
|
||||
function fd_seek(fd, offset, whence : NativeInt; newOffsetPtr : TWasmMemoryLocation) : NativeInt;
|
||||
function fd_sync(fd : NativeInt) : NativeInt;
|
||||
function fd_tell(fd: NativeInt; offsetPtr: TWasmMemoryLocation): NativeInt;
|
||||
function fd_write(fd,iovs,iovsLen,nwritten : NativeInt) : NativeInt;
|
||||
function path_create_directory (fd, pathPtr, pathLen : NativeInt) : NativeInt;
|
||||
function path_filestat_get (fd, flags : NativeInt; pathPtr : TWasmMemoryLocation; pathLen : Nativeint; bufPtr : TWasmMemoryLocation) : NativeInt;
|
||||
function path_filestat_set_times(fd, fstflags, pathPtr, pathLen, stAtim, stMtim : NativeInt) : NativeInt;
|
||||
function path_link (oldFd, oldFlags : NativeInt; oldPath: TWasmMemoryLocation; oldPathLen, newFd : NativeInt; NewPath: TWasmMemoryLocation; newPathLen: NativeInt) : NativeInt;
|
||||
function path_open (dirfd, dirflags : NativeInt; pathPtr : TWasmMemoryLocation; pathLen, oflags, fsRightsBase, fsRightsInheriting, fsFlags : NativeInt; fd : TWasmMemoryLocation) : NativeInt;
|
||||
function path_readlink (fd: NativeInt; pathPtr: TWasmMemoryLocation; pathLen: NativeInt; buf: TWasmMemoryLocation; bufLen : NativeInt; bufused : TWasmMemoryLocation) : NativeInt;
|
||||
function path_remove_directory (fd : NativeInt; pathPtr: TWasmMemoryLocation; pathLen : NativeInt) : NativeInt;
|
||||
function path_rename (oldFd, oldPath, oldPathLen, newFd, newPath, newPathLen : NativeInt) : NativeInt;
|
||||
function path_symlink (oldPath, oldPathLen, fd, newPath, newPathLen : NativeInt) : NativeInt;
|
||||
function path_unlink_file (fd, pathPtr, pathLen : NativeInt) : NativeInt;
|
||||
function poll_oneoff(sin, sout, nsubscriptions, nevents : NativeInt) : NativeInt;
|
||||
function proc_exit(rval : NativeInt) : NativeInt;
|
||||
function proc_raise (sig : NativeInt) : NativeInt;
|
||||
function random_get (bufPtr, bufLen: NativeInt) : NativeInt;
|
||||
function sched_yield() : NativeInt;
|
||||
function sock_recv() : NativeInt;
|
||||
function sock_send() : NativeInt;
|
||||
function sock_shutdown() : NativeInt;
|
||||
end;
|
||||
|
||||
|
||||
Const
|
||||
WASI_ESUCCESS = 0;
|
||||
WASI_E2BIG = 1;
|
||||
WASI_EACCES = 2;
|
||||
WASI_EADDRINUSE = 3;
|
||||
WASI_EADDRNOTAVAIL = 4;
|
||||
WASI_EAFNOSUPPORT = 5;
|
||||
WASI_EAGAIN = 6;
|
||||
WASI_EALREADY = 7;
|
||||
WASI_EBADF = 8;
|
||||
WASI_EBADMSG = 9;
|
||||
WASI_EBUSY = 10;
|
||||
WASI_ECANCELED = 11;
|
||||
WASI_ECHILD = 12;
|
||||
WASI_ECONNABORTED = 13;
|
||||
WASI_ECONNREFUSED = 14;
|
||||
WASI_ECONNRESET = 15;
|
||||
WASI_EDEADLK = 16;
|
||||
WASI_EDESTADDRREQ = 17;
|
||||
WASI_EDOM = 18;
|
||||
WASI_EDQUOT = 19;
|
||||
WASI_EEXIST = 20;
|
||||
WASI_EFAULT = 21;
|
||||
WASI_EFBIG = 22;
|
||||
WASI_EHOSTUNREACH = 23;
|
||||
WASI_EIDRM = 24;
|
||||
WASI_EILSEQ = 25;
|
||||
WASI_EINPROGRESS = 26;
|
||||
WASI_EINTR = 27;
|
||||
WASI_EINVAL = 28;
|
||||
WASI_EIO = 29;
|
||||
WASI_EISCONN = 30;
|
||||
WASI_EISDIR = 31;
|
||||
WASI_ELOOP = 32;
|
||||
WASI_EMFILE = 33;
|
||||
WASI_EMLINK = 34;
|
||||
WASI_EMSGSIZE = 35;
|
||||
WASI_EMULTIHOP = 36;
|
||||
WASI_ENAMETOOLONG = 37;
|
||||
WASI_ENETDOWN = 38;
|
||||
WASI_ENETRESET = 39;
|
||||
WASI_ENETUNREACH = 40;
|
||||
WASI_ENFILE = 41;
|
||||
WASI_ENOBUFS = 42;
|
||||
WASI_ENODEV = 43;
|
||||
WASI_ENOENT = 44;
|
||||
WASI_ENOEXEC = 45;
|
||||
WASI_ENOLCK = 46;
|
||||
WASI_ENOLINK = 47;
|
||||
WASI_ENOMEM = 48;
|
||||
WASI_ENOMSG = 49;
|
||||
WASI_ENOPROTOOPT = 50;
|
||||
WASI_ENOSPC = 51;
|
||||
WASI_ENOSYS = 52;
|
||||
WASI_ENOTCONN = 53;
|
||||
WASI_ENOTDIR = 54;
|
||||
WASI_ENOTEMPTY = 55;
|
||||
WASI_ENOTRECOVERABLE = 56;
|
||||
WASI_ENOTSOCK = 57;
|
||||
WASI_ENOTSUP = 58;
|
||||
WASI_ENOTTY = 59;
|
||||
WASI_ENXIO = 60;
|
||||
WASI_EOVERFLOW = 61;
|
||||
WASI_EOWNERDEAD = 62;
|
||||
WASI_EPERM = 63;
|
||||
WASI_EPIPE = 64;
|
||||
WASI_EPROTO = 65;
|
||||
WASI_EPROTONOSUPPORT = 66;
|
||||
WASI_EPROTOTYPE = 67;
|
||||
WASI_ERANGE = 68;
|
||||
WASI_EROFS = 69;
|
||||
WASI_ESPIPE = 70;
|
||||
WASI_ESRCH = 71;
|
||||
WASI_ESTALE = 72;
|
||||
WASI_ETIMEDOUT = 73;
|
||||
WASI_ETXTBSY = 74;
|
||||
WASI_EXDEV = 75;
|
||||
WASI_ENOTCAPABLE = 76;
|
||||
|
||||
WASI_SIGABRT = 0;
|
||||
WASI_SIGALRM = 1;
|
||||
WASI_SIGBUS = 2;
|
||||
WASI_SIGCHLD = 3;
|
||||
WASI_SIGCONT = 4;
|
||||
WASI_SIGFPE = 5;
|
||||
WASI_SIGHUP = 6;
|
||||
WASI_SIGILL = 7;
|
||||
WASI_SIGINT = 8;
|
||||
WASI_SIGKILL = 9;
|
||||
WASI_SIGPIPE = 10;
|
||||
WASI_SIGQUIT = 11;
|
||||
WASI_SIGSEGV = 12;
|
||||
WASI_SIGSTOP = 13;
|
||||
WASI_SIGTERM = 14;
|
||||
WASI_SIGTRAP = 15;
|
||||
WASI_SIGTSTP = 16;
|
||||
WASI_SIGTTIN = 17;
|
||||
WASI_SIGTTOU = 18;
|
||||
WASI_SIGURG = 19;
|
||||
WASI_SIGUSR1 = 20;
|
||||
WASI_SIGUSR2 = 21;
|
||||
WASI_SIGVTALRM = 22;
|
||||
WASI_SIGXCPU = 23;
|
||||
WASI_SIGXFSZ = 24;
|
||||
|
||||
WASI_FILETYPE_UNKNOWN = 0;
|
||||
WASI_FILETYPE_BLOCK_DEVICE = 1;
|
||||
WASI_FILETYPE_CHARACTER_DEVICE = 2;
|
||||
WASI_FILETYPE_DIRECTORY = 3;
|
||||
WASI_FILETYPE_REGULAR_FILE = 4;
|
||||
WASI_FILETYPE_SOCKET_DGRAM = 5;
|
||||
WASI_FILETYPE_SOCKET_STREAM = 6;
|
||||
WASI_FILETYPE_SYMBOLIC_LINK = 7;
|
||||
|
||||
WASI_FDFLAG_APPEND = $0001;
|
||||
WASI_FDFLAG_DSYNC = $0002;
|
||||
WASI_FDFLAG_NONBLOCK = $0004;
|
||||
WASI_FDFLAG_RSYNC = $0008;
|
||||
WASI_FDFLAG_SYNC = $0010;
|
||||
|
||||
WASI_RIGHT_FD_DATASYNC = $0000000000000001;
|
||||
WASI_RIGHT_FD_READ = $0000000000000002;
|
||||
WASI_RIGHT_FD_SEEK = $0000000000000004;
|
||||
WASI_RIGHT_FD_FDSTAT_SET_FLAGS = $0000000000000008;
|
||||
WASI_RIGHT_FD_SYNC = $0000000000000010;
|
||||
WASI_RIGHT_FD_TELL = $0000000000000020;
|
||||
WASI_RIGHT_FD_WRITE = $0000000000000040;
|
||||
WASI_RIGHT_FD_ADVISE = $0000000000000080;
|
||||
WASI_RIGHT_FD_ALLOCATE = $0000000000000100;
|
||||
WASI_RIGHT_PATH_CREATE_DIRECTORY = $0000000000000200;
|
||||
WASI_RIGHT_PATH_CREATE_FILE = $0000000000000400;
|
||||
WASI_RIGHT_PATH_LINK_SOURCE = $0000000000000800;
|
||||
WASI_RIGHT_PATH_LINK_TARGET = $0000000000001000;
|
||||
WASI_RIGHT_PATH_OPEN = $0000000000002000;
|
||||
WASI_RIGHT_FD_READDIR = $0000000000004000;
|
||||
WASI_RIGHT_PATH_READLINK = $0000000000008000;
|
||||
WASI_RIGHT_PATH_RENAME_SOURCE = $0000000000010000;
|
||||
WASI_RIGHT_PATH_RENAME_TARGET = $0000000000020000;
|
||||
WASI_RIGHT_PATH_FILESTAT_GET = $0000000000040000;
|
||||
WASI_RIGHT_PATH_FILESTAT_SET_SIZE = $0000000000080000;
|
||||
WASI_RIGHT_PATH_FILESTAT_SET_TIMES = $0000000000100000;
|
||||
WASI_RIGHT_FD_FILESTAT_GET = $0000000000200000;
|
||||
WASI_RIGHT_FD_FILESTAT_SET_SIZE = $0000000000400000;
|
||||
WASI_RIGHT_FD_FILESTAT_SET_TIMES = $0000000000800000;
|
||||
WASI_RIGHT_PATH_SYMLINK = $0000000001000000;
|
||||
WASI_RIGHT_PATH_REMOVE_DIRECTORY = $0000000002000000;
|
||||
WASI_RIGHT_PATH_UNLINK_FILE = $0000000004000000;
|
||||
WASI_RIGHT_POLL_FD_READWRITE = $0000000008000000;
|
||||
WASI_RIGHT_SOCK_SHUTDOWN = $0000000010000000;
|
||||
|
||||
RIGHTS_ALL = WASI_RIGHT_FD_DATASYNC or WASI_RIGHT_FD_READ
|
||||
or WASI_RIGHT_FD_SEEK or WASI_RIGHT_FD_FDSTAT_SET_FLAGS or WASI_RIGHT_FD_SYNC
|
||||
or WASI_RIGHT_FD_TELL or WASI_RIGHT_FD_WRITE or WASI_RIGHT_FD_ADVISE
|
||||
or WASI_RIGHT_FD_ALLOCATE or WASI_RIGHT_PATH_CREATE_DIRECTORY
|
||||
or WASI_RIGHT_PATH_CREATE_FILE or WASI_RIGHT_PATH_LINK_SOURCE
|
||||
or WASI_RIGHT_PATH_LINK_TARGET or WASI_RIGHT_PATH_OPEN or WASI_RIGHT_FD_READDIR
|
||||
or WASI_RIGHT_PATH_READLINK or WASI_RIGHT_PATH_RENAME_SOURCE
|
||||
or WASI_RIGHT_PATH_RENAME_TARGET or WASI_RIGHT_PATH_FILESTAT_GET
|
||||
or WASI_RIGHT_PATH_FILESTAT_SET_SIZE or WASI_RIGHT_PATH_FILESTAT_SET_TIMES
|
||||
or WASI_RIGHT_FD_FILESTAT_GET or WASI_RIGHT_FD_FILESTAT_SET_TIMES
|
||||
or WASI_RIGHT_FD_FILESTAT_SET_SIZE or WASI_RIGHT_PATH_SYMLINK
|
||||
or WASI_RIGHT_PATH_UNLINK_FILE or WASI_RIGHT_PATH_REMOVE_DIRECTORY
|
||||
or WASI_RIGHT_POLL_FD_READWRITE or WASI_RIGHT_SOCK_SHUTDOWN;
|
||||
|
||||
RIGHTS_BLOCK_DEVICE_BASE = RIGHTS_ALL;
|
||||
RIGHTS_BLOCK_DEVICE_INHERITING = RIGHTS_ALL;
|
||||
|
||||
RIGHTS_CHARACTER_DEVICE_BASE = RIGHTS_ALL;
|
||||
RIGHTS_CHARACTER_DEVICE_INHERITING = RIGHTS_ALL;
|
||||
|
||||
RIGHTS_REGULAR_FILE_BASE = WASI_RIGHT_FD_DATASYNC or WASI_RIGHT_FD_READ
|
||||
or WASI_RIGHT_FD_SEEK or WASI_RIGHT_FD_FDSTAT_SET_FLAGS or WASI_RIGHT_FD_SYNC
|
||||
or WASI_RIGHT_FD_TELL or WASI_RIGHT_FD_WRITE or WASI_RIGHT_FD_ADVISE
|
||||
or WASI_RIGHT_FD_ALLOCATE or WASI_RIGHT_FD_FILESTAT_GET
|
||||
or WASI_RIGHT_FD_FILESTAT_SET_SIZE or WASI_RIGHT_FD_FILESTAT_SET_TIMES
|
||||
or WASI_RIGHT_POLL_FD_READWRITE;
|
||||
RIGHTS_REGULAR_FILE_INHERITING = 00;
|
||||
|
||||
RIGHTS_DIRECTORY_BASE = WASI_RIGHT_FD_FDSTAT_SET_FLAGS
|
||||
or WASI_RIGHT_FD_SYNC or WASI_RIGHT_FD_ADVISE or WASI_RIGHT_PATH_CREATE_DIRECTORY
|
||||
or WASI_RIGHT_PATH_CREATE_FILE or WASI_RIGHT_PATH_LINK_SOURCE
|
||||
or WASI_RIGHT_PATH_LINK_TARGET or WASI_RIGHT_PATH_OPEN or WASI_RIGHT_FD_READDIR
|
||||
or WASI_RIGHT_PATH_READLINK or WASI_RIGHT_PATH_RENAME_SOURCE
|
||||
or WASI_RIGHT_PATH_RENAME_TARGET or WASI_RIGHT_PATH_FILESTAT_GET
|
||||
or WASI_RIGHT_PATH_FILESTAT_SET_SIZE or WASI_RIGHT_PATH_FILESTAT_SET_TIMES
|
||||
or WASI_RIGHT_FD_FILESTAT_GET or WASI_RIGHT_FD_FILESTAT_SET_TIMES
|
||||
or WASI_RIGHT_PATH_SYMLINK or WASI_RIGHT_PATH_UNLINK_FILE
|
||||
or WASI_RIGHT_PATH_REMOVE_DIRECTORY or WASI_RIGHT_POLL_FD_READWRITE;
|
||||
RIGHTS_DIRECTORY_INHERITING = RIGHTS_DIRECTORY_BASE
|
||||
or RIGHTS_REGULAR_FILE_BASE;
|
||||
|
||||
RIGHTS_SOCKET_BASE = WASI_RIGHT_FD_READ or WASI_RIGHT_FD_FDSTAT_SET_FLAGS
|
||||
or WASI_RIGHT_FD_WRITE or WASI_RIGHT_FD_FILESTAT_GET
|
||||
or WASI_RIGHT_POLL_FD_READWRITE or WASI_RIGHT_SOCK_SHUTDOWN;
|
||||
|
||||
RIGHTS_SOCKET_INHERITING = RIGHTS_ALL;
|
||||
|
||||
RIGHTS_TTY_BASE = WASI_RIGHT_FD_READ or WASI_RIGHT_FD_FDSTAT_SET_FLAGS
|
||||
or WASI_RIGHT_FD_WRITE or WASI_RIGHT_FD_FILESTAT_GET
|
||||
or WASI_RIGHT_POLL_FD_READWRITE;
|
||||
|
||||
RIGHTS_TTY_INHERITING = 0;
|
||||
|
||||
WASI_CLOCK_MONOTONIC = 0;
|
||||
WASI_CLOCK_PROCESS_CPUTIME_ID = 1;
|
||||
WASI_CLOCK_REALTIME = 2;
|
||||
WASI_CLOCK_THREAD_CPUTIME_ID = 3;
|
||||
|
||||
WASI_EVENTTYPE_CLOCK = 0;
|
||||
WASI_EVENTTYPE_FD_READ = 1;
|
||||
WASI_EVENTTYPE_FD_WRITE = 2;
|
||||
|
||||
WASI_FILESTAT_SET_ATIM = 1 << 0;
|
||||
WASI_FILESTAT_SET_ATIM_NOW = 1 << 1;
|
||||
WASI_FILESTAT_SET_MTIM = 1 << 2;
|
||||
WASI_FILESTAT_SET_MTIM_NOW = 1 << 3;
|
||||
|
||||
WASI_O_CREAT = 1 << 0;
|
||||
WASI_O_DIRECTORY = 1 << 1;
|
||||
WASI_O_EXCL = 1 << 2;
|
||||
WASI_O_TRUNC = 1 << 3;
|
||||
|
||||
WASI_PREOPENTYPE_DIR = 0;
|
||||
|
||||
WASI_DIRCOOKIE_START = 0;
|
||||
|
||||
WASI_STDIN_FILENO = 0;
|
||||
WASI_STDOUT_FILENO = 1;
|
||||
WASI_STDERR_FILENO = 2;
|
||||
|
||||
WASI_WHENCE_CUR = 0;
|
||||
WASI_WHENCE_END = 1;
|
||||
WASI_WHENCE_SET = 2;
|
||||
|
||||
__WASI_CLOCKID_REALTIME = 0;
|
||||
__WASI_CLOCKID_MONOTONIC = 1;
|
||||
__WASI_CLOCKID_PROCESS_CPUTIME_ID = 2;
|
||||
__WASI_CLOCKID_THREAD_CPUTIME_ID = 3;
|
||||
|
||||
__WASI_ERRNO_SUCCESS = 0;
|
||||
__WASI_ERRNO_2BIG = 1;
|
||||
__WASI_ERRNO_ACCES = 2;
|
||||
__WASI_ERRNO_ADDRINUSE = 3;
|
||||
__WASI_ERRNO_ADDRNOTAVAIL = 4;
|
||||
__WASI_ERRNO_AFNOSUPPORT = 5;
|
||||
__WASI_ERRNO_AGAIN = 6;
|
||||
__WASI_ERRNO_ALREADY = 7;
|
||||
__WASI_ERRNO_BADF = 8;
|
||||
__WASI_ERRNO_BADMSG = 9;
|
||||
__WASI_ERRNO_BUSY = 10;
|
||||
__WASI_ERRNO_CANCELED = 11;
|
||||
__WASI_ERRNO_CHILD = 12;
|
||||
__WASI_ERRNO_CONNABORTED = 13;
|
||||
__WASI_ERRNO_CONNREFUSED = 14;
|
||||
__WASI_ERRNO_CONNRESET = 15;
|
||||
__WASI_ERRNO_DEADLK = 16;
|
||||
__WASI_ERRNO_DESTADDRREQ = 17;
|
||||
__WASI_ERRNO_DOM = 18;
|
||||
__WASI_ERRNO_DQUOT = 19;
|
||||
__WASI_ERRNO_EXIST = 20;
|
||||
__WASI_ERRNO_FAULT = 21;
|
||||
__WASI_ERRNO_FBIG = 22;
|
||||
__WASI_ERRNO_HOSTUNREACH = 23;
|
||||
__WASI_ERRNO_IDRM = 24;
|
||||
__WASI_ERRNO_ILSEQ = 25;
|
||||
__WASI_ERRNO_INPROGRESS = 26;
|
||||
__WASI_ERRNO_INTR = 27;
|
||||
__WASI_ERRNO_INVAL = 28;
|
||||
__WASI_ERRNO_IO = 29;
|
||||
__WASI_ERRNO_ISCONN = 30;
|
||||
__WASI_ERRNO_ISDIR = 31;
|
||||
__WASI_ERRNO_LOOP = 32;
|
||||
__WASI_ERRNO_MFILE = 33;
|
||||
__WASI_ERRNO_MLINK = 34;
|
||||
__WASI_ERRNO_MSGSIZE = 35;
|
||||
__WASI_ERRNO_MULTIHOP = 36;
|
||||
__WASI_ERRNO_NAMETOOLONG = 37;
|
||||
__WASI_ERRNO_NETDOWN = 38;
|
||||
__WASI_ERRNO_NETRESET = 39;
|
||||
__WASI_ERRNO_NETUNREACH = 40;
|
||||
__WASI_ERRNO_NFILE = 41;
|
||||
__WASI_ERRNO_NOBUFS = 42;
|
||||
__WASI_ERRNO_NODEV = 43;
|
||||
__WASI_ERRNO_NOENT = 44;
|
||||
__WASI_ERRNO_NOEXEC = 45;
|
||||
__WASI_ERRNO_NOLCK = 46;
|
||||
__WASI_ERRNO_NOLINK = 47;
|
||||
__WASI_ERRNO_NOMEM = 48;
|
||||
__WASI_ERRNO_NOMSG = 49;
|
||||
__WASI_ERRNO_NOPROTOOPT = 50;
|
||||
__WASI_ERRNO_NOSPC = 51;
|
||||
__WASI_ERRNO_NOSYS = 52;
|
||||
__WASI_ERRNO_NOTCONN = 53;
|
||||
__WASI_ERRNO_NOTDIR = 54;
|
||||
__WASI_ERRNO_NOTEMPTY = 55;
|
||||
__WASI_ERRNO_NOTRECOVERABLE = 56;
|
||||
__WASI_ERRNO_NOTSOCK = 57;
|
||||
__WASI_ERRNO_NOTSUP = 58;
|
||||
__WASI_ERRNO_NOTTY = 59;
|
||||
__WASI_ERRNO_NXIO = 60;
|
||||
__WASI_ERRNO_OVERFLOW = 61;
|
||||
__WASI_ERRNO_OWNERDEAD = 62;
|
||||
__WASI_ERRNO_PERM = 63;
|
||||
__WASI_ERRNO_PIPE = 64;
|
||||
__WASI_ERRNO_PROTO = 65;
|
||||
__WASI_ERRNO_PROTONOSUPPORT = 66;
|
||||
__WASI_ERRNO_PROTOTYPE = 67;
|
||||
__WASI_ERRNO_RANGE = 68;
|
||||
__WASI_ERRNO_ROFS = 69;
|
||||
__WASI_ERRNO_SPIPE = 70;
|
||||
__WASI_ERRNO_SRCH = 71;
|
||||
__WASI_ERRNO_STALE = 72;
|
||||
__WASI_ERRNO_TIMEDOUT = 73;
|
||||
__WASI_ERRNO_TXTBSY = 74;
|
||||
__WASI_ERRNO_XDEV = 75;
|
||||
__WASI_ERRNO_NOTCAPABLE = 76;
|
||||
|
||||
|
||||
const
|
||||
__WASI_RIGHTS_FD_DATASYNC = 1;
|
||||
__WASI_RIGHTS_FD_READ = 2;
|
||||
__WASI_RIGHTS_FD_SEEK = 4;
|
||||
__WASI_RIGHTS_FD_FDSTAT_SET_FLAGS = 8;
|
||||
__WASI_RIGHTS_FD_SYNC = 16;
|
||||
__WASI_RIGHTS_FD_TELL = 32;
|
||||
__WASI_RIGHTS_FD_WRITE = 64;
|
||||
__WASI_RIGHTS_FD_ADVISE = 128;
|
||||
__WASI_RIGHTS_FD_ALLOCATE = 256;
|
||||
__WASI_RIGHTS_PATH_CREATE_DIRECTORY = 512;
|
||||
__WASI_RIGHTS_PATH_CREATE_FILE = 1024;
|
||||
__WASI_RIGHTS_PATH_LINK_SOURCE = 2048;
|
||||
__WASI_RIGHTS_PATH_LINK_TARGET = 4096;
|
||||
__WASI_RIGHTS_PATH_OPEN = 8192;
|
||||
__WASI_RIGHTS_FD_READDIR = 16384;
|
||||
__WASI_RIGHTS_PATH_READLINK = 32768;
|
||||
__WASI_RIGHTS_PATH_RENAME_SOURCE = 65536;
|
||||
__WASI_RIGHTS_PATH_RENAME_TARGET = 131072;
|
||||
__WASI_RIGHTS_PATH_FILESTAT_GET = 262144;
|
||||
__WASI_RIGHTS_PATH_FILESTAT_SET_SIZE = 524288;
|
||||
__WASI_RIGHTS_PATH_FILESTAT_SET_TIMES = 1048576;
|
||||
__WASI_RIGHTS_FD_FILESTAT_GET = 2097152;
|
||||
__WASI_RIGHTS_FD_FILESTAT_SET_SIZE = 4194304;
|
||||
__WASI_RIGHTS_FD_FILESTAT_SET_TIMES = 8388608;
|
||||
__WASI_RIGHTS_PATH_SYMLINK = 16777216;
|
||||
__WASI_RIGHTS_PATH_REMOVE_DIRECTORY = 33554432;
|
||||
__WASI_RIGHTS_PATH_UNLINK_FILE = 67108864;
|
||||
__WASI_RIGHTS_POLL_FD_READWRITE = 134217728;
|
||||
__WASI_RIGHTS_SOCK_SHUTDOWN = 268435456;
|
||||
|
||||
const
|
||||
__WASI_SIGNAL_NONE = 0;
|
||||
__WASI_SIGNAL_HUP = 1;
|
||||
__WASI_SIGNAL_INT = 2;
|
||||
__WASI_SIGNAL_QUIT = 3;
|
||||
__WASI_SIGNAL_ILL = 4;
|
||||
__WASI_SIGNAL_TRAP = 5;
|
||||
__WASI_SIGNAL_ABRT = 6;
|
||||
__WASI_SIGNAL_BUS = 7;
|
||||
__WASI_SIGNAL_FPE = 8;
|
||||
__WASI_SIGNAL_KILL = 9;
|
||||
__WASI_SIGNAL_USR1 = 10;
|
||||
__WASI_SIGNAL_SEGV = 11;
|
||||
__WASI_SIGNAL_USR2 = 12;
|
||||
__WASI_SIGNAL_PIPE = 13;
|
||||
__WASI_SIGNAL_ALRM = 14;
|
||||
__WASI_SIGNAL_TERM = 15;
|
||||
__WASI_SIGNAL_CHLD = 16;
|
||||
__WASI_SIGNAL_CONT = 17;
|
||||
__WASI_SIGNAL_STOP = 18;
|
||||
__WASI_SIGNAL_TSTP = 19;
|
||||
__WASI_SIGNAL_TTIN = 20;
|
||||
__WASI_SIGNAL_TTOU = 21;
|
||||
__WASI_SIGNAL_URG = 22;
|
||||
__WASI_SIGNAL_XCPU = 23;
|
||||
__WASI_SIGNAL_XFSZ = 24;
|
||||
__WASI_SIGNAL_VTALRM = 25;
|
||||
__WASI_SIGNAL_PROF = 26;
|
||||
__WASI_SIGNAL_WINCH = 27;
|
||||
__WASI_SIGNAL_POLL = 28;
|
||||
__WASI_SIGNAL_PWR = 29;
|
||||
__WASI_SIGNAL_SYS = 30;
|
||||
|
||||
__WASI_ROFLAGS_RECV_DATA_TRUNCATED = 1;
|
||||
|
||||
|
||||
const
|
||||
__WASI_WHENCE_SET = 0;
|
||||
__WASI_WHENCE_CUR = 1;
|
||||
__WASI_WHENCE_END = 2;
|
||||
|
||||
__WASI_FILETYPE_UNKNOWN = 0;
|
||||
__WASI_FILETYPE_BLOCK_DEVICE = 1;
|
||||
__WASI_FILETYPE_CHARACTER_DEVICE = 2;
|
||||
__WASI_FILETYPE_DIRECTORY = 3;
|
||||
__WASI_FILETYPE_REGULAR_FILE = 4;
|
||||
__WASI_FILETYPE_SOCKET_DGRAM = 5;
|
||||
__WASI_FILETYPE_SOCKET_STREAM = 6;
|
||||
__WASI_FILETYPE_SYMBOLIC_LINK = 7;
|
||||
|
||||
|
||||
|
||||
__WASI_OFLAGS_CREAT = 1;
|
||||
__WASI_OFLAGS_DIRECTORY = 2;
|
||||
__WASI_OFLAGS_EXCL = 4;
|
||||
__WASI_OFLAGS_TRUNC = 8;
|
||||
|
||||
__WASI_FSTFLAGS_ATIM = 1;
|
||||
__WASI_FSTFLAGS_ATIM_NOW = 2;
|
||||
__WASI_FSTFLAGS_MTIM = 4;
|
||||
__WASI_FSTFLAGS_MTIM_NOW = 8;
|
||||
|
||||
__WASI_ADVICE_NORMAL = 0;
|
||||
__WASI_ADVICE_SEQUENTIAL = 1;
|
||||
__WASI_ADVICE_RANDOM = 2;
|
||||
__WASI_ADVICE_WILLNEED = 3;
|
||||
__WASI_ADVICE_DONTNEED = 4;
|
||||
__WASI_ADVICE_NOREUSE = 5;
|
||||
|
||||
|
||||
__WASI_FDFLAGS_APPEND = 1;
|
||||
__WASI_FDFLAGS_DSYNC = 2;
|
||||
__WASI_FDFLAGS_NONBLOCK = 4;
|
||||
__WASI_FDFLAGS_RSYNC = 8;
|
||||
__WASI_FDFLAGS_SYNC = 16;
|
||||
|
||||
|
||||
|
||||
__WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME = 1;
|
||||
|
||||
__WASI_RIFLAGS_RECV_PEEK = 1;
|
||||
__WASI_RIFLAGS_RECV_WAITALL = 2;
|
||||
|
||||
__WASI_LOOKUPFLAGS_SYMLINK_FOLLOW = 1;
|
||||
|
||||
__WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP = 1;
|
||||
|
||||
type
|
||||
PUInt8 = NativeInt;
|
||||
size_t = longint;
|
||||
|
||||
__wasi_size_t = longint;
|
||||
__wasi_filesize_t = UInt64;
|
||||
__wasi_timestamp_t = UInt64;
|
||||
__wasi_clockid_t = UInt32;
|
||||
__wasi_errno_t = UInt16;
|
||||
__wasi_fd_t = longint;
|
||||
__wasi_filedelta_t = Int64;
|
||||
__wasi_whence_t = UInt8;
|
||||
__wasi_dircookie_t = UInt64;
|
||||
__wasi_dirnamlen_t = UInt32;
|
||||
__wasi_inode_t = UInt64;
|
||||
__wasi_filetype_t = UInt8;
|
||||
__wasi_rights_t = UInt64;
|
||||
__wasi_exitcode_t = UInt32;
|
||||
__wasi_signal_t = UInt8;
|
||||
__wasi_riflags_t = UInt16;
|
||||
__wasi_roflags_t = UInt16;
|
||||
__wasi_siflags_t = UInt16;
|
||||
__wasi_sdflags_t = UInt8;
|
||||
__wasi_preopentype_t = UInt8;
|
||||
__wasi_advice_t = UInt8;
|
||||
__wasi_fdflags_t = UInt16;
|
||||
__wasi_device_t = UInt64;
|
||||
__wasi_fstflags_t = UInt16;
|
||||
__wasi_lookupflags_t = UInt32;
|
||||
__wasi_oflags_t = UInt16;
|
||||
__wasi_linkcount_t = UInt64;
|
||||
__wasi_userdata_t = UInt64;
|
||||
__wasi_eventtype_t = UInt8;
|
||||
__wasi_eventrwflags_t = UInt16;
|
||||
__wasi_subclockflags_t = UInt16;
|
||||
|
||||
|
||||
|
||||
__wasi_iovec_t = record
|
||||
buf: PUInt8;
|
||||
buf_len: __wasi_size_t;
|
||||
end;
|
||||
TWASIIOVec = __wasi_iovec_t;
|
||||
|
||||
__wasi_ciovec_t = record
|
||||
buf: PUInt8;
|
||||
buf_len: __wasi_size_t;
|
||||
end;
|
||||
TWASICIOVec = __wasi_ciovec_t;
|
||||
|
||||
__wasi_dirent_t = record
|
||||
d_next: __wasi_dircookie_t;
|
||||
d_ino: __wasi_inode_t;
|
||||
d_namlen: __wasi_dirnamlen_t;
|
||||
d_type: __wasi_filetype_t;
|
||||
end;
|
||||
TWASIDirent = __wasi_dirent_t;
|
||||
|
||||
__wasi_fdstat_t = record
|
||||
fs_filetype: __wasi_filetype_t;
|
||||
fs_flags: __wasi_fdflags_t;
|
||||
fs_rights_base: __wasi_rights_t;
|
||||
fs_rights_inheriting: __wasi_rights_t;
|
||||
end;
|
||||
TWASIFDStat = __wasi_fdstat_t;
|
||||
|
||||
__wasi_filestat_t = record
|
||||
dev: __wasi_device_t;
|
||||
ino: __wasi_inode_t;
|
||||
filetype: __wasi_filetype_t;
|
||||
nlink: __wasi_linkcount_t;
|
||||
size: __wasi_filesize_t;
|
||||
atim: __wasi_timestamp_t;
|
||||
mtim: __wasi_timestamp_t;
|
||||
ctim: __wasi_timestamp_t;
|
||||
end;
|
||||
TWASIFilestat = __wasi_filestat_t;
|
||||
|
||||
__wasi_event_fd_readwrite_t = record
|
||||
nbytes: __wasi_filesize_t;
|
||||
flags: __wasi_eventrwflags_t;
|
||||
end;
|
||||
TWASIEventFDReadWrite = __wasi_event_fd_readwrite_t;
|
||||
|
||||
__wasi_event_t = record
|
||||
userdata: __wasi_userdata_t;
|
||||
error: __wasi_errno_t;
|
||||
type_: __wasi_eventtype_t;
|
||||
fd_readwrite: __wasi_event_fd_readwrite_t;
|
||||
end;
|
||||
TWASIEvent = __wasi_event_t;
|
||||
|
||||
__wasi_subscription_clock_t = record
|
||||
id: __wasi_clockid_t;
|
||||
timeout: __wasi_timestamp_t;
|
||||
precision: __wasi_timestamp_t;
|
||||
flags: __wasi_subclockflags_t;
|
||||
end;
|
||||
TWASISubscriptionClock = __wasi_subscription_clock_t;
|
||||
|
||||
__wasi_subscription_fd_readwrite_t = record
|
||||
file_descriptor: __wasi_fd_t;
|
||||
end;
|
||||
TWASISubscriptionDSReadWrite = __wasi_subscription_fd_readwrite_t;
|
||||
|
||||
// The following 3 represent a part of the variant record.
|
||||
__wasi_subscription_u_u_t_0 = record
|
||||
clock: __wasi_subscription_clock_t;
|
||||
end;
|
||||
__wasi_subscription_u_u_t_1 = record
|
||||
fd_read: __wasi_subscription_fd_readwrite_t
|
||||
end;
|
||||
__wasi_subscription_u_u_t_2 = record
|
||||
fd_write: __wasi_subscription_fd_readwrite_t
|
||||
end;
|
||||
|
||||
__wasi_subscription_u_u_t = Record
|
||||
// Note, this is a variant record
|
||||
Clock : __wasi_subscription_clock_t; {case 0}
|
||||
fd_read: __wasi_subscription_fd_readwrite_t; {case 1}
|
||||
fd_write: __wasi_subscription_fd_readwrite_t; {case 2}
|
||||
end;
|
||||
|
||||
__wasi_subscription_u_t = record
|
||||
tag: __wasi_eventtype_t;
|
||||
u: __wasi_subscription_u_u_t;
|
||||
end;
|
||||
|
||||
__wasi_subscription_t = record
|
||||
userdata: __wasi_userdata_t;
|
||||
u: __wasi_subscription_u_t;
|
||||
end;
|
||||
|
||||
__wasi_prestat_dir_t = record
|
||||
pr_name_len: __wasi_size_t;
|
||||
end;
|
||||
TWASIPrestatDir = __wasi_prestat_dir_t;
|
||||
|
||||
__wasi_prestat_u_t = record
|
||||
dir: __wasi_prestat_dir_t;
|
||||
end;
|
||||
TWasiPrestatU = __wasi_prestat_u_t;
|
||||
|
||||
__wasi_prestat_t = record
|
||||
tag: __wasi_preopentype_t;
|
||||
u: __wasi_prestat_u_t;
|
||||
end;
|
||||
TWasiPreStat = __wasi_prestat_t;
|
||||
|
||||
|
||||
{ EWasiFSError }
|
||||
|
||||
{ IWASIFS }
|
||||
TSeekWhence = (swBeginning, swCurrent, swEnd);
|
||||
TSetTimesFlag = (stfatime,stfaTimeNow,stfmTime,stfmTimeNow);
|
||||
TSetTimesFlags = set of TSetTimesFlag;
|
||||
|
||||
IWASIFS = Interface
|
||||
Function MkDirAt(FD : Integer; const aPath : String) : NativeInt;
|
||||
Function RmDirAt(FD : Integer; const aPath : String) : NativeInt;
|
||||
function StatAt(FD : Integer; const aPath : String; var stat: TWasiFileStat) : NativeInt;
|
||||
function StatFD(FD : Integer; var stat: TWasiFileStat) : NativeInt;
|
||||
Function UTimesAt(FD : Integer; aPath : String; aTime,MTime : TJSDate; UpdateLink : boolean) : NativeInt;
|
||||
Function UTimes(FD : Integer; aTime,MTime : TJSDate; Flags : TSetTimesFlags) : NativeInt;
|
||||
Function LinkAt(OldFD : Integer; OldPath : String; NewFD : Integer; NewPath : String) : NativeInt;
|
||||
Function SymLinkAt(FD : Integer; Path : String; Target : String) : NativeInt;
|
||||
Function RenameAt(OldFD : Integer; OldPath : String; NewFD : Integer; NewPath : String) : NativeInt;
|
||||
Function UnLinkAt(FD : Integer; const aPath : String) : NativeInt;
|
||||
function OpenAt(FD : Integer; FDFlags : NativeInt; aPath : String; Flags, fsRightsBase, fsRightsInheriting, fsFlags: NativeInt; out Openfd: Integer): NativeInt;
|
||||
function ReadLinkAt(FD : Integer; aPath : String; out aTarget : String): NativeInt;
|
||||
function Close(FD : Integer): NativeInt;
|
||||
function Write(FD : Integer; Data : TJSUint8Array; AtPos : Integer; Out Written : Integer) : NativeInt;
|
||||
function Sync(FD : Integer) : NativeInt;
|
||||
function DataSync(FD : Integer) : NativeInt;
|
||||
function Seek(FD : integer; Offset : Integer; Whence : TSeekWhence; out NewPos : Integer) : NativeInt;
|
||||
Function Read(FD : Integer; Data : TJSUint8Array; AtPos : Integer; Out BytesRead : Integer) : NativeInt;
|
||||
Function GetPrestat(FD: Integer) : String;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
end.
|
||||
|
444
packages/wasi/src/wasizenfs.pas
Normal file
444
packages/wasi/src/wasizenfs.pas
Normal file
@ -0,0 +1,444 @@
|
||||
unit wasizenfs;
|
||||
|
||||
{$mode ObjFPC}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
JS, libzenfs, Wasitypes;
|
||||
|
||||
Type
|
||||
|
||||
{ TWASIZenFS }
|
||||
|
||||
TWASIZenFS = class (TObject,IWasiFS)
|
||||
private
|
||||
FRoot : TZenFSDir;
|
||||
protected
|
||||
function PrependFD(FD: Integer; aPath: String): string;
|
||||
class function ExceptToError(E : TJSObject) : Integer;
|
||||
class function ZenFSDateToWasiTimeStamp(aDate: TJSDate): Nativeint;
|
||||
class function ZenStatToWasiStat(ZSTat: TZenFSStats): TWasiFileStat;
|
||||
Public
|
||||
Function MkDirAt(FD : Integer; const aPath : String) : NativeInt;
|
||||
Function RmDirAt(FD : Integer; const aPath : String) : NativeInt;
|
||||
function StatAt(FD : Integer; const aPath : String; var stat: TWasiFileStat) : NativeInt;
|
||||
function StatFD(FD : Integer; var stat: TWasiFileStat) : NativeInt;
|
||||
Function UTimesAt(FD : Integer; aPath : String; aTime,MTime : TJSDate; UpdateLink : boolean) : NativeInt;
|
||||
Function UTimes(FD : Integer; aTime,MTime : TJSDate; Flags : TSetTimesFlags) : NativeInt;
|
||||
Function LinkAt(OldFD : Integer; OldPath : String; NewFD : Integer; NewPath : String) : NativeInt;
|
||||
Function RenameAt(OldFD : Integer; OldPath : String; NewFD : Integer; NewPath : String) : NativeInt;
|
||||
Function SymLinkAt(FD : Integer; Path : String; Target : String) : NativeInt;
|
||||
Function UnLinkAt(FD : Integer; const aPath : String) : NativeInt;
|
||||
function OpenAt(FD : Integer; FDFlags : NativeInt; aPath : String; Flags, fsRightsBase, fsRightsInheriting, fsFlags: NativeInt; out Openfd: Integer): NativeInt;
|
||||
function ReadLinkAt(FD : Integer; aPath : String; out aTarget : String): NativeInt;
|
||||
function Close(FD: Integer): NativeInt;
|
||||
function Write(FD : Integer; Data : TJSUint8Array; AtPos : Integer; out Written :Integer) : NativeInt;
|
||||
function Sync(FD : Integer) : NativeInt;
|
||||
function DataSync(FD : Integer) : NativeInt;
|
||||
function Seek(FD : integer; Offset : Integer; Whence : TSeekWhence; out NewPos : Integer) : NativeInt;
|
||||
Function Read(FD : Integer; Data : TJSUint8Array; AtPos : Integer; Out BytesRead : Integer) : NativeInt;
|
||||
Function GetPrestat(FD: Integer) : String;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
const
|
||||
ResOK = __WASI_ERRNO_SUCCESS;
|
||||
|
||||
{ TWASIZenFS }
|
||||
|
||||
function TWASIZenFS.PrependFD(FD: Integer; aPath: String) : string;
|
||||
|
||||
begin
|
||||
if FD<>3 then
|
||||
Writeln('Warning, unknown CWD ID',FD);
|
||||
Result:='/'+aPath;
|
||||
end;
|
||||
|
||||
class function TWASIZenFS.ExceptToError(E: TJSObject): Integer;
|
||||
begin
|
||||
if Assigned(E) then;
|
||||
// For the moment.
|
||||
Result:=WASI_ENOSYS;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.MkDirAt(FD: Integer; const aPath: String): NativeInt;
|
||||
begin
|
||||
try
|
||||
ZenFS.mkdirSync(PrependFD(FD,aPath),&777);
|
||||
Result:=ResOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.RmDirAt(FD: Integer; const aPath: String): NativeInt;
|
||||
begin
|
||||
try
|
||||
ZenFS.rmdirSync(PrependFD(FD,aPath));
|
||||
Result:=ResOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
class function TWASIZenFS.ZenFSDateToWasiTimeStamp(aDate: TJSDate): Nativeint;
|
||||
begin
|
||||
Result:=aDate.Time;
|
||||
end;
|
||||
|
||||
class function TWASIZenFS.ZenStatToWasiStat(ZSTat: TZenFSStats): TWasiFileStat;
|
||||
|
||||
begin
|
||||
Result.dev:=0;
|
||||
Result.ino:=0;
|
||||
if ZStat.isDirectory then
|
||||
Result.filetype:=__WASI_FILETYPE_DIRECTORY
|
||||
else if ZSTat.isBlockDevice then
|
||||
Result.filetype:=__WASI_FILETYPE_BLOCK_DEVICE
|
||||
else if ZStat.isCharacterDevice then
|
||||
Result.filetype:=__WASI_FILETYPE_CHARACTER_DEVICE
|
||||
else if ZStat.isFile then
|
||||
Result.filetype:=__WASI_FILETYPE_REGULAR_FILE
|
||||
else if ZStat.isSocket() then
|
||||
Result.filetype:=__WASI_FILETYPE_SOCKET_DGRAM
|
||||
else if ZStat.isSymbolicLink() then
|
||||
Result.filetype:=__WASI_FILETYPE_SYMBOLIC_LINK
|
||||
else
|
||||
Result.filetype:=__WASI_FILETYPE_UNKNOWN;
|
||||
Result.nlink:=AsIntNumber(ZStat.nlink);
|
||||
Result.size:=AsIntNumber(ZStat.Size);
|
||||
Result.atim:=ZenFSDateToWasiTimeStamp(ZStat.aTime);
|
||||
Result.mtim:=ZenFSDateToWasiTimeStamp(ZStat.mTime);
|
||||
Result.ctim:=ZenFSDateToWasiTimeStamp(ZStat.cTime);
|
||||
end;
|
||||
|
||||
function TWASIZenFS.StatAt(FD: Integer; const aPath: String;
|
||||
var stat: TWasiFileStat): NativeInt;
|
||||
|
||||
var
|
||||
ZStat : TZenFSStats;
|
||||
|
||||
begin
|
||||
try
|
||||
ZStat:=ZenFS.statSync(PrependFD(FD,aPath));
|
||||
Stat:=ZenStatToWasiStat(ZStat);
|
||||
Result:=ResOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.StatFD(FD: Integer; var stat: TWasiFileStat): NativeInt;
|
||||
var
|
||||
ZStat : TZenFSStats;
|
||||
|
||||
begin
|
||||
try
|
||||
ZStat:=ZenFS.fstatSync(FD);
|
||||
Stat:=ZenStatToWasiStat(ZStat);
|
||||
Result:=ResOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.UTimesAt(FD : Integer; aPath: String; aTime, MTime: TJSDate; UpdateLink: boolean): NativeInt;
|
||||
|
||||
var
|
||||
lPath : String;
|
||||
|
||||
begin
|
||||
lPath:=PrependFD(FD,aPath);
|
||||
try
|
||||
if UpdateLink then
|
||||
ZenFS.lutimesSync(lPath,aTime,mTime)
|
||||
else
|
||||
ZenFS.utimesSync(lPath,aTime,mTime);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.UTimes(FD: Integer; aTime, MTime: TJSDate;
|
||||
Flags: TSetTimesFlags): NativeInt;
|
||||
begin
|
||||
try
|
||||
ZenFS.futimes(fd,aTime,mTime);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.LinkAt(OldFD: Integer; OldPath: String; NewFD: Integer;
|
||||
NewPath: String): NativeInt;
|
||||
|
||||
var
|
||||
lOld,lNew : String;
|
||||
|
||||
begin
|
||||
lOld:=PrependFD(OldFD,OldPath);
|
||||
lNew:=PrependFD(NewFD,NewPath);
|
||||
try
|
||||
ZenFS.linkSync(lOld,lNew);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.RenameAt(OldFD: Integer; OldPath: String; NewFD: Integer;
|
||||
NewPath: String): NativeInt;
|
||||
var
|
||||
lOld,lNew : String;
|
||||
|
||||
begin
|
||||
lOld:=PrependFD(OldFD,OldPath);
|
||||
lNew:=PrependFD(NewFD,NewPath);
|
||||
try
|
||||
ZenFS.renameSync(lOld,lNew);
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.SymLinkAt(FD: Integer; Path: String; Target: String
|
||||
): NativeInt;
|
||||
var
|
||||
lPath : String;
|
||||
|
||||
begin
|
||||
lPath:=PrependFD(FD,Path);
|
||||
try
|
||||
ZenFS.symLinkSync(Target,lPath);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.Close(FD : Integer): NativeInt;
|
||||
|
||||
begin
|
||||
try
|
||||
ZenFS.closeSync(fd);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.Write(FD: Integer; Data: TJSUint8Array; AtPos : Integer; out Written : Integer): NativeInt;
|
||||
|
||||
var
|
||||
DS : TJSDataView;
|
||||
|
||||
begin
|
||||
try
|
||||
DS:=TJSDataView.New(Data.buffer);
|
||||
if atPos<>-1 then
|
||||
Written:=ZenFS.writeSync(fd,DS,atPos)
|
||||
else
|
||||
Written:=ZenFS.writeSync(fd,DS,0,Data.byteLength);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.Sync(FD: Integer): NativeInt;
|
||||
begin
|
||||
try
|
||||
ZenFS.fSyncSync(fd);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.DataSync(FD: Integer): NativeInt;
|
||||
begin
|
||||
try
|
||||
ZenFS.fdatasyncSync(fd);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.Seek(FD: integer; Offset: Integer; Whence: TSeekWhence; out
|
||||
NewPos: Integer): NativeInt;
|
||||
|
||||
var
|
||||
aPos : Integer;
|
||||
F : TZenFSFile;
|
||||
Stat : TZenFSStats;
|
||||
|
||||
begin
|
||||
try
|
||||
case whence of
|
||||
swBeginning :
|
||||
aPos:=AsIntNumber(OffSet);
|
||||
swCurrent :
|
||||
begin
|
||||
// This is officially not supported...
|
||||
F:=fd2file(fd);
|
||||
if Assigned(F) then
|
||||
aPos:=AsintNumber(F.Position)+AsIntNumber(Offset)
|
||||
else
|
||||
Raise TZenFSErrnoError.new(TZenFSErrNo.EBADF);
|
||||
end;
|
||||
swEnd :
|
||||
begin
|
||||
Stat:=ZenFS.fstatSync(fd);
|
||||
aPos:=AsIntNumber(Stat.size)+AsIntNumber(Offset);
|
||||
end;
|
||||
end;
|
||||
// Buf:=TJSDataView.New(TJSUint8Array.New(0));
|
||||
ZenFS.readSync(fd,Nil,0,0,aPos);
|
||||
NewPos:=aPos;
|
||||
Result:=resOK;
|
||||
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.Read(FD: Integer; Data: TJSUint8Array; AtPos: Integer; out
|
||||
BytesRead: Integer): NativeInt;
|
||||
|
||||
Var
|
||||
V : TJSDataView;
|
||||
opts : TZenFSReadSyncOptions;
|
||||
|
||||
begin
|
||||
V:=TJSDataView.new(Data.buffer);
|
||||
try
|
||||
opts:=TZenFSReadSyncOptions.new;
|
||||
opts.offset:=0;
|
||||
opts.length:=Data.byteLength;
|
||||
if AtPos<>-1 then
|
||||
opts.position:=AtPos;
|
||||
BytesRead:=ZenFS.readSync(FD,V,Opts);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.GetPrestat(FD: Integer): String;
|
||||
begin
|
||||
if (FD=3) then
|
||||
begin
|
||||
FRoot:=ZenFS.OpenDirSync('/');
|
||||
Result:='/';
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.UnLinkAt(FD: Integer; const aPath: String): NativeInt;
|
||||
|
||||
var
|
||||
lPath : String;
|
||||
|
||||
begin
|
||||
lPath:=PrependFD(FD,aPath);
|
||||
try
|
||||
ZenFS.unlinkSync(lPath);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.OpenAt(FD : Integer; FDFlags : NativeInt; aPath : String; Flags, fsRightsBase, fsRightsInheriting, fsFlags: NativeInt; out Openfd: Integer): NativeInt;
|
||||
|
||||
var
|
||||
lPath : String;
|
||||
lFlags : String;
|
||||
Rights : NativeInt;
|
||||
Reading,Writing : Boolean;
|
||||
|
||||
Function HasFlag(aFlag : Integer) : Boolean;
|
||||
begin
|
||||
Result:=(Flags and aFlag)<>0;
|
||||
end;
|
||||
|
||||
Function HasRight(aRight : Integer) : Boolean;
|
||||
begin
|
||||
if IsBigint(Rights) then
|
||||
begin
|
||||
asm
|
||||
Result = ((Rights & BigInt(aRight)) != 0)
|
||||
end;
|
||||
end
|
||||
else
|
||||
Result:=(Rights and aRight)<>0;
|
||||
end;
|
||||
|
||||
begin
|
||||
if (fdFlags<>0) and (fsFlags<>0) then ;
|
||||
lPath:=PrependFD(FD,aPath);
|
||||
Rights:=AsIntNumber(fsRightsBase);
|
||||
Writing:=HasFlag(__WASI_OFLAGS_CREAT) or HasRight(__WASI_RIGHTS_FD_WRITE);
|
||||
Reading:=HasRight(__WASI_RIGHTS_FD_READ);
|
||||
if Writing then
|
||||
begin
|
||||
if HasFlag(__WASI_OFLAGS_TRUNC) then
|
||||
lFLags:='w'
|
||||
else
|
||||
lFLags:='a';
|
||||
if HasFlag(__WASI_OFLAGS_EXCL) then
|
||||
lFLags:=lFLags+'x';
|
||||
if Reading then
|
||||
lFLags:=lFLags+'+';
|
||||
end
|
||||
else
|
||||
begin
|
||||
lFlags:='r';
|
||||
end;
|
||||
try
|
||||
OpenFD:=ZenFS.openSync(lPath,lFlags);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWASIZenFS.ReadLinkAt(FD: Integer; aPath: String; out aTarget: String): NativeInt;
|
||||
|
||||
var
|
||||
lPath : String;
|
||||
|
||||
begin
|
||||
lPath:=PrependFD(FD,aPath);
|
||||
try
|
||||
aTarget:=ZenFS.readlinkSync(lPath);
|
||||
Result:=resOK;
|
||||
except
|
||||
on E : TJSObject do
|
||||
Result:=ExceptToError(E);
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user