diff options
author | Peter Griess <pg@std.in> | 2010-06-02 18:16:53 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-06-02 18:16:53 -0700 |
commit | 8f0b4e9111cb48e5de13db3fda567edccb121dc4 (patch) | |
tree | 48ef5522220f9b5dcbad1a86525662ec2c2dddd5 /test/fixtures/recvfd.js | |
parent | 55a6f0173294b2e89a7f1797704669f8ba0349d8 (diff) | |
download | node-new-8f0b4e9111cb48e5de13db3fda567edccb121dc4.tar.gz |
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.js | 57 |
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 |