| Index: build_tools/pipeserver.js
|
| diff --git a/build_tools/pipeserver.js b/build_tools/pipeserver.js
|
| index aa1479507cc387b83709321ef83e7c97cbb3f84b..0241d76c2b23379328482ce5a047d2bf5bb76fd8 100644
|
| --- a/build_tools/pipeserver.js
|
| +++ b/build_tools/pipeserver.js
|
| @@ -24,6 +24,12 @@ function PipeServer() {
|
| PipeServer.prototype.EPIPE = 32;
|
|
|
| /**
|
| + * EAGAIN / EWOULDBLOCK.
|
| + * @type {number}
|
| + */
|
| +PipeServer.prototype.EAGAIN = 11;
|
| +
|
| +/**
|
| * Handle an anonymous pipe creation call.
|
| */
|
| PipeServer.prototype.handleMessageAPipe = function(msg, reply, src) {
|
| @@ -63,6 +69,7 @@ PipeServer.prototype.handleMessageAPipeWrite = function(
|
| var part = data.slice(0, item.count);
|
| item.reply({
|
| data: part,
|
| + error: 0,
|
| });
|
| data = data.slice(part.byteLength);
|
| }
|
| @@ -103,11 +110,13 @@ PipeServer.prototype.handleMessageAPipeRead = function(
|
| msg, reply, src) {
|
| var id = msg.pipe_id;
|
| var count = msg.count;
|
| + var nonblock = msg.nonblock;
|
| if (count === 0 ||
|
| !(id in this.anonymousPipes &&
|
| src.pid in this.anonymousPipes[id].readers)) {
|
| reply({
|
| data: new ArrayBuffer(0),
|
| + error: 0,
|
| });
|
| return;
|
| }
|
| @@ -118,12 +127,14 @@ PipeServer.prototype.handleMessageAPipeRead = function(
|
| var part = item.data.slice(0, count);
|
| reply({
|
| data: part,
|
| + error: 0,
|
| });
|
| item.data = item.data.slice(part.byteLength);
|
| pipe.writesPending.unshift(item);
|
| } else {
|
| reply({
|
| data: item.data,
|
| + error: 0,
|
| });
|
| if (!item.replied) {
|
| item.reply({
|
| @@ -133,14 +144,21 @@ PipeServer.prototype.handleMessageAPipeRead = function(
|
| }
|
| } else {
|
| if (Object.keys(pipe.writers).length > 0) {
|
| - pipe.readsPending.push({
|
| - count: count,
|
| - reply: reply,
|
| - pid: src.pid,
|
| - });
|
| + if (nonblock !== 0) {
|
| + reply({
|
| + error: this.EAGAIN,
|
| + });
|
| + } else {
|
| + pipe.readsPending.push({
|
| + count: count,
|
| + reply: reply,
|
| + pid: src.pid,
|
| + });
|
| + }
|
| } else {
|
| reply({
|
| data: new ArrayBuffer(0),
|
| + error: 0,
|
| });
|
| }
|
| }
|
| @@ -165,6 +183,7 @@ PipeServer.prototype.closeAPipe = function(pid, pipeId, writer) {
|
| var item = pipe.readsPending[i];
|
| item.reply({
|
| data: new ArrayBuffer(0),
|
| + error: 0,
|
| });
|
| }
|
| pipe.readsPending = [];
|
| @@ -194,9 +213,12 @@ PipeServer.prototype.handleMessageAPipeClose = function(
|
|
|
| /**
|
| * Add spawned pipe entries.
|
| + * @pid {Object} Numeric process for which to add pipes.
|
| * @params {Object} Dictionary of environment variables passed to process.
|
| + * @returns {boolean} True if stdin is routed.
|
| */
|
| PipeServer.prototype.addProcessPipes = function(pid, params) {
|
| + var routeStdin = false;
|
| var fdCount = 0;
|
| for (;;fdCount++) {
|
| var entry = 'NACL_SPAWN_FD_SETUP_' + fdCount;
|
| @@ -209,6 +231,9 @@ PipeServer.prototype.addProcessPipes = function(pid, params) {
|
| var fd = parseInt(m[1]);
|
| var id = parseInt(m[2]);
|
| var isWriter = parseInt(m[3]);
|
| + if (fd === 0) {
|
| + routeStdin = true;
|
| + }
|
| if (id in this.anonymousPipes) {
|
| var pipe = this.anonymousPipes[id];
|
| if (isWriter) {
|
| @@ -219,6 +244,7 @@ PipeServer.prototype.addProcessPipes = function(pid, params) {
|
| }
|
| }
|
| }
|
| + return routeStdin;
|
| };
|
|
|
|
|
|
|