summaryrefslogtreecommitdiff
path: root/test/fixtures/recvfd.js
diff options
context:
space:
mode:
authorPeter Griess <pg@std.in>2010-06-02 18:16:53 -0700
committerRyan Dahl <ry@tinyclouds.org>2010-06-02 18:16:53 -0700
commit8f0b4e9111cb48e5de13db3fda567edccb121dc4 (patch)
tree48ef5522220f9b5dcbad1a86525662ec2c2dddd5 /test/fixtures/recvfd.js
parent55a6f0173294b2e89a7f1797704669f8ba0349d8 (diff)
downloadandroid-node-v8-8f0b4e9111cb48e5de13db3fda567edccb121dc4.tar.gz
android-node-v8-8f0b4e9111cb48e5de13db3fda567edccb121dc4.tar.bz2
android-node-v8-8f0b4e9111cb48e5de13db3fda567edccb121dc4.zip
Send and receive file descriptors through net.Stream.
a) create a layer of indirection in net.Stream to allow swapping in different read/write implementations and b) emit an 'fd' event when file descriptors are received over a UNIX pipe, as finally as a tangential benefit c) remove a bunch of conditionals from the primary codepaths for ease-of-reading.
Diffstat (limited to 'test/fixtures/recvfd.js')
-rw-r--r--test/fixtures/recvfd.js57
1 files changed, 57 insertions, 0 deletions
diff --git a/test/fixtures/recvfd.js b/test/fixtures/recvfd.js
new file mode 100644
index 0000000000..27e8fc644a
--- /dev/null
+++ b/test/fixtures/recvfd.js
@@ -0,0 +1,57 @@
+// See test/simple/test-sendfd.js for a complete description of what this
+// script is doing and how it fits into the test as a whole.
+
+var net = require('net');
+var sys = require('sys');
+
+var receivedData = [];
+var receivedFDs = [];
+var numSentMessages = 0;
+
+function processData(s) {
+ if (receivedData.length == 0 || receivedFDs.length == 0) {
+ return;
+ }
+
+ var fd = receivedFDs.shift();
+ var d = receivedData.shift();
+
+ // Augment our received object before sending it back across the pipe.
+ d.pid = process.pid;
+
+ // Create a stream around the FD that we received and send a serialized
+ // version of our modified object back. Clean up when we're done.
+ var pipeStream = new net.Stream(fd);
+
+ var drainFunc = function() {
+ pipeStream.destroy();
+
+ if (++numSentMessages == 2) {
+ s.destroy();
+ }
+ };
+
+ pipeStream.addListener('drain', drainFunc);
+ pipeStream.resume();
+
+ if (pipeStream.write(JSON.stringify(d) + '\n')) {
+ drainFunc();
+ }
+};
+
+// Create a UNIX socket to the path defined by argv[2] and read a file
+// descriptor and misc data from it.
+var s = new net.Stream();
+s.addListener('fd', function(fd) {
+ receivedFDs.unshift(fd);
+ processData(s);
+});
+s.addListener('data', function(data) {
+ data.toString('utf8').trim().split('\n').forEach(function(d) {
+ receivedData.unshift(JSON.parse(d));
+ });
+ processData(s);
+});
+s.connect(process.argv[2]);
+
+// vim:ts=2 sw=2 et