77// See https://github.com/emscripten-core/emscripten/issues/15041.
88
99#include < emscripten/html5.h>
10+ #include < unistd.h>
1011#include < vector>
1112#include < wasi/api.h>
1213
@@ -113,6 +114,31 @@ class StderrFile : public WritingStdFile {
113114 StderrFile () {}
114115};
115116
117+ class RandomFile : public DataFile {
118+ void open (oflags_t ) override {}
119+ void close () override {}
120+
121+ ssize_t write (const uint8_t * buf, size_t len, off_t offset) override {
122+ return -__WASI_ERRNO_INVAL;
123+ }
124+
125+ ssize_t read (uint8_t * buf, size_t len, off_t offset) override {
126+ uint8_t * end = buf + len;
127+ for (; buf < end; buf += 256 ) {
128+ int err = getentropy (buf, std::min (end - buf, 256l ));
129+ assert (err == 0 );
130+ }
131+ return len;
132+ };
133+
134+ void flush () override {}
135+ size_t getSize () override { return 0 ; }
136+ void setSize (size_t size) override {}
137+
138+ public:
139+ RandomFile () : DataFile(S_IRUGO, NullBackend, S_IFCHR) { seekable = false ; }
140+ };
141+
116142} // anonymous namespace
117143
118144std::shared_ptr<DataFile> getStdin () {
@@ -130,4 +156,14 @@ std::shared_ptr<DataFile> getStderr() {
130156 return stderr;
131157}
132158
159+ std::shared_ptr<DataFile> getRandom () {
160+ static auto random = std::make_shared<RandomFile>();
161+ return random;
162+ }
163+
164+ std::shared_ptr<DataFile> getURandom () {
165+ static auto urandom = std::make_shared<RandomFile>();
166+ return urandom;
167+ }
168+
133169} // namespace wasmfs::SpecialFiles
0 commit comments