node-pty 0.11.0-beta30 → 0.11.0-beta32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +14 -15
- package/lib/unixTerminal.js +4 -2
- package/lib/unixTerminal.js.map +1 -1
- package/lib/unixTerminal.test.js +81 -61
- package/lib/unixTerminal.test.js.map +1 -1
- package/package.json +1 -1
- package/src/interfaces.ts +0 -1
- package/src/native.d.ts +2 -1
- package/src/unix/pty.cc +290 -174
- package/src/unix/spawn-helper.cc +4 -51
- package/src/unixTerminal.test.ts +38 -66
- package/src/unixTerminal.ts +5 -2
- package/typings/node-pty.d.ts +1 -7
- package/src/unix/comms.h +0 -5
package/binding.gyp
CHANGED
|
@@ -69,21 +69,6 @@
|
|
|
69
69
|
]
|
|
70
70
|
}, { # OS!="win"
|
|
71
71
|
'targets': [
|
|
72
|
-
{
|
|
73
|
-
'target_name': 'spawn-helper',
|
|
74
|
-
'type': 'executable',
|
|
75
|
-
'cflags': ['-Wall'],
|
|
76
|
-
'sources': [
|
|
77
|
-
'src/unix/spawn-helper.cc',
|
|
78
|
-
],
|
|
79
|
-
'conditions': [
|
|
80
|
-
['OS=="mac"', {
|
|
81
|
-
"xcode_settings": {
|
|
82
|
-
"MACOSX_DEPLOYMENT_TARGET":"10.7"
|
|
83
|
-
}
|
|
84
|
-
}]
|
|
85
|
-
]
|
|
86
|
-
},
|
|
87
72
|
{
|
|
88
73
|
'target_name': 'pty',
|
|
89
74
|
'include_dirs' : [
|
|
@@ -113,6 +98,20 @@
|
|
|
113
98
|
]
|
|
114
99
|
}
|
|
115
100
|
]
|
|
101
|
+
}],
|
|
102
|
+
['OS=="mac"', {
|
|
103
|
+
'targets': [
|
|
104
|
+
{
|
|
105
|
+
'target_name': 'spawn-helper',
|
|
106
|
+
'type': 'executable',
|
|
107
|
+
'sources': [
|
|
108
|
+
'src/unix/spawn-helper.cc',
|
|
109
|
+
],
|
|
110
|
+
"xcode_settings": {
|
|
111
|
+
"MACOSX_DEPLOYMENT_TARGET":"10.7"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
]
|
|
116
115
|
}]
|
|
117
116
|
]
|
|
118
117
|
}
|
package/lib/unixTerminal.js
CHANGED
|
@@ -65,7 +65,6 @@ var UnixTerminal = /** @class */ (function (_super) {
|
|
|
65
65
|
_this._rows = opt.rows || terminal_1.DEFAULT_ROWS;
|
|
66
66
|
var uid = (_a = opt.uid) !== null && _a !== void 0 ? _a : -1;
|
|
67
67
|
var gid = (_b = opt.gid) !== null && _b !== void 0 ? _b : -1;
|
|
68
|
-
var closeFDs = opt.closeFDs || false;
|
|
69
68
|
var env = utils_1.assign({}, opt.env);
|
|
70
69
|
if (opt.env === process.env) {
|
|
71
70
|
_this._sanitizeEnv(env);
|
|
@@ -103,7 +102,7 @@ var UnixTerminal = /** @class */ (function (_super) {
|
|
|
103
102
|
_this.emit('exit', code, signal);
|
|
104
103
|
};
|
|
105
104
|
// fork
|
|
106
|
-
var term = pty.fork(file, args, parsedEnv, cwd, _this._cols, _this._rows, uid, gid, (encoding === 'utf8'),
|
|
105
|
+
var term = pty.fork(file, args, parsedEnv, cwd, _this._cols, _this._rows, uid, gid, (encoding === 'utf8'), helperPath, onexit);
|
|
107
106
|
_this._socket = new PipeSocket(term.fd);
|
|
108
107
|
if (encoding !== null) {
|
|
109
108
|
_this._socket.setEncoding(encoding);
|
|
@@ -246,6 +245,9 @@ var UnixTerminal = /** @class */ (function (_super) {
|
|
|
246
245
|
* Gets the name of the process.
|
|
247
246
|
*/
|
|
248
247
|
get: function () {
|
|
248
|
+
if (process.platform === 'darwin') {
|
|
249
|
+
return pty.process(this._pid) || this._file;
|
|
250
|
+
}
|
|
249
251
|
return pty.process(this._fd, this._pty) || this._file;
|
|
250
252
|
},
|
|
251
253
|
enumerable: false,
|
package/lib/unixTerminal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unixTerminal.js","sourceRoot":"","sources":["../src/unixTerminal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,yBAA2B;AAC3B,2BAA6B;AAC7B,uCAAkE;AAGlE,iCAAiC;AAEjC,IAAI,GAAgB,CAAC;AACrB,IAAI,UAAkB,CAAC;AACvB,IAAI;IACF,GAAG,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC3C,UAAU,GAAG,+BAA+B,CAAC;CAC9C;AAAC,OAAO,UAAU,EAAE;IACnB,IAAI;QACF,GAAG,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACzC,UAAU,GAAG,6BAA6B,CAAC;KAC5C;IAAC,OAAO,UAAU,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACxC,qFAAqF;QACrF,MAAM,UAAU,CAAC;KAClB;CACF;AAED,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACjD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;AACjE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,4BAA4B,CAAC,CAAC;AAEnF,IAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,IAAM,YAAY,GAAG,OAAO,CAAC;AAC7B,IAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC;IAAkC,gCAAQ;IAkBxC,sBAAY,IAAa,EAAE,IAAwB,EAAE,GAAqB;;QAA1E,YACE,kBAAM,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"unixTerminal.js","sourceRoot":"","sources":["../src/unixTerminal.ts"],"names":[],"mappings":"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"}
|
package/lib/unixTerminal.test.js
CHANGED
|
@@ -3,6 +3,42 @@
|
|
|
3
3
|
* Copyright (c) 2017, Daniel Imms (MIT License).
|
|
4
4
|
* Copyright (c) 2018, Microsoft Corporation (MIT License).
|
|
5
5
|
*/
|
|
6
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
16
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
17
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
18
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
19
|
+
function step(op) {
|
|
20
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
21
|
+
while (_) try {
|
|
22
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
23
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
24
|
+
switch (op[0]) {
|
|
25
|
+
case 0: case 1: t = op; break;
|
|
26
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
27
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
28
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
29
|
+
default:
|
|
30
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
31
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
32
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
33
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
34
|
+
if (t[2]) _.ops.pop();
|
|
35
|
+
_.trys.pop(); continue;
|
|
36
|
+
}
|
|
37
|
+
op = body.call(thisArg, _);
|
|
38
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
39
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
40
|
+
}
|
|
41
|
+
};
|
|
6
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
43
|
var unixTerminal_1 = require("./unixTerminal");
|
|
8
44
|
var assert = require("assert");
|
|
@@ -212,68 +248,15 @@ if (process.platform !== 'win32') {
|
|
|
212
248
|
});
|
|
213
249
|
});
|
|
214
250
|
describe('spawn', function () {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
new unixTerminal_1.UnixTerminal('/bin/
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
done();
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
it('should handle chdir() errors', function (done) {
|
|
225
|
-
try {
|
|
226
|
-
new unixTerminal_1.UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
227
|
-
done(new Error('should have failed'));
|
|
228
|
-
}
|
|
229
|
-
catch (e) {
|
|
230
|
-
assert.strictEqual(e.toString(), 'Error: chdir() failed: No such file or directory');
|
|
231
|
-
done();
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
it('should handle setuid() errors', function (done) {
|
|
235
|
-
try {
|
|
236
|
-
new unixTerminal_1.UnixTerminal('/bin/echo', [], { uid: 999999 });
|
|
237
|
-
done(new Error('should have failed'));
|
|
238
|
-
}
|
|
239
|
-
catch (e) {
|
|
240
|
-
assert.strictEqual(e.toString(), 'Error: setuid() failed: Operation not permitted');
|
|
241
|
-
done();
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
if (process.platform === 'linux') {
|
|
245
|
-
it('should not close on exec when closeFDs is not defined', function (done) {
|
|
246
|
-
var data = "\n var pty = require('./lib/index');\n var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log(\"hello from terminal\"), 300);']);\n ptyProcess.on('data', function (data) {\n console.log(data);\n });\n setTimeout(() => null, 500);\n console.log('ready', ptyProcess.pid);\n ";
|
|
247
|
-
var buffer = [];
|
|
248
|
-
var readFd = fs.openSync(FIXTURES_PATH, 'r');
|
|
249
|
-
var p = cp.spawn('node', ['-e', data], {
|
|
250
|
-
stdio: ['ignore', 'pipe', 'pipe', readFd]
|
|
251
|
-
});
|
|
252
|
-
var sub = '';
|
|
253
|
-
p.stdout.on('data', function (data) {
|
|
254
|
-
if (!data.toString().indexOf('ready')) {
|
|
255
|
-
sub = data.toString().split(' ')[1].slice(0, -1);
|
|
256
|
-
try {
|
|
257
|
-
fs.statSync("/proc/" + sub + "/fd/" + readFd);
|
|
258
|
-
}
|
|
259
|
-
catch (_) {
|
|
260
|
-
done('not reachable');
|
|
261
|
-
}
|
|
262
|
-
setTimeout(function () {
|
|
263
|
-
process.kill(parseInt(sub), 'SIGINT'); // SIGINT to child
|
|
264
|
-
p.kill('SIGINT'); // SIGINT to parent
|
|
265
|
-
}, 200);
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
buffer.push(data.toString().replace(/^\s+|\s+$/g, ''));
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
p.on('close', function () {
|
|
272
|
-
done();
|
|
273
|
-
});
|
|
251
|
+
if (process.platform === 'darwin') {
|
|
252
|
+
it('should return the name of the process', function (done) {
|
|
253
|
+
var term = new unixTerminal_1.UnixTerminal('/bin/echo');
|
|
254
|
+
assert.strictEqual(term.process, '/bin/echo');
|
|
255
|
+
term.on('exit', function () { return done(); });
|
|
256
|
+
term.destroy();
|
|
274
257
|
});
|
|
275
|
-
it('should close on exec
|
|
276
|
-
var data = "\n var pty = require('./lib/index');\n var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log(\"hello from terminal\"), 300);']
|
|
258
|
+
it('should close on exec', function (done) {
|
|
259
|
+
var data = "\n var pty = require('./lib/index');\n var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log(\"hello from terminal\"), 300);']);\n ptyProcess.on('data', function (data) {\n console.log(data);\n });\n setTimeout(() => null, 500);\n console.log('ready', ptyProcess.pid);\n ";
|
|
277
260
|
var buffer = [];
|
|
278
261
|
var readFd = fs.openSync(FIXTURES_PATH, 'r');
|
|
279
262
|
var p = cp.spawn('node', ['-e', data], {
|
|
@@ -304,6 +287,43 @@ if (process.platform !== 'win32') {
|
|
|
304
287
|
});
|
|
305
288
|
});
|
|
306
289
|
}
|
|
290
|
+
it('should handle exec() errors', function (done) {
|
|
291
|
+
var term = new unixTerminal_1.UnixTerminal('/bin/bogus.exe', []);
|
|
292
|
+
term.on('exit', function (code, signal) {
|
|
293
|
+
assert.strictEqual(code, 1);
|
|
294
|
+
done();
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
it('should handle chdir() errors', function (done) {
|
|
298
|
+
var term = new unixTerminal_1.UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
299
|
+
term.on('exit', function (code, signal) {
|
|
300
|
+
assert.strictEqual(code, 1);
|
|
301
|
+
done();
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
it('should not leak child process', function (done) {
|
|
305
|
+
var count = cp.execSync('ps -ax | grep node | wc -l');
|
|
306
|
+
var term = new unixTerminal_1.UnixTerminal('node', ['-e', "\n console.log('ready');\n setTimeout(()=>console.log('timeout'), 200);"
|
|
307
|
+
]);
|
|
308
|
+
term.on('data', function (data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
309
|
+
var newCount;
|
|
310
|
+
return __generator(this, function (_a) {
|
|
311
|
+
switch (_a.label) {
|
|
312
|
+
case 0:
|
|
313
|
+
if (!(data === 'ready\r\n')) return [3 /*break*/, 2];
|
|
314
|
+
process.kill(term.pid, 'SIGINT');
|
|
315
|
+
return [4 /*yield*/, setTimeout(function () { return null; }, 1000)];
|
|
316
|
+
case 1:
|
|
317
|
+
_a.sent();
|
|
318
|
+
newCount = cp.execSync('ps -ax | grep node | wc -l');
|
|
319
|
+
assert.strictEqual(count.toString(), newCount.toString());
|
|
320
|
+
done();
|
|
321
|
+
_a.label = 2;
|
|
322
|
+
case 2: return [2 /*return*/];
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}); });
|
|
326
|
+
});
|
|
307
327
|
});
|
|
308
328
|
});
|
|
309
329
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unixTerminal.test.js","sourceRoot":"","sources":["../src/unixTerminal.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"unixTerminal.test.js","sourceRoot":"","sources":["../src/unixTerminal.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/interfaces.ts
CHANGED
package/src/native.d.ts
CHANGED
|
@@ -18,9 +18,10 @@ interface IWinptyNative {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
interface IUnixNative {
|
|
21
|
-
fork(file: string, args: string[], parsedEnv: string[], cwd: string, cols: number, rows: number, uid: number, gid: number,
|
|
21
|
+
fork(file: string, args: string[], parsedEnv: string[], cwd: string, cols: number, rows: number, uid: number, gid: number, useUtf8: boolean, helperPath: string, onExitCallback: (code: number, signal: number) => void): IUnixProcess;
|
|
22
22
|
open(cols: number, rows: number): IUnixOpenProcess;
|
|
23
23
|
process(fd: number, pty: string): string;
|
|
24
|
+
process(pid: number): string;
|
|
24
25
|
resize(fd: number, cols: number, rows: number): void;
|
|
25
26
|
}
|
|
26
27
|
|
package/src/unix/pty.cc
CHANGED
|
@@ -29,26 +29,15 @@
|
|
|
29
29
|
#include <sys/wait.h>
|
|
30
30
|
#include <fcntl.h>
|
|
31
31
|
#include <signal.h>
|
|
32
|
-
#include <spawn.h>
|
|
33
|
-
|
|
34
|
-
#include "comms.h"
|
|
35
32
|
|
|
36
33
|
/* forkpty */
|
|
37
34
|
/* http://www.gnu.org/software/gnulib/manual/html_node/forkpty.html */
|
|
38
|
-
#if defined(
|
|
35
|
+
#if defined(__linux__)
|
|
39
36
|
#include <pty.h>
|
|
40
|
-
#elif defined(__APPLE__)
|
|
37
|
+
#elif defined(__APPLE__)
|
|
41
38
|
#include <util.h>
|
|
42
|
-
#elif defined(__FreeBSD__)
|
|
43
|
-
#include <libutil.h>
|
|
44
|
-
#elif defined(__sun)
|
|
45
|
-
#include <stropts.h> /* for I_PUSH */
|
|
46
|
-
#else
|
|
47
|
-
#include <pty.h>
|
|
48
39
|
#endif
|
|
49
40
|
|
|
50
|
-
#include <termios.h> /* tcgetattr, tty_ioctl */
|
|
51
|
-
|
|
52
41
|
/* Some platforms name VWERASE and VDISCARD differently */
|
|
53
42
|
#if !defined(VWERASE) && defined(VWERSE)
|
|
54
43
|
#define VWERASE VWERSE
|
|
@@ -62,8 +51,12 @@
|
|
|
62
51
|
#include <stdio.h>
|
|
63
52
|
#include <stdint.h>
|
|
64
53
|
#elif defined(__APPLE__)
|
|
65
|
-
#include <sys/sysctl.h>
|
|
66
54
|
#include <libproc.h>
|
|
55
|
+
#include <os/availability.h>
|
|
56
|
+
#include <paths.h>
|
|
57
|
+
#include <spawn.h>
|
|
58
|
+
#include <sys/event.h>
|
|
59
|
+
#include <termios.h>
|
|
67
60
|
#endif
|
|
68
61
|
|
|
69
62
|
/* NSIG - macro for highest signal + 1, should be defined */
|
|
@@ -71,15 +64,36 @@
|
|
|
71
64
|
#define NSIG 32
|
|
72
65
|
#endif
|
|
73
66
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
#
|
|
77
|
-
#define HAVE_POSIX_SPAWN_CLOEXEC_DEFAULT 0
|
|
78
|
-
#define POSIX_SPAWN_CLOEXEC_DEFAULT 0
|
|
67
|
+
/* macOS 10.14 back does not define this constant */
|
|
68
|
+
#ifndef POSIX_SPAWN_SETSID
|
|
69
|
+
#define POSIX_SPAWN_SETSID 1024
|
|
79
70
|
#endif
|
|
80
71
|
|
|
81
|
-
|
|
82
|
-
|
|
72
|
+
/* environ for execvpe */
|
|
73
|
+
/* node/src/node_child_process.cc */
|
|
74
|
+
#if !defined(__APPLE__)
|
|
75
|
+
extern char **environ;
|
|
76
|
+
#endif
|
|
77
|
+
|
|
78
|
+
#if defined(__APPLE__)
|
|
79
|
+
extern "C" {
|
|
80
|
+
// Changes the current thread's directory to a path or directory file
|
|
81
|
+
// descriptor. libpthread only exposes a syscall wrapper starting in
|
|
82
|
+
// macOS 10.12, but the system call dates back to macOS 10.5. On older OSes,
|
|
83
|
+
// the syscall is issued directly.
|
|
84
|
+
int pthread_chdir_np(const char* dir) API_AVAILABLE(macosx(10.12));
|
|
85
|
+
int pthread_fchdir_np(int fd) API_AVAILABLE(macosx(10.12));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
#define HANDLE_EINTR(x) ({ \
|
|
89
|
+
int eintr_wrapper_counter = 0; \
|
|
90
|
+
decltype(x) eintr_wrapper_result; \
|
|
91
|
+
do { \
|
|
92
|
+
eintr_wrapper_result = (x); \
|
|
93
|
+
} while (eintr_wrapper_result == -1 && errno == EINTR && \
|
|
94
|
+
eintr_wrapper_counter++ < 100); \
|
|
95
|
+
eintr_wrapper_result; \
|
|
96
|
+
})
|
|
83
97
|
#endif
|
|
84
98
|
|
|
85
99
|
/**
|
|
@@ -111,13 +125,13 @@ NAN_METHOD(PtyGetProc);
|
|
|
111
125
|
static int
|
|
112
126
|
pty_nonblock(int);
|
|
113
127
|
|
|
128
|
+
#if defined(__APPLE__)
|
|
129
|
+
static char *
|
|
130
|
+
pty_getproc(int);
|
|
131
|
+
#else
|
|
114
132
|
static char *
|
|
115
133
|
pty_getproc(int, char *);
|
|
116
|
-
|
|
117
|
-
static int
|
|
118
|
-
pty_openpty(int *, int *, char *,
|
|
119
|
-
const struct termios *,
|
|
120
|
-
const struct winsize *);
|
|
134
|
+
#endif
|
|
121
135
|
|
|
122
136
|
static void
|
|
123
137
|
pty_waitpid(void *);
|
|
@@ -128,16 +142,20 @@ pty_after_waitpid(uv_async_t *);
|
|
|
128
142
|
static void
|
|
129
143
|
pty_after_close(uv_handle_t *);
|
|
130
144
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
145
|
+
#if defined(__APPLE__) || defined(__OpenBSD__)
|
|
146
|
+
static void
|
|
147
|
+
pty_posix_spawn(char** argv, char** env,
|
|
148
|
+
const struct termios *termp,
|
|
149
|
+
const struct winsize *winp,
|
|
150
|
+
int* master,
|
|
151
|
+
pid_t* pid,
|
|
152
|
+
int* err);
|
|
153
|
+
#endif
|
|
136
154
|
|
|
137
155
|
NAN_METHOD(PtyFork) {
|
|
138
156
|
Nan::HandleScope scope;
|
|
139
157
|
|
|
140
|
-
if (info.Length() !=
|
|
158
|
+
if (info.Length() != 11 ||
|
|
141
159
|
!info[0]->IsString() ||
|
|
142
160
|
!info[1]->IsArray() ||
|
|
143
161
|
!info[2]->IsArray() ||
|
|
@@ -147,11 +165,10 @@ NAN_METHOD(PtyFork) {
|
|
|
147
165
|
!info[6]->IsNumber() ||
|
|
148
166
|
!info[7]->IsNumber() ||
|
|
149
167
|
!info[8]->IsBoolean() ||
|
|
150
|
-
!info[9]->
|
|
151
|
-
!info[10]->IsFunction()
|
|
152
|
-
!info[11]->IsString()) {
|
|
168
|
+
!info[9]->IsString() ||
|
|
169
|
+
!info[10]->IsFunction()) {
|
|
153
170
|
return Nan::ThrowError(
|
|
154
|
-
"Usage: pty.fork(file, args, env, cwd, cols, rows, uid, gid, utf8,
|
|
171
|
+
"Usage: pty.fork(file, args, env, cwd, cols, rows, uid, gid, utf8, helperPath, onexit)");
|
|
155
172
|
}
|
|
156
173
|
|
|
157
174
|
// file
|
|
@@ -180,9 +197,11 @@ NAN_METHOD(PtyFork) {
|
|
|
180
197
|
winp.ws_xpixel = 0;
|
|
181
198
|
winp.ws_ypixel = 0;
|
|
182
199
|
|
|
200
|
+
#if !defined(__APPLE__)
|
|
183
201
|
// uid / gid
|
|
184
202
|
int uid = info[6]->IntegerValue(Nan::GetCurrentContext()).FromJust();
|
|
185
203
|
int gid = info[7]->IntegerValue(Nan::GetCurrentContext()).FromJust();
|
|
204
|
+
#endif
|
|
186
205
|
|
|
187
206
|
// termios
|
|
188
207
|
struct termios t = termios();
|
|
@@ -219,36 +238,51 @@ NAN_METHOD(PtyFork) {
|
|
|
219
238
|
term->c_cc[VSTATUS] = 20;
|
|
220
239
|
#endif
|
|
221
240
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
bool explicitlyCloseFDs = closeFDs && !HAVE_POSIX_SPAWN_CLOEXEC_DEFAULT;
|
|
241
|
+
cfsetispeed(term, B38400);
|
|
242
|
+
cfsetospeed(term, B38400);
|
|
225
243
|
|
|
226
244
|
// helperPath
|
|
227
|
-
Nan::Utf8String
|
|
228
|
-
char *helper_path = strdup(*helper_path_);
|
|
245
|
+
Nan::Utf8String helper_path(info[9]);
|
|
229
246
|
|
|
230
|
-
|
|
247
|
+
pid_t pid;
|
|
248
|
+
int master;
|
|
249
|
+
#if defined(__APPLE__)
|
|
231
250
|
int argc = argv_->Length();
|
|
232
|
-
int argl = argc +
|
|
251
|
+
int argl = argc + 4;
|
|
233
252
|
char **argv = new char*[argl];
|
|
234
|
-
argv[0] = strdup(helper_path);
|
|
253
|
+
argv[0] = strdup(*helper_path);
|
|
235
254
|
argv[1] = strdup(*cwd_);
|
|
236
|
-
argv[2] = strdup(
|
|
237
|
-
argv[3] = strdup(std::to_string(gid).c_str());
|
|
238
|
-
argv[4] = strdup(explicitlyCloseFDs ? "1": "0");
|
|
239
|
-
argv[5] = strdup(*file);
|
|
255
|
+
argv[2] = strdup(*file);
|
|
240
256
|
argv[argl - 1] = NULL;
|
|
241
257
|
for (int i = 0; i < argc; i++) {
|
|
242
258
|
Nan::Utf8String arg(Nan::Get(argv_, i).ToLocalChecked());
|
|
243
|
-
argv[i +
|
|
259
|
+
argv[i + 3] = strdup(*arg);
|
|
244
260
|
}
|
|
245
261
|
|
|
246
|
-
|
|
247
|
-
|
|
262
|
+
int err = -1;
|
|
263
|
+
pty_posix_spawn(argv, env, term, &winp, &master, &pid, &err);
|
|
264
|
+
if (err != 0) {
|
|
265
|
+
Nan::ThrowError("posix_spawnp failed.");
|
|
266
|
+
goto done;
|
|
267
|
+
}
|
|
268
|
+
if (pty_nonblock(master) == -1) {
|
|
269
|
+
Nan::ThrowError("Could not set master fd to nonblocking.");
|
|
270
|
+
goto done;
|
|
271
|
+
}
|
|
272
|
+
#else
|
|
273
|
+
int argc = argv_->Length();
|
|
274
|
+
int argl = argc + 2;
|
|
275
|
+
char **argv = new char*[argl];
|
|
276
|
+
argv[0] = strdup(*file);
|
|
277
|
+
argv[argl - 1] = NULL;
|
|
278
|
+
for (int i = 0; i < argc; i++) {
|
|
279
|
+
Nan::Utf8String arg(Nan::Get(argv_, i).ToLocalChecked());
|
|
280
|
+
argv[i + 1] = strdup(*arg);
|
|
281
|
+
}
|
|
248
282
|
|
|
283
|
+
char* cwd = strdup(*cwd_);
|
|
249
284
|
sigset_t newmask, oldmask;
|
|
250
|
-
|
|
251
|
-
|
|
285
|
+
struct sigaction sig_action;
|
|
252
286
|
// temporarily block all signals
|
|
253
287
|
// this is needed due to a race condition in openpty
|
|
254
288
|
// and to avoid running signal handlers in the child
|
|
@@ -256,72 +290,69 @@ NAN_METHOD(PtyFork) {
|
|
|
256
290
|
sigfillset(&newmask);
|
|
257
291
|
pthread_sigmask(SIG_SETMASK, &newmask, &oldmask);
|
|
258
292
|
|
|
259
|
-
|
|
260
|
-
int ret = pty_openpty(&master, &slave, nullptr, term, &winp);
|
|
261
|
-
if (ret == -1) {
|
|
262
|
-
perror("openpty failed");
|
|
263
|
-
Nan::ThrowError("openpty failed.");
|
|
264
|
-
goto done;
|
|
265
|
-
}
|
|
293
|
+
pid = forkpty(&master, nullptr, static_cast<termios*>(term), static_cast<winsize*>(&winp));
|
|
266
294
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
295
|
+
if (!pid) {
|
|
296
|
+
// remove all signal handler from child
|
|
297
|
+
sig_action.sa_handler = SIG_DFL;
|
|
298
|
+
sig_action.sa_flags = 0;
|
|
299
|
+
sigemptyset(&sig_action.sa_mask);
|
|
300
|
+
for (int i = 0 ; i < NSIG ; i++) { // NSIG is a macro for all signals + 1
|
|
301
|
+
sigaction(i, &sig_action, NULL);
|
|
302
|
+
}
|
|
303
|
+
} else {
|
|
304
|
+
for (int i = 0; i < argl; i++) free(argv[i]);
|
|
305
|
+
delete[] argv;
|
|
273
306
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
posix_spawn_file_actions_adddup2(&acts, slave, STDIN_FILENO);
|
|
277
|
-
posix_spawn_file_actions_adddup2(&acts, slave, STDOUT_FILENO);
|
|
278
|
-
posix_spawn_file_actions_adddup2(&acts, slave, STDERR_FILENO);
|
|
279
|
-
posix_spawn_file_actions_adddup2(&acts, comms_pipe[1], COMM_PIPE_FD);
|
|
280
|
-
posix_spawn_file_actions_addclose(&acts, comms_pipe[1]);
|
|
307
|
+
for (int i = 0; i < envc; i++) free(env[i]);
|
|
308
|
+
delete[] env;
|
|
281
309
|
|
|
282
|
-
|
|
283
|
-
posix_spawnattr_init(&attrs);
|
|
284
|
-
if (closeFDs) {
|
|
285
|
-
flags |= POSIX_SPAWN_CLOEXEC_DEFAULT;
|
|
310
|
+
free(cwd);
|
|
286
311
|
}
|
|
287
|
-
posix_spawnattr_setflags(&attrs, flags);
|
|
288
312
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
auto error = posix_spawn(&pid, argv[0], &acts, &attrs, argv, env);
|
|
313
|
+
// reenable signals
|
|
314
|
+
pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
|
|
292
315
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
|
|
297
|
-
|
|
298
|
-
if (error) {
|
|
299
|
-
throw_for_errno("posix_spawn failed: ", error);
|
|
316
|
+
switch (pid) {
|
|
317
|
+
case -1:
|
|
318
|
+
Nan::ThrowError("forkpty(3) failed.");
|
|
300
319
|
goto done;
|
|
301
|
-
|
|
320
|
+
case 0:
|
|
321
|
+
if (strlen(cwd)) {
|
|
322
|
+
if (chdir(cwd) == -1) {
|
|
323
|
+
perror("chdir(2) failed.");
|
|
324
|
+
_exit(1);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
302
327
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
} else if (helper_error[0] == COMM_ERR_SETUID) {
|
|
313
|
-
throw_for_errno("setuid() failed: ", helper_error[1]);
|
|
314
|
-
} else if (helper_error[0] == COMM_ERR_SETGID) {
|
|
315
|
-
throw_for_errno("setgid() failed: ", helper_error[1]);
|
|
328
|
+
if (uid != -1 && gid != -1) {
|
|
329
|
+
if (setgid(gid) == -1) {
|
|
330
|
+
perror("setgid(2) failed.");
|
|
331
|
+
_exit(1);
|
|
332
|
+
}
|
|
333
|
+
if (setuid(uid) == -1) {
|
|
334
|
+
perror("setuid(2) failed.");
|
|
335
|
+
_exit(1);
|
|
336
|
+
}
|
|
316
337
|
}
|
|
317
|
-
goto done;
|
|
318
|
-
}
|
|
319
338
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
339
|
+
{
|
|
340
|
+
char **old = environ;
|
|
341
|
+
environ = env;
|
|
342
|
+
execvp(argv[0], argv);
|
|
343
|
+
environ = old;
|
|
344
|
+
perror("execvp(3) failed.");
|
|
345
|
+
_exit(1);
|
|
346
|
+
}
|
|
347
|
+
default:
|
|
348
|
+
if (pty_nonblock(master) == -1) {
|
|
349
|
+
Nan::ThrowError("Could not set master fd to nonblocking.");
|
|
350
|
+
goto done;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
#endif
|
|
324
354
|
|
|
355
|
+
{
|
|
325
356
|
v8::Local<v8::Object> obj = Nan::New<v8::Object>();
|
|
326
357
|
Nan::Set(obj,
|
|
327
358
|
Nan::New<v8::String>("fd").ToLocalChecked(),
|
|
@@ -344,21 +375,18 @@ NAN_METHOD(PtyFork) {
|
|
|
344
375
|
|
|
345
376
|
uv_thread_create(&baton->tid, pty_waitpid, static_cast<void*>(baton));
|
|
346
377
|
|
|
347
|
-
info.GetReturnValue().Set(obj);
|
|
378
|
+
return info.GetReturnValue().Set(obj);
|
|
348
379
|
}
|
|
380
|
+
|
|
349
381
|
done:
|
|
350
|
-
|
|
351
|
-
|
|
382
|
+
#if defined(__APPLE__)
|
|
383
|
+
for (int i = 0; i < argl; i++) free(argv[i]);
|
|
384
|
+
delete[] argv;
|
|
352
385
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
if (env) {
|
|
358
|
-
for (int i = 0; i < envc; i++) free(env[i]);
|
|
359
|
-
delete[] env;
|
|
360
|
-
}
|
|
361
|
-
free(helper_path);
|
|
386
|
+
for (int i = 0; i < envc; i++) free(env[i]);
|
|
387
|
+
delete[] env;
|
|
388
|
+
#endif
|
|
389
|
+
return info.GetReturnValue().SetUndefined();
|
|
362
390
|
}
|
|
363
391
|
|
|
364
392
|
NAN_METHOD(PtyOpen) {
|
|
@@ -379,7 +407,7 @@ NAN_METHOD(PtyOpen) {
|
|
|
379
407
|
|
|
380
408
|
// pty
|
|
381
409
|
int master, slave;
|
|
382
|
-
int ret =
|
|
410
|
+
int ret = openpty(&master, &slave, nullptr, NULL, static_cast<winsize*>(&winp));
|
|
383
411
|
|
|
384
412
|
if (ret == -1) {
|
|
385
413
|
return Nan::ThrowError("openpty(3) failed.");
|
|
@@ -444,6 +472,15 @@ NAN_METHOD(PtyResize) {
|
|
|
444
472
|
NAN_METHOD(PtyGetProc) {
|
|
445
473
|
Nan::HandleScope scope;
|
|
446
474
|
|
|
475
|
+
#if defined(__APPLE__)
|
|
476
|
+
if (info.Length() != 1 ||
|
|
477
|
+
!info[0]->IsNumber()) {
|
|
478
|
+
return Nan::ThrowError("Usage: pty.process(pid)");
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
int pid = info[0]->IntegerValue(Nan::GetCurrentContext()).FromJust();
|
|
482
|
+
char *name = pty_getproc(pid);
|
|
483
|
+
#else
|
|
447
484
|
if (info.Length() != 2 ||
|
|
448
485
|
!info[0]->IsNumber() ||
|
|
449
486
|
!info[1]->IsString()) {
|
|
@@ -456,6 +493,7 @@ NAN_METHOD(PtyGetProc) {
|
|
|
456
493
|
char *tty = strdup(*tty_);
|
|
457
494
|
char *name = pty_getproc(fd, tty);
|
|
458
495
|
free(tty);
|
|
496
|
+
#endif
|
|
459
497
|
|
|
460
498
|
if (name == NULL) {
|
|
461
499
|
return info.GetReturnValue().SetUndefined();
|
|
@@ -486,11 +524,44 @@ static void
|
|
|
486
524
|
pty_waitpid(void *data) {
|
|
487
525
|
int ret;
|
|
488
526
|
int stat_loc;
|
|
489
|
-
|
|
490
527
|
pty_baton *baton = static_cast<pty_baton*>(data);
|
|
491
|
-
|
|
492
528
|
errno = 0;
|
|
493
|
-
|
|
529
|
+
#if defined(__APPLE__)
|
|
530
|
+
// Based on
|
|
531
|
+
// https://source.chromium.org/chromium/chromium/src/+/main:base/process/kill_mac.cc;l=35-69?
|
|
532
|
+
int kq = HANDLE_EINTR(kqueue());
|
|
533
|
+
struct kevent change = {0};
|
|
534
|
+
EV_SET(&change, baton->pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
|
|
535
|
+
ret = HANDLE_EINTR(kevent(kq, &change, 1, NULL, 0, NULL));
|
|
536
|
+
if (ret == -1) {
|
|
537
|
+
if (errno == ESRCH) {
|
|
538
|
+
// At this point, one of the following has occurred:
|
|
539
|
+
// 1. The process has died but has not yet been reaped.
|
|
540
|
+
// 2. The process has died and has already been reaped.
|
|
541
|
+
// 3. The process is in the process of dying. It's no longer
|
|
542
|
+
// kqueueable, but it may not be waitable yet either. Mark calls
|
|
543
|
+
// this case the "zombie death race".
|
|
544
|
+
ret = HANDLE_EINTR(waitpid(baton->pid, &stat_loc, WNOHANG));
|
|
545
|
+
if (ret == 0) {
|
|
546
|
+
ret = kill(baton->pid, SIGKILL);
|
|
547
|
+
if (ret != -1) {
|
|
548
|
+
HANDLE_EINTR(waitpid(baton->pid, &stat_loc, 0));
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
} else {
|
|
553
|
+
struct kevent event = {0};
|
|
554
|
+
ret = HANDLE_EINTR(kevent(kq, NULL, 0, &event, 1, NULL));
|
|
555
|
+
if (ret == 1) {
|
|
556
|
+
if ((event.fflags & NOTE_EXIT) &&
|
|
557
|
+
(event.ident == static_cast<uintptr_t>(baton->pid))) {
|
|
558
|
+
// The process is dead or dying. This won't block for long, if at
|
|
559
|
+
// all.
|
|
560
|
+
HANDLE_EINTR(waitpid(baton->pid, &stat_loc, 0));
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
#else
|
|
494
565
|
if ((ret = waitpid(baton->pid, &stat_loc, 0)) != baton->pid) {
|
|
495
566
|
if (ret == -1 && errno == EINTR) {
|
|
496
567
|
return pty_waitpid(baton);
|
|
@@ -503,6 +574,7 @@ pty_waitpid(void *data) {
|
|
|
503
574
|
assert(false);
|
|
504
575
|
}
|
|
505
576
|
}
|
|
577
|
+
#endif
|
|
506
578
|
|
|
507
579
|
if (WIFEXITED(stat_loc)) {
|
|
508
580
|
baton->exit_code = WEXITSTATUS(stat_loc); // errno?
|
|
@@ -618,25 +690,13 @@ pty_getproc(int fd, char *tty) {
|
|
|
618
690
|
#elif defined(__APPLE__)
|
|
619
691
|
|
|
620
692
|
static char *
|
|
621
|
-
pty_getproc(int
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
struct kinfo_proc kp;
|
|
625
|
-
|
|
626
|
-
if ((mib[3] = tcgetpgrp(fd)) == -1) {
|
|
627
|
-
return NULL;
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
size = sizeof kp;
|
|
631
|
-
if (sysctl(mib, 4, &kp, &size, NULL, 0) == -1) {
|
|
693
|
+
pty_getproc(int pid) {
|
|
694
|
+
char pname[MAXCOMLEN + 1];
|
|
695
|
+
if (!proc_name(pid, pname, sizeof(pname))) {
|
|
632
696
|
return NULL;
|
|
633
697
|
}
|
|
634
698
|
|
|
635
|
-
|
|
636
|
-
return NULL;
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
return strdup(kp.kp_proc.p_comm);
|
|
699
|
+
return strdup(pname);
|
|
640
700
|
}
|
|
641
701
|
|
|
642
702
|
#else
|
|
@@ -648,50 +708,106 @@ pty_getproc(int fd, char *tty) {
|
|
|
648
708
|
|
|
649
709
|
#endif
|
|
650
710
|
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
711
|
+
#if defined(__APPLE__)
|
|
712
|
+
static void
|
|
713
|
+
pty_posix_spawn(char** argv, char** env,
|
|
714
|
+
const struct termios *termp,
|
|
715
|
+
const struct winsize *winp,
|
|
716
|
+
int* master,
|
|
717
|
+
pid_t* pid,
|
|
718
|
+
int* err) {
|
|
719
|
+
int low_fds[3];
|
|
720
|
+
size_t count = 0;
|
|
721
|
+
|
|
722
|
+
for (; count < 3; count++) {
|
|
723
|
+
low_fds[count] = posix_openpt(O_RDWR);
|
|
724
|
+
if (low_fds[count] >= STDERR_FILENO)
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
654
727
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
728
|
+
int flags = POSIX_SPAWN_CLOEXEC_DEFAULT |
|
|
729
|
+
POSIX_SPAWN_SETSIGDEF |
|
|
730
|
+
POSIX_SPAWN_SETSIGMASK |
|
|
731
|
+
POSIX_SPAWN_SETSID;
|
|
732
|
+
*master = posix_openpt(O_RDWR);
|
|
733
|
+
if (*master == -1) {
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
int res = grantpt(*master) || unlockpt(*master);
|
|
738
|
+
if (res == -1) {
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// Use TIOCPTYGNAME instead of ptsname() to avoid threading problems.
|
|
663
743
|
int slave;
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
if (
|
|
744
|
+
char slave_pty_name[128];
|
|
745
|
+
res = ioctl(*master, TIOCPTYGNAME, slave_pty_name);
|
|
746
|
+
if (res == -1) {
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
667
749
|
|
|
668
|
-
|
|
669
|
-
if (
|
|
750
|
+
slave = open(slave_pty_name, O_RDWR | O_NOCTTY);
|
|
751
|
+
if (slave == -1) {
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
670
754
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
755
|
+
if (termp) {
|
|
756
|
+
res = tcsetattr(slave, TCSANOW, termp);
|
|
757
|
+
if (res == -1) {
|
|
758
|
+
return;
|
|
759
|
+
};
|
|
760
|
+
}
|
|
674
761
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
762
|
+
if (winp) {
|
|
763
|
+
res = ioctl(slave, TIOCSWINSZ, winp);
|
|
764
|
+
if (res == -1) {
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
678
768
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
769
|
+
posix_spawn_file_actions_t acts;
|
|
770
|
+
posix_spawn_file_actions_init(&acts);
|
|
771
|
+
posix_spawn_file_actions_adddup2(&acts, slave, STDIN_FILENO);
|
|
772
|
+
posix_spawn_file_actions_adddup2(&acts, slave, STDOUT_FILENO);
|
|
773
|
+
posix_spawn_file_actions_adddup2(&acts, slave, STDERR_FILENO);
|
|
774
|
+
posix_spawn_file_actions_addclose(&acts, slave);
|
|
775
|
+
posix_spawn_file_actions_addclose(&acts, *master);
|
|
682
776
|
|
|
683
|
-
|
|
684
|
-
|
|
777
|
+
posix_spawnattr_t attrs;
|
|
778
|
+
posix_spawnattr_init(&attrs);
|
|
779
|
+
*err = posix_spawnattr_setflags(&attrs, flags);
|
|
780
|
+
if (*err != 0) {
|
|
781
|
+
goto done;
|
|
782
|
+
}
|
|
685
783
|
|
|
686
|
-
|
|
784
|
+
sigset_t signal_set;
|
|
785
|
+
/* Reset all signal the child to their default behavior */
|
|
786
|
+
sigfillset(&signal_set);
|
|
787
|
+
*err = posix_spawnattr_setsigdefault(&attrs, &signal_set);
|
|
788
|
+
if (*err != 0) {
|
|
789
|
+
goto done;
|
|
790
|
+
}
|
|
687
791
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
792
|
+
/* Reset the signal mask for all signals */
|
|
793
|
+
sigemptyset(&signal_set);
|
|
794
|
+
*err = posix_spawnattr_setsigmask(&attrs, &signal_set);
|
|
795
|
+
if (*err != 0) {
|
|
796
|
+
goto done;
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
do
|
|
800
|
+
*err = posix_spawn(pid, argv[0], &acts, &attrs, argv, env);
|
|
801
|
+
while (*err == EINTR);
|
|
802
|
+
done:
|
|
803
|
+
posix_spawn_file_actions_destroy(&acts);
|
|
804
|
+
posix_spawnattr_destroy(&attrs);
|
|
805
|
+
|
|
806
|
+
for (; count > 0; count--) {
|
|
807
|
+
close(low_fds[count]);
|
|
808
|
+
}
|
|
694
809
|
}
|
|
810
|
+
#endif
|
|
695
811
|
|
|
696
812
|
/**
|
|
697
813
|
* Init
|
package/src/unix/spawn-helper.cc
CHANGED
|
@@ -1,70 +1,23 @@
|
|
|
1
1
|
#include <errno.h>
|
|
2
2
|
#include <fcntl.h>
|
|
3
|
-
#include <signal.h>
|
|
4
|
-
#include <string>
|
|
5
|
-
#include <sys/ioctl.h>
|
|
6
|
-
#include <sys/resource.h>
|
|
7
|
-
#include <termios.h>
|
|
8
|
-
#include <unistd.h>
|
|
9
3
|
#include <string.h>
|
|
10
|
-
|
|
11
|
-
#include "comms.h"
|
|
12
|
-
|
|
13
|
-
void bail (int type, int code) {
|
|
14
|
-
int buf[2] = { type, code };
|
|
15
|
-
(void)! write(COMM_PIPE_FD, &buf, sizeof(buf));
|
|
16
|
-
_exit(1);
|
|
17
|
-
}
|
|
4
|
+
#include <unistd.h>
|
|
18
5
|
|
|
19
6
|
int main (int argc, char** argv) {
|
|
20
|
-
sigset_t empty_set;
|
|
21
|
-
sigemptyset(&empty_set);
|
|
22
|
-
pthread_sigmask(SIG_SETMASK, &empty_set, nullptr);
|
|
23
|
-
|
|
24
|
-
setsid();
|
|
25
|
-
|
|
26
|
-
#if defined(TIOCSCTTY)
|
|
27
|
-
// glibc does this
|
|
28
|
-
if (ioctl(STDIN_FILENO, TIOCSCTTY, NULL) == -1) {
|
|
29
|
-
_exit(1);
|
|
30
|
-
}
|
|
31
|
-
#else
|
|
32
7
|
char *slave_path = ttyname(STDIN_FILENO);
|
|
33
8
|
// open implicit attaches a process to a terminal device if:
|
|
34
9
|
// - process has no controlling terminal yet
|
|
35
10
|
// - O_NOCTTY is not set
|
|
36
11
|
close(open(slave_path, O_RDWR));
|
|
37
|
-
#endif
|
|
38
12
|
|
|
39
13
|
char *cwd = argv[1];
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
bool closeFDs = std::stoi(argv[4]);
|
|
43
|
-
char *file = argv[5];
|
|
44
|
-
argv = &argv[5];
|
|
45
|
-
|
|
46
|
-
fcntl(COMM_PIPE_FD, F_SETFD, FD_CLOEXEC);
|
|
14
|
+
char *file = argv[2];
|
|
15
|
+
argv = &argv[2];
|
|
47
16
|
|
|
48
17
|
if (strlen(cwd) && chdir(cwd) == -1) {
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
if (uid != -1 && setuid(uid) == -1) {
|
|
52
|
-
bail(COMM_ERR_SETUID, errno);
|
|
53
|
-
}
|
|
54
|
-
if (gid != -1 && setgid(gid) == -1) {
|
|
55
|
-
bail(COMM_ERR_SETGID, errno);
|
|
56
|
-
}
|
|
57
|
-
if (closeFDs) {
|
|
58
|
-
struct rlimit rlim_ofile;
|
|
59
|
-
getrlimit(RLIMIT_NOFILE, &rlim_ofile);
|
|
60
|
-
for (rlim_t fd = STDERR_FILENO + 1; fd < rlim_ofile.rlim_cur; fd++) {
|
|
61
|
-
if (fd != COMM_PIPE_FD) {
|
|
62
|
-
close(fd);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
18
|
+
_exit(1);
|
|
65
19
|
}
|
|
66
20
|
|
|
67
21
|
execvp(file, argv);
|
|
68
|
-
bail(COMM_ERR_EXEC, errno);
|
|
69
22
|
return 1;
|
|
70
23
|
}
|
package/src/unixTerminal.test.ts
CHANGED
|
@@ -255,75 +255,17 @@ if (process.platform !== 'win32') {
|
|
|
255
255
|
});
|
|
256
256
|
});
|
|
257
257
|
describe('spawn', () => {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
new UnixTerminal('/bin/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
265
|
-
});
|
|
266
|
-
it('should handle chdir() errors', (done) => {
|
|
267
|
-
try {
|
|
268
|
-
new UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
269
|
-
done(new Error('should have failed'));
|
|
270
|
-
} catch (e) {
|
|
271
|
-
assert.strictEqual((e as any).toString(), 'Error: chdir() failed: No such file or directory');
|
|
272
|
-
done();
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
it('should handle setuid() errors', (done) => {
|
|
276
|
-
try {
|
|
277
|
-
new UnixTerminal('/bin/echo', [], { uid: 999999 });
|
|
278
|
-
done(new Error('should have failed'));
|
|
279
|
-
} catch (e) {
|
|
280
|
-
assert.strictEqual((e as any).toString(), 'Error: setuid() failed: Operation not permitted');
|
|
281
|
-
done();
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
if (process.platform === 'linux') {
|
|
285
|
-
it('should not close on exec when closeFDs is not defined', (done) => {
|
|
286
|
-
const data = `
|
|
287
|
-
var pty = require('./lib/index');
|
|
288
|
-
var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log("hello from terminal"), 300);']);
|
|
289
|
-
ptyProcess.on('data', function (data) {
|
|
290
|
-
console.log(data);
|
|
291
|
-
});
|
|
292
|
-
setTimeout(() => null, 500);
|
|
293
|
-
console.log('ready', ptyProcess.pid);
|
|
294
|
-
`;
|
|
295
|
-
const buffer: string[] = [];
|
|
296
|
-
const readFd = fs.openSync(FIXTURES_PATH, 'r');
|
|
297
|
-
const p = cp.spawn('node', ['-e', data], {
|
|
298
|
-
stdio: ['ignore', 'pipe', 'pipe', readFd]
|
|
299
|
-
});
|
|
300
|
-
let sub = '';
|
|
301
|
-
p.stdout!.on('data', (data) => {
|
|
302
|
-
if (!data.toString().indexOf('ready')) {
|
|
303
|
-
sub = data.toString().split(' ')[1].slice(0, -1);
|
|
304
|
-
try {
|
|
305
|
-
fs.statSync(`/proc/${sub}/fd/${readFd}`);
|
|
306
|
-
} catch (_) {
|
|
307
|
-
done('not reachable');
|
|
308
|
-
}
|
|
309
|
-
setTimeout(() => {
|
|
310
|
-
process.kill(parseInt(sub), 'SIGINT'); // SIGINT to child
|
|
311
|
-
p.kill('SIGINT'); // SIGINT to parent
|
|
312
|
-
}, 200);
|
|
313
|
-
} else {
|
|
314
|
-
buffer.push(data.toString().replace(/^\s+|\s+$/g, ''));
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
p.on('close', () => {
|
|
318
|
-
done();
|
|
319
|
-
});
|
|
258
|
+
if (process.platform === 'darwin') {
|
|
259
|
+
it('should return the name of the process', (done) => {
|
|
260
|
+
const term = new UnixTerminal('/bin/echo');
|
|
261
|
+
assert.strictEqual(term.process, '/bin/echo');
|
|
262
|
+
term.on('exit', () => done());
|
|
263
|
+
term.destroy();
|
|
320
264
|
});
|
|
321
|
-
it('should close on exec
|
|
265
|
+
it('should close on exec', (done) => {
|
|
322
266
|
const data = `
|
|
323
267
|
var pty = require('./lib/index');
|
|
324
|
-
var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log("hello from terminal"), 300);']
|
|
325
|
-
closeFDs: true
|
|
326
|
-
});
|
|
268
|
+
var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log("hello from terminal"), 300);']);
|
|
327
269
|
ptyProcess.on('data', function (data) {
|
|
328
270
|
console.log(data);
|
|
329
271
|
});
|
|
@@ -358,6 +300,36 @@ if (process.platform !== 'win32') {
|
|
|
358
300
|
});
|
|
359
301
|
});
|
|
360
302
|
}
|
|
303
|
+
it('should handle exec() errors', (done) => {
|
|
304
|
+
const term = new UnixTerminal('/bin/bogus.exe', []);
|
|
305
|
+
term.on('exit', (code, signal) => {
|
|
306
|
+
assert.strictEqual(code, 1);
|
|
307
|
+
done();
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
it('should handle chdir() errors', (done) => {
|
|
311
|
+
const term = new UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
312
|
+
term.on('exit', (code, signal) => {
|
|
313
|
+
assert.strictEqual(code, 1);
|
|
314
|
+
done();
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
it('should not leak child process', (done) => {
|
|
318
|
+
const count = cp.execSync('ps -ax | grep node | wc -l');
|
|
319
|
+
const term = new UnixTerminal('node', [ '-e', `
|
|
320
|
+
console.log('ready');
|
|
321
|
+
setTimeout(()=>console.log('timeout'), 200);`
|
|
322
|
+
]);
|
|
323
|
+
term.on('data', async (data) => {
|
|
324
|
+
if (data === 'ready\r\n') {
|
|
325
|
+
process.kill(term.pid, 'SIGINT');
|
|
326
|
+
await setTimeout(() => null, 1000);
|
|
327
|
+
const newCount = cp.execSync('ps -ax | grep node | wc -l');
|
|
328
|
+
assert.strictEqual(count.toString(), newCount.toString());
|
|
329
|
+
done();
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
});
|
|
361
333
|
});
|
|
362
334
|
});
|
|
363
335
|
}
|
package/src/unixTerminal.ts
CHANGED
|
@@ -69,7 +69,6 @@ export class UnixTerminal extends Terminal {
|
|
|
69
69
|
this._rows = opt.rows || DEFAULT_ROWS;
|
|
70
70
|
const uid = opt.uid ?? -1;
|
|
71
71
|
const gid = opt.gid ?? -1;
|
|
72
|
-
const closeFDs = opt.closeFDs || false;
|
|
73
72
|
const env: IProcessEnv = assign({}, opt.env);
|
|
74
73
|
|
|
75
74
|
if (opt.env === process.env) {
|
|
@@ -112,7 +111,7 @@ export class UnixTerminal extends Terminal {
|
|
|
112
111
|
};
|
|
113
112
|
|
|
114
113
|
// fork
|
|
115
|
-
const term = pty.fork(file, args, parsedEnv, cwd, this._cols, this._rows, uid, gid, (encoding === 'utf8'),
|
|
114
|
+
const term = pty.fork(file, args, parsedEnv, cwd, this._cols, this._rows, uid, gid, (encoding === 'utf8'), helperPath, onexit);
|
|
116
115
|
|
|
117
116
|
this._socket = new PipeSocket(term.fd);
|
|
118
117
|
if (encoding !== null) {
|
|
@@ -263,6 +262,10 @@ export class UnixTerminal extends Terminal {
|
|
|
263
262
|
* Gets the name of the process.
|
|
264
263
|
*/
|
|
265
264
|
public get process(): string {
|
|
265
|
+
if (process.platform === 'darwin') {
|
|
266
|
+
return pty.process(this._pid) || this._file;
|
|
267
|
+
}
|
|
268
|
+
|
|
266
269
|
return pty.process(this._fd, this._pty) || this._file;
|
|
267
270
|
}
|
|
268
271
|
|
package/typings/node-pty.d.ts
CHANGED
|
@@ -78,17 +78,11 @@ declare module 'node-pty' {
|
|
|
78
78
|
|
|
79
79
|
export interface IPtyForkOptions extends IBasePtyForkOptions {
|
|
80
80
|
/**
|
|
81
|
-
* Security warning: use this option with great caution
|
|
81
|
+
* Security warning: use this option with great caution,
|
|
82
82
|
* as opened file descriptors with higher privileges might leak to the child program.
|
|
83
83
|
*/
|
|
84
84
|
uid?: number;
|
|
85
85
|
gid?: number;
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Close all open file after spawning the child process (UNIX only).
|
|
89
|
-
* Carries a performance penalty on Linux.
|
|
90
|
-
*/
|
|
91
|
-
closeFDs?: boolean;
|
|
92
86
|
}
|
|
93
87
|
|
|
94
88
|
export interface IWindowsPtyForkOptions extends IBasePtyForkOptions {
|