Skip to content

Commit cb3ad21

Browse files
authored
Merge pull request #322 from tschaub/std
Represent stdin, stdout, and stderr as files
2 parents 648d299 + 80d318f commit cb3ad21

File tree

3 files changed

+76
-9
lines changed

3 files changed

+76
-9
lines changed

lib/binding.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,19 @@ function Binding(system) {
268268
* Counter for file descriptors.
269269
* @type {number}
270270
*/
271-
this._counter = 0;
271+
this._counter = -1;
272+
273+
const stdin = new FileDescriptor(constants.O_RDWR);
274+
stdin.setItem(new File.StandardInput());
275+
this.trackDescriptor(stdin);
276+
277+
const stdout = new FileDescriptor(constants.O_RDWR);
278+
stdout.setItem(new File.StandardOutput());
279+
this.trackDescriptor(stdout);
280+
281+
const stderr = new FileDescriptor(constants.O_RDWR);
282+
stderr.setItem(new File.StandardError());
283+
this.trackDescriptor(stderr);
272284
}
273285

274286
/**

lib/file.js

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const EMPTY = bufferAlloc(0);
1010
const constants = require('constants');
1111

1212
/**
13-
* A directory.
13+
* A file.
1414
* @constructor
1515
*/
1616
function File() {
@@ -67,3 +67,59 @@ File.prototype.getStats = function() {
6767
* @type {function()}
6868
*/
6969
exports = module.exports = File;
70+
71+
/**
72+
* Standard input.
73+
* @constructor
74+
*/
75+
function StandardInput() {
76+
File.call(this);
77+
this.setMode(438); // 0666
78+
}
79+
util.inherits(StandardInput, File);
80+
81+
exports.StandardInput = StandardInput;
82+
83+
/**
84+
* Standard output.
85+
* @constructor
86+
*/
87+
function StandardOutput() {
88+
File.call(this);
89+
this.setMode(438); // 0666
90+
}
91+
util.inherits(StandardOutput, File);
92+
93+
/**
94+
* Write the contents to stdout.
95+
* @param {string|Buffer} content File contents.
96+
*/
97+
StandardOutput.prototype.setContent = function(content) {
98+
if (process.stdout.isTTY) {
99+
process.stdout.write(content);
100+
}
101+
};
102+
103+
exports.StandardOutput = StandardOutput;
104+
105+
/**
106+
* Standard error.
107+
* @constructor
108+
*/
109+
function StandardError() {
110+
File.call(this);
111+
this.setMode(438); // 0666
112+
}
113+
util.inherits(StandardError, File);
114+
115+
/**
116+
* Write the contents to stderr.
117+
* @param {string|Buffer} content File contents.
118+
*/
119+
StandardError.prototype.setContent = function(content) {
120+
if (process.stderr.isTTY) {
121+
process.stderr.write(content);
122+
}
123+
};
124+
125+
exports.StandardError = StandardError;

lib/item.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,13 @@ function Item() {
9292
* Add execute if read allowed
9393
* See notes in index.js -> mapping#addDir
9494
*/
95-
// prettier-ignore
9695
Item.fixWin32Permissions = mode =>
97-
(process.platform !== 'win32')
98-
? mode
99-
: mode |
100-
((mode & permissions.USER_READ) && permissions.USER_EXEC) |
101-
((mode & permissions.GROUP_READ) && permissions.GROUP_EXEC) |
102-
((mode & permissions.OTHER_READ) && permissions.OTHER_EXEC);
96+
process.platform !== 'win32'
97+
? mode
98+
: mode |
99+
(mode & permissions.USER_READ && permissions.USER_EXEC) |
100+
(mode & permissions.GROUP_READ && permissions.GROUP_EXEC) |
101+
(mode & permissions.OTHER_READ && permissions.OTHER_EXEC);
103102

104103
/**
105104
* Determine if the current user has read permission.

0 commit comments

Comments
 (0)