aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--src/library_fs.js2
-rw-r--r--tests/filesystem/src.js7
-rw-r--r--tests/test_core.py5
-rw-r--r--tests/unistd/curdir.js5
-rw-r--r--tests/unistd/io.c13
-rw-r--r--tests/unistd/io.js61
-rw-r--r--tests/unistd/io.out5
8 files changed, 80 insertions, 19 deletions
diff --git a/AUTHORS b/AUTHORS
index 59eb27d3..a0475661 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -95,4 +95,5 @@ a license to everyone to use it as detailed in LICENSE.)
* Nick Bray <ncbray@chromium.org> (copyright owned by Google, Inc.)
* Aidan Hobson Sayers <aidanhs@cantab.net>
* Charlie Birks <admin@daftgames.net>
+* Ranger Harke <ranger.harke@autodesk.com> (copyright owned by Autodesk, Inc.)
diff --git a/src/library_fs.js b/src/library_fs.js
index 9c8223ab..63ad7c8d 100644
--- a/src/library_fs.js
+++ b/src/library_fs.js
@@ -530,7 +530,7 @@ mergeInto(LibraryManager.library, {
},
createDevice: function(parent, name, input, output) {
var path = PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name);
- var mode = input && output ? 0777 : (input ? 0333 : 0555);
+ var mode = FS.getMode(!!input, !!output);
if (!FS.createDevice.major) FS.createDevice.major = 64;
var dev = FS.makedev(FS.createDevice.major++, 0);
// Create a fake device that a set of stream ops to emulate
diff --git a/tests/filesystem/src.js b/tests/filesystem/src.js
index ceea348d..dbdd4bed 100644
--- a/tests/filesystem/src.js
+++ b/tests/filesystem/src.js
@@ -1,10 +1,13 @@
+var dummy_device = FS.makedev(64, 0);
+FS.registerDevice(dummy_device, {});
+
FS.createFolder('/', 'forbidden', false, false);
FS.createFolder('/forbidden', 'test', true, true);
FS.createPath('/', 'abc/123', true, true);
FS.createPath('/', 'abc/456', true, true);
FS.createPath('/', 'def/789', true, true);
-FS.createDevice('/abc', 'deviceA', function() {}, function() {});
-FS.createDevice('/def', 'deviceB', function() {}, function() {});
+FS.mkdev('/abc/deviceA', 0666, dummy_device);
+FS.mkdev('/def/deviceB', 0666, dummy_device);
FS.createLink('/abc', 'localLink', '123', true, true);
FS.createLink('/abc', 'rootLink', '/', true, true);
FS.createLink('/abc', 'relativeLink', '../def', true, true);
diff --git a/tests/test_core.py b/tests/test_core.py
index 81d26595..17707c44 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -6977,8 +6977,11 @@ def process(filename):
src = open(filename, 'r').read().replace(
'// {{PRE_RUN_ADDITIONS}}',
\'\'\'
+ var dummy_device = FS.makedev(64, 0);
+ FS.registerDevice(dummy_device, {});
+
FS.createDataFile('/', 'file', 'abcdef', true, true);
- FS.createDevice('/', 'device', function() {}, function() {});
+ FS.mkdev('/device', 0666, dummy_device);
\'\'\'
)
open(filename, 'w').write(src)
diff --git a/tests/unistd/curdir.js b/tests/unistd/curdir.js
index e271b9da..75a1d2ce 100644
--- a/tests/unistd/curdir.js
+++ b/tests/unistd/curdir.js
@@ -1,4 +1,7 @@
+var dummy_device = FS.makedev(64, 0);
+FS.registerDevice(dummy_device, {});
+
FS.createDataFile('/', 'file', '', true, true);
FS.createFolder('/', 'folder', true, true);
-FS.createDevice('/', 'device', function() {}, function() {});
+FS.mkdev('/device', 0666, dummy_device);
FS.createLink('/', 'link', 'folder', true, true);
diff --git a/tests/unistd/io.c b/tests/unistd/io.c
index eeb80373..a96290ef 100644
--- a/tests/unistd/io.c
+++ b/tests/unistd/io.c
@@ -34,6 +34,19 @@ int main() {
printf("errno: %d\n\n", errno);
errno = 0;
+ int cd_ro_r = open("/createDevice-read-only", O_RDONLY);
+ printf("open read-only device from createDevice for read, errno: %d\n", errno);
+ errno = 0;
+ int cd_ro_w = open("/createDevice-read-only", O_WRONLY);
+ printf("open read-only device from createDevice for write, errno: %d\n", errno);
+ errno = 0;
+ int cd_wo_r = open("/createDevice-write-only", O_RDONLY);
+ printf("open write-only device from createDevice for read, errno: %d\n", errno);
+ errno = 0;
+ int cd_wo_w = open("/createDevice-write-only", O_WRONLY);
+ printf("open write-only device from createDevice for write, errno: %d\n\n", errno);
+ errno = 0;
+
int f = open("/file", O_RDWR);
printf("read from file: %d\n", read(f, readBuffer, sizeof readBuffer));
printf("data: %s\n", readBuffer);
diff --git a/tests/unistd/io.js b/tests/unistd/io.js
index e2e442ec..11c0da79 100644
--- a/tests/unistd/io.js
+++ b/tests/unistd/io.js
@@ -1,19 +1,52 @@
(function() {
- var devicePayload = [65, 66, 67, 68];
- FS.createDevice('/', 'device', function() {
- if (devicePayload.length) {
- return devicePayload.shift();
- } else {
- return null;
+ var major = 80;
+
+ var device = FS.makedev(major++, 0);
+ var device_ops = {
+ open: function(stream) {
+ stream.payload = [65, 66, 67, 68];
+ },
+ read: function(stream, buffer, offset, length, pos) {
+ var bytesRead = 0;
+ for (var i = 0; i < length; i++) {
+ if (stream.payload.length) {
+ bytesRead++;
+ buffer[offset+i] = stream.payload.shift();
+ } else {
+ break;
+ }
+ }
+ return bytesRead;
+ },
+ write: function(stream, buffer, offset, length, pos) {
+ for (var i = 0; i < length; i++) {
+ Module.print("TO DEVICE: " + buffer[offset+i]);
+ }
+ return i;
}
- }, function(arg) {
- Module.print("TO DEVICE: " + arg);
- });
- FS.createDevice('/', 'broken-device', function() {
- throw new Error('Broken device input.');
- }, function(arg) {
- throw new Error('Broken device output.');
- });
+ };
+ FS.registerDevice(device, device_ops);
+
+ FS.mkdev('/device', 0666, device);
+
+ var broken_device = FS.makedev(major++, 0);
+ var broken_device_ops = {
+ read: function(stream, buffer, offset, length, pos) {
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
+ },
+ write: function(stream, buffer, offset, length, pos) {
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
+ }
+ };
+ FS.registerDevice(broken_device, broken_device_ops);
+
+ FS.mkdev('/broken-device', 0666, broken_device);
+
+ // NB: These are meant to test FS.createDevice specifically,
+ // and as such do not use registerDevice/mkdev
+ FS.createDevice('/', 'createDevice-read-only', function() {});
+ FS.createDevice('/', 'createDevice-write-only', null, function() {});
+
FS.createDataFile('/', 'file', '1234567890', true, true);
FS.createFolder('/', 'folder', true, true);
})();
diff --git a/tests/unistd/io.out b/tests/unistd/io.out
index 3061b94e..037d0c34 100644
--- a/tests/unistd/io.out
+++ b/tests/unistd/io.out
@@ -22,6 +22,11 @@ TO DEVICE: 0
write to device: 8
errno: 0
+open read-only device from createDevice for read, errno: 0
+open read-only device from createDevice for write, errno: 13
+open write-only device from createDevice for read, errno: 13
+open write-only device from createDevice for write, errno: 0
+
read from file: 10
data: 1234567890
errno: 0