Dirent is an entry read from a directory via File.Readdir.
# Notes
- This extends `dirent` defined in POSIX with some fields defined by
Linux. See https://man7.org/linux/man-pages/man3/readdir.3.html and
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dirent.h.html
- This has a subset of fields defined in sys.Stat_t. Notably, there is no
field corresponding to Stat_t.Dev because that value will be constant
for all files in a directory. To get the Dev value, call File.Stat on
the directory File.Readdir was called on. Ino is the file serial number, or zero if not available. See Ino for
more details including impact returning a zero value. Name is the base name of the directory entry. Empty is invalid. Type is fs.FileMode masked on fs.ModeType. For example, zero is a
regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown.
Note: This is defined by Linux, not POSIX. IsDir returns true if the Type is fs.ModeDir.(*Dirent) String() string
*Dirent : expvar.Var
*Dirent : fmt.Stringer
func File.Readdir(n int) (dirents []Dirent, errno Errno)
func UnimplementedFile.Readdir(int) (dirents []Dirent, errno Errno)
func github.com/tetratelabs/wazero/internal/fsapi.File.Readdir(n int) (dirents []Dirent, errno Errno)
func github.com/tetratelabs/wazero/internal/sock.TCPConn.Readdir(n int) (dirents []Dirent, errno Errno)
func github.com/tetratelabs/wazero/internal/sock.TCPSock.Readdir(n int) (dirents []Dirent, errno Errno)
func github.com/tetratelabs/wazero/internal/sys.(*DirentCache).Read(pos uint64, n uint32) (dirents []Dirent, errno Errno)
DirFile is embeddable to reduce the amount of functions to implement a file. IsAppend implements File.IsAppend IsDir implements File.IsDir Pread implements File.Pread Pwrite implements File.Pwrite Read implements File.Read SetAppend implements File.SetAppend Truncate implements File.Truncate Write implements File.Write
File is a writeable fs.File bridge backed by syscall functions needed for ABI
including WASI.
Implementations should embed UnimplementedFile for forward compatibility. Any
unsupported method or parameter should return ENOSYS.
# Errors
All methods that can return an error return a Errno, which is zero
on success.
Restricting to Errno matches current WebAssembly host functions,
which are constrained to well-known error codes. For example, WASI maps syscall
errors to u32 numeric values.
# Notes
- You must call Close to avoid file resource conflicts. For example,
Windows cannot delete the underlying directory while a handle to it
remains open.
- A writable filesystem abstraction is not yet implemented as of Go 1.20.
See https://github.com/golang/go/issues/45757 Close closes the underlying file.
A zero Errno is returned if unimplemented or success.
# Notes
- This is like syscall.Close and `close` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html Datasync synchronizes the data of a file.
# Errors
A zero Errno is success. The below are expected otherwise:
- EBADF: the file or directory was closed.
# Notes
- This is like syscall.Fdatasync and `fdatasync` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html
- This returns with no error instead of ENOSYS when
unimplemented. This prevents fake filesystems from erring.
- As this is commonly missing, some implementations dispatch to Sync. Dev returns the device ID (Stat_t.Dev) of this file, zero if unknown or
an error retrieving it.
# Errors
Possible errors are those from Stat, except ENOSYS should not
be returned. Zero should be returned if there is no implementation.
# Notes
- Implementations should cache this result.
- This combined with Ino can implement os.SameFile. Ino returns the serial number (Stat_t.Ino) of this file, zero if unknown
or an error retrieving it.
# Errors
Possible errors are those from Stat, except ENOSYS should not
be returned. Zero should be returned if there is no implementation.
# Notes
- Implementations should cache this result.
- This combined with Dev can implement os.SameFile. IsAppend returns true if the file was opened with O_APPEND, or
SetAppend was successfully enabled on this file.
# Notes
- This might not match the underlying state of the file descriptor if
the file was not opened via OpenFile. IsDir returns true if this file is a directory or an error there was an
error retrieving this information.
# Errors
Possible errors are those from Stat, except ENOSYS should not
be returned. false should be returned if there is no implementation.
# Notes
- Implementations should cache this result. Pread attempts to read all bytes in the file into `p`, starting at the
offset `off`, and returns the count read even on error.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed or not readable.
- EINVAL: the offset was negative.
- EISDIR: the file was a directory.
# Notes
- This is like io.ReaderAt and `pread` in POSIX, preferring semantics
of io.ReaderAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html
- Unlike io.ReaderAt, there is no io.EOF returned on end-of-file. To
read the file completely, the caller must repeat until `n` is zero. Pwrite attempts to write all bytes in `p` to the file at the given
offset `off`, and returns the count written even on error.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed or not writeable.
- EINVAL: the offset was negative.
- EISDIR: the file was a directory.
# Notes
- This is like io.WriterAt and `pwrite` in POSIX, preferring semantics
of io.WriterAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html Read attempts to read all bytes in the file into `buf`, and returns the
count read even on error.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed or not readable.
- EISDIR: the file was a directory.
# Notes
- This is like io.Reader and `read` in POSIX, preferring semantics of
io.Reader. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html
- Unlike io.Reader, there is no io.EOF returned on end-of-file. To
read the file completely, the caller must repeat until `n` is zero. Readdir reads the contents of the directory associated with file and
returns a slice of up to n Dirent values in an arbitrary order. This is
a stateful function, so subsequent calls return any next values.
If n > 0, Readdir returns at most n entries or an error.
If n <= 0, Readdir returns all remaining entries or an error.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file was closed or not a directory.
- ENOENT: the directory could not be read (e.g. deleted).
# Notes
- This is like `Readdir` on os.File, but unlike `readdir` in POSIX.
See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html
- Unlike os.File, there is no io.EOF returned on end-of-directory. To
read the directory completely, the caller must repeat until the
count read (`len(dirents)`) is less than `n`.
- See /RATIONALE.md for design notes. Seek attempts to set the next offset for Read or Write and returns the
resulting absolute offset or an error.
# Parameters
The `offset` parameters is interpreted in terms of `whence`:
- io.SeekStart: relative to the start of the file, e.g. offset=0 sets
the next Read or Write to the beginning of the file.
- io.SeekCurrent: relative to the current offset, e.g. offset=16 sets
the next Read or Write 16 bytes past the prior.
- io.SeekEnd: relative to the end of the file, e.g. offset=-1 sets the
next Read or Write to the last byte in the file.
# Behavior when a directory
The only supported use case for a directory is seeking to `offset` zero
(`whence` = io.SeekStart). This should have the same behavior as
os.File, which resets any internal state used by Readdir.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed or not readable.
- EINVAL: the offset was negative.
# Notes
- This is like io.Seeker and `fseek` in POSIX, preferring semantics
of io.Seeker. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html SetAppend toggles the append mode (O_APPEND) of this file.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed.
# Notes
- There is no `O_APPEND` for `fcntl` in POSIX, so implementations may
have to re-open the underlying file to apply this. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html Stat is similar to syscall.Fstat.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed.
# Notes
- This is like syscall.Fstat and `fstatat` with `AT_FDCWD` in POSIX.
See https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html
- A fs.FileInfo backed implementation sets atim, mtim and ctim to the
same value.
- Windows allows you to stat a closed directory. Sync synchronizes changes to the file.
# Errors
A zero Errno is success. The below are expected otherwise:
- EBADF: the file or directory was closed.
# Notes
- This is like syscall.Fsync and `fsync` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html
- This returns with no error instead of ENOSYS when
unimplemented. This prevents fake filesystems from erring.
- Windows does not error when calling Sync on a closed file. Truncate truncates a file to a specified length.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed.
- EINVAL: the `size` is negative.
- EISDIR: the file was a directory.
# Notes
- This is like syscall.Ftruncate and `ftruncate` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html
- Windows does not error when calling Truncate on a closed file. Utimens set file access and modification times of this file, at
nanosecond precision.
# Parameters
The `atim` and `mtim` parameters refer to access and modification time
stamps as defined in sys.Stat_t. To retain one or the other, substitute
it with the pseudo-timestamp UTIME_OMIT.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file or directory was closed.
# Notes
- This is like syscall.UtimesNano and `futimens` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html
- Windows requires files to be open with O_RDWR, which means you
cannot use this to update timestamps on a directory (EPERM). Write attempts to write all bytes in `p` to the file, and returns the
count written even on error.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EBADF: the file was closed, not writeable, or a directory.
# Notes
- This is like io.Writer and `write` in POSIX, preferring semantics of
io.Writer. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.htmlUnimplementedFile
github.com/tetratelabs/wazero/internal/fsapi.File(interface)
github.com/tetratelabs/wazero/internal/sock.TCPConn(interface)
github.com/tetratelabs/wazero/internal/sock.TCPSock(interface)
*github.com/tetratelabs/wazero/internal/sys.StdinFile
func FS.OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno)
func UnimplementedFS.OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno)
func github.com/tetratelabs/wazero/internal/sysfs.OpenFSFile(fs fs.FS, path string, flag Oflag, perm fs.FileMode) (File, Errno)
func github.com/tetratelabs/wazero/internal/sysfs.OpenOSFile(path string, flag Oflag, perm fs.FileMode) (File, Errno)
func github.com/tetratelabs/wazero/internal/sysfs.(*AdaptFS).OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno)
func github.com/tetratelabs/wazero/internal/sysfs.(*ReadFS).OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno)
func github.com/tetratelabs/wazero/internal/fsapi.Adapt(f File) fsapi.File
FileType is fs.FileMode masked on fs.ModeType. For example, zero is a
regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown.
Note: This is defined by Linux, not POSIX.
FS is a writeable fs.FS bridge backed by syscall functions needed for ABI
including WASI.
Implementations should embed UnimplementedFS for forward compatibility. Any
unsupported method or parameter should return ENO
# Errors
All methods that can return an error return a Errno, which is zero
on success.
Restricting to Errno matches current WebAssembly host functions,
which are constrained to well-known error codes. For example, WASI maps syscall
errors to u32 numeric values.
# Notes
A writable filesystem abstraction is not yet implemented as of Go 1.20. See
https://github.com/golang/go/issues/45757 Chmod changes the mode of the file.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `path` is invalid.
- ENOENT: `path` does not exist.
# Notes
- This is like syscall.Chmod, except the `path` is relative to this
file system.
- This is like `chmod` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html
- Windows ignores the execute bit, and any permissions come back as
group and world. For example, chmod of 0400 reads back as 0444, and
0700 0666. Also, permissions on directories aren't supported at all. Link creates a "hard" link from oldPath to newPath, in contrast to a
soft link (via Symlink).
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EPERM: `oldPath` is invalid.
- ENOENT: `oldPath` doesn't exist.
- EISDIR: `newPath` exists, but is a directory.
# Notes
- This is like syscall.Link, except the `oldPath` is relative to this
file system.
- This is like `link` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html Lstat gets file status without following symbolic links.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- ENOENT: `path` doesn't exist.
# Notes
- This is like syscall.Lstat, except the `path` is relative to this
file system.
- This is like `lstat` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html
- An fs.FileInfo backed implementation sets atim, mtim and ctim to the
same value.
- When the path is a symbolic link, the stat returned is for the link,
not the file it refers to. Mkdir makes a directory.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `path` is invalid.
- EEXIST: `path` exists and is a directory.
- ENOTDIR: `path` exists and is a file.
# Notes
- This is like syscall.Mkdir, except the `path` is relative to this
file system.
- This is like `mkdir` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html
- Implications of permissions are described in Chmod notes. OpenFile opens a file. It should be closed via Close on File.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `path` or `flag` is invalid.
- EISDIR: the path was a directory, but flag included O_RDWR or
O_WRONLY
- ENOENT: `path` doesn't exist and `flag` doesn't contain O_CREAT.
# Constraints on the returned file
Implementations that can read flags should enforce them regardless of
the type returned. For example, while os.File implements io.Writer,
attempts to write to a directory or a file opened with O_RDONLY fail
with a EBADF.
Some implementations choose whether to enforce read-only opens, namely
fs.FS. While fs.FS is supported (Adapt), wazero cannot runtime enforce
open flags. Instead, we encourage good behavior and test our built-in
implementations.
# Notes
- This is like os.OpenFile, except the path is relative to this file
system, and Errno is returned instead of os.PathError.
- Implications of permissions when O_CREAT are described in Chmod notes.
- This is like `open` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html Readlink reads the contents of a symbolic link.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `path` is invalid.
# Notes
- This is like syscall.Readlink, except the path is relative to this
filesystem.
- This is like `readlink` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html
- On Windows, the path separator is different from other platforms,
but to provide consistent results to Wasm, this normalizes to a "/"
separator. Rename renames file or directory.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `from` or `to` is invalid.
- ENOENT: `from` or `to` don't exist.
- ENOTDIR: `from` is a directory and `to` exists as a file.
- EISDIR: `from` is a file and `to` exists as a directory.
- ENOTEMPTY: `both from` and `to` are existing directory, but
`to` is not empty.
# Notes
- This is like syscall.Rename, except the paths are relative to this
file system.
- This is like `rename` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html
- Windows doesn't let you overwrite an existing directory. Rmdir removes a directory.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `path` is invalid.
- ENOENT: `path` doesn't exist.
- ENOTDIR: `path` exists, but isn't a directory.
- ENOTEMPTY: `path` exists, but isn't empty.
# Notes
- This is like syscall.Rmdir, except the `path` is relative to this
file system.
- This is like `rmdir` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html
- As of Go 1.19, Windows maps ENOTDIR to ENOENT. Stat gets file status.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- ENOENT: `path` doesn't exist.
# Notes
- This is like syscall.Stat, except the `path` is relative to this
file system.
- This is like `stat` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html
- An fs.FileInfo backed implementation sets atim, mtim and ctim to the
same value.
- When the path is a symbolic link, the stat returned is for the file
it refers to. Symlink creates a "soft" link from oldPath to newPath, in contrast to a
hard link (via Link).
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EPERM: `oldPath` or `newPath` is invalid.
- EEXIST: `newPath` exists.
# Notes
- This is like syscall.Symlink, except the `oldPath` is relative to
this file system.
- This is like `symlink` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlink.html
- Only `newPath` is relative to this file system and `oldPath` is kept
as-is. That is because the link is only resolved relative to the
directory when dereferencing it (e.g. ReadLink).
See https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409
for how others implement this.
- Symlinks in Windows requires `SeCreateSymbolicLinkPrivilege`.
Otherwise, EPERM results.
See https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links Unlink removes a directory entry.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `path` is invalid.
- ENOENT: `path` doesn't exist.
- EISDIR: `path` exists, but is a directory.
# Notes
- This is like syscall.Unlink, except the `path` is relative to this
file system.
- This is like `unlink` in POSIX. See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html
- On Windows, syscall.Unlink doesn't delete symlink to directory unlike other platforms. Implementations might
want to combine syscall.RemoveDirectory with syscall.Unlink in order to delete such links on Windows.
See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya Utimens set file access and modification times on a path relative to
this file system, at nanosecond precision.
# Parameters
If the path is a symbolic link, the target of expanding that link is
updated.
The `atim` and `mtim` parameters refer to access and modification time
stamps as defined in sys.Stat_t. To retain one or the other, substitute
it with the pseudo-timestamp UTIME_OMIT.
# Errors
A zero Errno is success. The below are expected otherwise:
- ENOSYS: the implementation does not support this function.
- EINVAL: `path` is invalid.
- EEXIST: `path` exists and is a directory.
- ENOTDIR: `path` exists and is a file.
# Notes
- This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in
POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.htmlUnimplementedFS
*github.com/tetratelabs/wazero/internal/sysfs.AdaptFS
*github.com/tetratelabs/wazero/internal/sysfs.ReadFS
func github.com/tetratelabs/wazero/internal/sysfs.DirFS(dir string) FS
func github.com/tetratelabs/wazero/internal/sys.DefaultContext(fs FS) *sys.Context
func github.com/tetratelabs/wazero/internal/sys.NewContext(max uint32, args, environ [][]byte, stdin io.Reader, stdout, stderr io.Writer, randSource io.Reader, walltime sys.Walltime, walltimeResolution sys.ClockResolution, nanotime sys.Nanotime, nanotimeResolution sys.ClockResolution, nanosleep sys.Nanosleep, osyield sys.Osyield, fs []FS, guestPaths []string, tcpListeners []*net.TCPListener) (sysCtx *sys.Context, err error)
func github.com/tetratelabs/wazero/internal/sys.(*Context).InitFSContext(stdin io.Reader, stdout, stderr io.Writer, fs []FS, guestPaths []string, tcpListeners []*net.TCPListener) (err error)
func github.com/tetratelabs/wazero/internal/sys.(*FSContext).OpenFile(fs FS, path string, flag Oflag, perm fs.FileMode) (int32, Errno)
UnimplementedFile is a File that returns ENOSYS for all functions,
except where no-op are otherwise documented.
This should be embedded to have forward compatible implementations. Close implements File.Close Datasync implements File.Datasync Dev implements File.Dev Ino implements File.Ino IsAppend implements File.IsAppend IsDir implements File.IsDir Pread implements File.Pread Pwrite implements File.Pwrite Read implements File.Read Readdir implements File.Readdir Seek implements File.Seek SetAppend implements File.SetAppend Stat implements File.Stat Sync implements File.Sync Truncate implements File.Truncate Utimens implements File.Utimens Write implements File.Write
UnimplementedFile : File
UnimplementedFS is an FS that returns ENOSYS for all functions,
This should be embedded to have forward compatible implementations. Chmod implements FS.Chmod Link implements FS.Link Lstat implements FS.Lstat Mkdir implements FS.Mkdir OpenFile implements FS.OpenFile Readlink implements FS.Readlink Rename implements FS.Rename Rmdir implements FS.Rmdir Stat implements FS.Stat Symlink implements FS.Symlink Unlink implements FS.Unlink Utimens implements FS.Utimens
UnimplementedFS : FS
Package-Level Functions (only one)
UnwrapOSError returns an Errno or zero if the input is nil.
O_DIRECTORY is defined on some platforms as syscall.O_DIRECTORY.
Note: This ensures that the opened file is a directory. Those emulating
on platforms that don't support the O_DIRECTORY, can double-check the
result with File.IsDir (or stat) and err if not a directory.
O_DSYNC is defined on some platforms as syscall.O_DSYNC.
O_EXCL is defined on some platforms as syscall.O_EXCL.
O_NOFOLLOW is defined on some platforms as syscall.O_NOFOLLOW.
Note: This allows programs to ensure that if the opened file is a
symbolic link, the link itself is opened instead of its target.
O_NONBLOCK is defined on some platforms as syscall.O_NONBLOCK.
O_RDONLY is like os.O_RDONLY
O_RDWR is like os.O_RDWR
O_RSYNC is defined on some platforms as syscall.O_RSYNC.
O_SYNC is defined on some platforms as syscall.O_SYNC.
O_TRUNC is defined on some platforms as syscall.O_TRUNC.
O_WRONLY is like os.O_WRONLY
UTIME_OMIT is a special constant for use in updating times via FS.Utimens
or File.Utimens. When used for atim or mtim, the value is retained.
Note: This may be implemented via a stat when the underlying filesystem
does not support this value.
The pages are generated with Goldsv0.8.2. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.