node-pty 1.2.0-beta.1 → 1.2.0-beta.10

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.
Files changed (264) hide show
  1. package/README.md +3 -5
  2. package/binding.gyp +76 -37
  3. package/lib/unixTerminal.js +6 -3
  4. package/lib/utils.js +1 -1
  5. package/lib/windowsPtyAgent.js +32 -95
  6. package/lib/windowsTerminal.js +2 -2
  7. package/package.json +6 -5
  8. package/prebuilds/darwin-arm64/pty.node +0 -0
  9. package/prebuilds/darwin-arm64/spawn-helper +0 -0
  10. package/prebuilds/darwin-x64/pty.node +0 -0
  11. package/prebuilds/darwin-x64/spawn-helper +0 -0
  12. package/prebuilds/linux-arm64/pty.node +0 -0
  13. package/prebuilds/linux-x64/pty.node +0 -0
  14. package/prebuilds/win32-arm64/conpty.node +0 -0
  15. package/prebuilds/win32-arm64/conpty.pdb +0 -0
  16. package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  17. package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  18. package/prebuilds/win32-x64/conpty.node +0 -0
  19. package/prebuilds/win32-x64/conpty.pdb +0 -0
  20. package/prebuilds/win32-x64/conpty_console_list.node +0 -0
  21. package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  22. package/scripts/post-install.js +1 -5
  23. package/src/unix/pty.cc +111 -35
  24. package/src/win/conpty.cc +1 -2
  25. package/typings/node-pty.d.ts +13 -9
  26. package/deps/.editorconfig +0 -2
  27. package/deps/winpty/.drone.yml +0 -17
  28. package/deps/winpty/.gitattributes +0 -19
  29. package/deps/winpty/LICENSE +0 -21
  30. package/deps/winpty/Makefile +0 -166
  31. package/deps/winpty/README.md +0 -151
  32. package/deps/winpty/RELEASES.md +0 -280
  33. package/deps/winpty/VERSION.txt +0 -1
  34. package/deps/winpty/configure +0 -167
  35. package/deps/winpty/misc/BufferResizeTests.cc +0 -90
  36. package/deps/winpty/misc/ChangeScreenBuffer.cc +0 -53
  37. package/deps/winpty/misc/ClearConsole.cc +0 -72
  38. package/deps/winpty/misc/ConinMode.cc +0 -117
  39. package/deps/winpty/misc/ConinMode.ps1 +0 -116
  40. package/deps/winpty/misc/ConoutMode.cc +0 -113
  41. package/deps/winpty/misc/DebugClient.py +0 -42
  42. package/deps/winpty/misc/DebugServer.py +0 -63
  43. package/deps/winpty/misc/DumpLines.py +0 -5
  44. package/deps/winpty/misc/EnableExtendedFlags.txt +0 -46
  45. package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +0 -528
  46. package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +0 -633
  47. package/deps/winpty/misc/Font-Report-June2016/CP932.txt +0 -630
  48. package/deps/winpty/misc/Font-Report-June2016/CP936.txt +0 -630
  49. package/deps/winpty/misc/Font-Report-June2016/CP949.txt +0 -630
  50. package/deps/winpty/misc/Font-Report-June2016/CP950.txt +0 -630
  51. package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +0 -16
  52. package/deps/winpty/misc/Font-Report-June2016/Results.txt +0 -4
  53. package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +0 -144
  54. package/deps/winpty/misc/FontSurvey.cc +0 -100
  55. package/deps/winpty/misc/FormatChar.h +0 -21
  56. package/deps/winpty/misc/FreezePerfTest.cc +0 -62
  57. package/deps/winpty/misc/GetCh.cc +0 -20
  58. package/deps/winpty/misc/GetConsolePos.cc +0 -41
  59. package/deps/winpty/misc/GetFont.cc +0 -261
  60. package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +0 -51
  61. package/deps/winpty/misc/IsNewConsole.cc +0 -87
  62. package/deps/winpty/misc/MouseInputNotes.txt +0 -90
  63. package/deps/winpty/misc/MoveConsoleWindow.cc +0 -34
  64. package/deps/winpty/misc/Notes.txt +0 -219
  65. package/deps/winpty/misc/OSVersion.cc +0 -27
  66. package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +0 -101
  67. package/deps/winpty/misc/ScreenBufferTest.cc +0 -671
  68. package/deps/winpty/misc/ScreenBufferTest2.cc +0 -151
  69. package/deps/winpty/misc/SelectAllTest.cc +0 -45
  70. package/deps/winpty/misc/SetBufferSize.cc +0 -32
  71. package/deps/winpty/misc/SetCursorPos.cc +0 -10
  72. package/deps/winpty/misc/SetFont.cc +0 -145
  73. package/deps/winpty/misc/SetWindowRect.cc +0 -36
  74. package/deps/winpty/misc/ShowArgv.cc +0 -12
  75. package/deps/winpty/misc/ShowConsoleInput.cc +0 -40
  76. package/deps/winpty/misc/Spew.py +0 -5
  77. package/deps/winpty/misc/TestUtil.cc +0 -172
  78. package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +0 -102
  79. package/deps/winpty/misc/UnicodeWideTest1.cc +0 -246
  80. package/deps/winpty/misc/UnicodeWideTest2.cc +0 -130
  81. package/deps/winpty/misc/UnixEcho.cc +0 -89
  82. package/deps/winpty/misc/Utf16Echo.cc +0 -46
  83. package/deps/winpty/misc/VeryLargeRead.cc +0 -122
  84. package/deps/winpty/misc/VkEscapeTest.cc +0 -56
  85. package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +0 -52
  86. package/deps/winpty/misc/Win10WrapTest1.cc +0 -57
  87. package/deps/winpty/misc/Win10WrapTest2.cc +0 -30
  88. package/deps/winpty/misc/Win32Echo1.cc +0 -26
  89. package/deps/winpty/misc/Win32Echo2.cc +0 -19
  90. package/deps/winpty/misc/Win32Test1.cc +0 -46
  91. package/deps/winpty/misc/Win32Test2.cc +0 -70
  92. package/deps/winpty/misc/Win32Test3.cc +0 -78
  93. package/deps/winpty/misc/Win32Write1.cc +0 -44
  94. package/deps/winpty/misc/WindowsBugCrashReader.cc +0 -27
  95. package/deps/winpty/misc/WriteConsole.cc +0 -106
  96. package/deps/winpty/misc/build32.sh +0 -9
  97. package/deps/winpty/misc/build64.sh +0 -9
  98. package/deps/winpty/misc/color-test.sh +0 -212
  99. package/deps/winpty/misc/font-notes.txt +0 -300
  100. package/deps/winpty/misc/winbug-15048.cc +0 -201
  101. package/deps/winpty/ship/build-pty4j-libpty.bat +0 -36
  102. package/deps/winpty/ship/common_ship.py +0 -53
  103. package/deps/winpty/ship/make_msvc_package.py +0 -165
  104. package/deps/winpty/ship/ship.py +0 -108
  105. package/deps/winpty/src/agent/Agent.cc +0 -613
  106. package/deps/winpty/src/agent/Agent.h +0 -103
  107. package/deps/winpty/src/agent/AgentCreateDesktop.cc +0 -84
  108. package/deps/winpty/src/agent/AgentCreateDesktop.h +0 -28
  109. package/deps/winpty/src/agent/ConsoleFont.cc +0 -632
  110. package/deps/winpty/src/agent/ConsoleFont.h +0 -28
  111. package/deps/winpty/src/agent/ConsoleInput.cc +0 -852
  112. package/deps/winpty/src/agent/ConsoleInput.h +0 -109
  113. package/deps/winpty/src/agent/ConsoleInputReencoding.cc +0 -121
  114. package/deps/winpty/src/agent/ConsoleInputReencoding.h +0 -36
  115. package/deps/winpty/src/agent/ConsoleLine.cc +0 -152
  116. package/deps/winpty/src/agent/ConsoleLine.h +0 -41
  117. package/deps/winpty/src/agent/Coord.h +0 -87
  118. package/deps/winpty/src/agent/DebugShowInput.cc +0 -239
  119. package/deps/winpty/src/agent/DebugShowInput.h +0 -32
  120. package/deps/winpty/src/agent/DefaultInputMap.cc +0 -422
  121. package/deps/winpty/src/agent/DefaultInputMap.h +0 -28
  122. package/deps/winpty/src/agent/DsrSender.h +0 -30
  123. package/deps/winpty/src/agent/EventLoop.cc +0 -99
  124. package/deps/winpty/src/agent/EventLoop.h +0 -47
  125. package/deps/winpty/src/agent/InputMap.cc +0 -246
  126. package/deps/winpty/src/agent/InputMap.h +0 -114
  127. package/deps/winpty/src/agent/LargeConsoleRead.cc +0 -71
  128. package/deps/winpty/src/agent/LargeConsoleRead.h +0 -68
  129. package/deps/winpty/src/agent/NamedPipe.cc +0 -378
  130. package/deps/winpty/src/agent/NamedPipe.h +0 -125
  131. package/deps/winpty/src/agent/Scraper.cc +0 -699
  132. package/deps/winpty/src/agent/Scraper.h +0 -103
  133. package/deps/winpty/src/agent/SimplePool.h +0 -75
  134. package/deps/winpty/src/agent/SmallRect.h +0 -143
  135. package/deps/winpty/src/agent/Terminal.cc +0 -535
  136. package/deps/winpty/src/agent/Terminal.h +0 -69
  137. package/deps/winpty/src/agent/UnicodeEncoding.h +0 -157
  138. package/deps/winpty/src/agent/UnicodeEncodingTest.cc +0 -189
  139. package/deps/winpty/src/agent/Win32Console.cc +0 -107
  140. package/deps/winpty/src/agent/Win32Console.h +0 -67
  141. package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +0 -193
  142. package/deps/winpty/src/agent/Win32ConsoleBuffer.h +0 -99
  143. package/deps/winpty/src/agent/main.cc +0 -114
  144. package/deps/winpty/src/agent/subdir.mk +0 -61
  145. package/deps/winpty/src/configurations.gypi +0 -60
  146. package/deps/winpty/src/debugserver/DebugServer.cc +0 -117
  147. package/deps/winpty/src/debugserver/subdir.mk +0 -41
  148. package/deps/winpty/src/include/winpty.h +0 -242
  149. package/deps/winpty/src/include/winpty_constants.h +0 -131
  150. package/deps/winpty/src/libwinpty/AgentLocation.cc +0 -75
  151. package/deps/winpty/src/libwinpty/AgentLocation.h +0 -28
  152. package/deps/winpty/src/libwinpty/LibWinptyException.h +0 -54
  153. package/deps/winpty/src/libwinpty/WinptyInternal.h +0 -72
  154. package/deps/winpty/src/libwinpty/subdir.mk +0 -46
  155. package/deps/winpty/src/libwinpty/winpty.cc +0 -970
  156. package/deps/winpty/src/shared/AgentMsg.h +0 -38
  157. package/deps/winpty/src/shared/BackgroundDesktop.cc +0 -122
  158. package/deps/winpty/src/shared/BackgroundDesktop.h +0 -73
  159. package/deps/winpty/src/shared/Buffer.cc +0 -103
  160. package/deps/winpty/src/shared/Buffer.h +0 -102
  161. package/deps/winpty/src/shared/DebugClient.cc +0 -187
  162. package/deps/winpty/src/shared/DebugClient.h +0 -38
  163. package/deps/winpty/src/shared/GenRandom.cc +0 -138
  164. package/deps/winpty/src/shared/GenRandom.h +0 -55
  165. package/deps/winpty/src/shared/GetCommitHash.bat +0 -13
  166. package/deps/winpty/src/shared/Mutex.h +0 -54
  167. package/deps/winpty/src/shared/OsModule.h +0 -63
  168. package/deps/winpty/src/shared/OwnedHandle.cc +0 -36
  169. package/deps/winpty/src/shared/OwnedHandle.h +0 -45
  170. package/deps/winpty/src/shared/PrecompiledHeader.h +0 -43
  171. package/deps/winpty/src/shared/StringBuilder.h +0 -227
  172. package/deps/winpty/src/shared/StringBuilderTest.cc +0 -114
  173. package/deps/winpty/src/shared/StringUtil.cc +0 -55
  174. package/deps/winpty/src/shared/StringUtil.h +0 -80
  175. package/deps/winpty/src/shared/TimeMeasurement.h +0 -63
  176. package/deps/winpty/src/shared/UnixCtrlChars.h +0 -45
  177. package/deps/winpty/src/shared/UpdateGenVersion.bat +0 -20
  178. package/deps/winpty/src/shared/WindowsSecurity.cc +0 -460
  179. package/deps/winpty/src/shared/WindowsSecurity.h +0 -104
  180. package/deps/winpty/src/shared/WindowsVersion.cc +0 -252
  181. package/deps/winpty/src/shared/WindowsVersion.h +0 -29
  182. package/deps/winpty/src/shared/WinptyAssert.cc +0 -55
  183. package/deps/winpty/src/shared/WinptyAssert.h +0 -64
  184. package/deps/winpty/src/shared/WinptyException.cc +0 -57
  185. package/deps/winpty/src/shared/WinptyException.h +0 -43
  186. package/deps/winpty/src/shared/WinptyVersion.cc +0 -42
  187. package/deps/winpty/src/shared/WinptyVersion.h +0 -27
  188. package/deps/winpty/src/shared/winpty_snprintf.h +0 -99
  189. package/deps/winpty/src/subdir.mk +0 -5
  190. package/deps/winpty/src/tests/subdir.mk +0 -28
  191. package/deps/winpty/src/tests/trivial_test.cc +0 -158
  192. package/deps/winpty/src/unix-adapter/InputHandler.cc +0 -114
  193. package/deps/winpty/src/unix-adapter/InputHandler.h +0 -56
  194. package/deps/winpty/src/unix-adapter/OutputHandler.cc +0 -80
  195. package/deps/winpty/src/unix-adapter/OutputHandler.h +0 -53
  196. package/deps/winpty/src/unix-adapter/Util.cc +0 -86
  197. package/deps/winpty/src/unix-adapter/Util.h +0 -31
  198. package/deps/winpty/src/unix-adapter/WakeupFd.cc +0 -70
  199. package/deps/winpty/src/unix-adapter/WakeupFd.h +0 -42
  200. package/deps/winpty/src/unix-adapter/main.cc +0 -729
  201. package/deps/winpty/src/unix-adapter/subdir.mk +0 -41
  202. package/deps/winpty/src/winpty.gyp +0 -234
  203. package/deps/winpty/vcbuild.bat +0 -83
  204. package/lib/conpty_console_list_agent.js.map +0 -1
  205. package/lib/eventEmitter2.js.map +0 -1
  206. package/lib/eventEmitter2.test.js +0 -30
  207. package/lib/eventEmitter2.test.js.map +0 -1
  208. package/lib/index.js.map +0 -1
  209. package/lib/interfaces.js.map +0 -1
  210. package/lib/shared/conout.js.map +0 -1
  211. package/lib/terminal.js.map +0 -1
  212. package/lib/terminal.test.js +0 -139
  213. package/lib/terminal.test.js.map +0 -1
  214. package/lib/testUtils.test.js +0 -28
  215. package/lib/testUtils.test.js.map +0 -1
  216. package/lib/types.js.map +0 -1
  217. package/lib/unixTerminal.js.map +0 -1
  218. package/lib/unixTerminal.test.js +0 -351
  219. package/lib/unixTerminal.test.js.map +0 -1
  220. package/lib/utils.js.map +0 -1
  221. package/lib/windowsConoutConnection.js.map +0 -1
  222. package/lib/windowsPtyAgent.js.map +0 -1
  223. package/lib/windowsPtyAgent.test.js +0 -90
  224. package/lib/windowsPtyAgent.test.js.map +0 -1
  225. package/lib/windowsTerminal.js.map +0 -1
  226. package/lib/windowsTerminal.test.js +0 -219
  227. package/lib/windowsTerminal.test.js.map +0 -1
  228. package/lib/worker/conoutSocketWorker.js.map +0 -1
  229. package/prebuilds/win32-arm64/pty.node +0 -0
  230. package/prebuilds/win32-arm64/pty.pdb +0 -0
  231. package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
  232. package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
  233. package/prebuilds/win32-arm64/winpty.dll +0 -0
  234. package/prebuilds/win32-arm64/winpty.pdb +0 -0
  235. package/prebuilds/win32-x64/pty.node +0 -0
  236. package/prebuilds/win32-x64/pty.pdb +0 -0
  237. package/prebuilds/win32-x64/winpty-agent.exe +0 -0
  238. package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
  239. package/prebuilds/win32-x64/winpty.dll +0 -0
  240. package/prebuilds/win32-x64/winpty.pdb +0 -0
  241. package/scripts/gen-compile-commands.js +0 -8
  242. package/scripts/increment-version.js +0 -54
  243. package/src/conpty_console_list_agent.ts +0 -15
  244. package/src/eventEmitter2.test.ts +0 -30
  245. package/src/eventEmitter2.ts +0 -48
  246. package/src/index.ts +0 -52
  247. package/src/interfaces.ts +0 -130
  248. package/src/native.d.ts +0 -54
  249. package/src/shared/conout.ts +0 -15
  250. package/src/terminal.test.ts +0 -119
  251. package/src/terminal.ts +0 -211
  252. package/src/testUtils.test.ts +0 -23
  253. package/src/tsconfig.json +0 -22
  254. package/src/types.ts +0 -15
  255. package/src/unixTerminal.test.ts +0 -367
  256. package/src/unixTerminal.ts +0 -388
  257. package/src/utils.ts +0 -29
  258. package/src/win/winpty.cc +0 -333
  259. package/src/windowsConoutConnection.ts +0 -82
  260. package/src/windowsPtyAgent.test.ts +0 -94
  261. package/src/windowsPtyAgent.ts +0 -321
  262. package/src/windowsTerminal.test.ts +0 -229
  263. package/src/windowsTerminal.ts +0 -203
  264. package/src/worker/conoutSocketWorker.ts +0 -22
package/src/unix/pty.cc CHANGED
@@ -37,6 +37,8 @@
37
37
  /* http://www.gnu.org/software/gnulib/manual/html_node/forkpty.html */
38
38
  #if defined(__linux__)
39
39
  #include <pty.h>
40
+ #include <dirent.h>
41
+ #include <sys/syscall.h>
40
42
  #elif defined(__APPLE__)
41
43
  #include <util.h>
42
44
  #elif defined(__FreeBSD__)
@@ -110,6 +112,40 @@ struct ExitEvent {
110
112
  int exit_code = 0, signal_code = 0;
111
113
  };
112
114
 
115
+ #if defined(__linux__)
116
+
117
+ static int
118
+ SetCloseOnExec(int fd) {
119
+ int flags = fcntl(fd, F_GETFD, 0);
120
+ if (flags == -1)
121
+ return flags;
122
+ if (flags & FD_CLOEXEC)
123
+ return 0;
124
+ return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
125
+ }
126
+
127
+ /**
128
+ * Close all file descriptors >= 3 to prevent FD leakage to child processes.
129
+ * Uses close_range() syscall on Linux 5.9+, falls back to /proc/self/fd iteration.
130
+ */
131
+ static void
132
+ pty_close_inherited_fds() {
133
+ // Try close_range() first (Linux 5.9+, glibc 2.34+)
134
+ #if defined(SYS_close_range) && defined(CLOSE_RANGE_CLOEXEC)
135
+ if (syscall(SYS_close_range, 3, ~0U, CLOSE_RANGE_CLOEXEC) == 0) {
136
+ return;
137
+ }
138
+ #endif
139
+
140
+ int fd;
141
+ // Set the CLOEXEC flag on all open descriptors. Unconditionally try the first
142
+ // 16 file descriptors. After that, bail out after the first error.
143
+ for (fd = 3; ; fd++)
144
+ if (SetCloseOnExec(fd) && fd > 15)
145
+ break;
146
+ }
147
+ #endif
148
+
113
149
  void SetupExitCallback(Napi::Env env, Napi::Function cb, pid_t pid) {
114
150
  std::thread *th = new std::thread;
115
151
  // Don't use Napi::AsyncWorker which is limited by UV_THREADPOOL_SIZE.
@@ -243,7 +279,7 @@ pty_posix_spawn(char** argv, char** env,
243
279
  const struct winsize *winp,
244
280
  int* master,
245
281
  pid_t* pid,
246
- int* err);
282
+ std::string* err);
247
283
  #endif
248
284
 
249
285
  struct DelBuf {
@@ -352,7 +388,7 @@ Napi::Value PtyFork(const Napi::CallbackInfo& info) {
352
388
  std::string helper_path = info[9].As<Napi::String>();
353
389
 
354
390
  pid_t pid;
355
- int master;
391
+ int master = -1;
356
392
  #if defined(__APPLE__)
357
393
  int argc = argv_.Length();
358
394
  int argl = argc + 4;
@@ -367,10 +403,13 @@ Napi::Value PtyFork(const Napi::CallbackInfo& info) {
367
403
  argv[i + 3] = strdup(arg.c_str());
368
404
  }
369
405
 
370
- int err = -1;
406
+ std::string err;
371
407
  pty_posix_spawn(argv, env, term, &winp, &master, &pid, &err);
372
- if (err != 0) {
373
- throw Napi::Error::New(napiEnv, std::string("pty_posix_spawn failed with error: ") + std::to_string(err) + " (" + strerror(err) + ")");
408
+ if (!err.empty()) {
409
+ if (master != -1) {
410
+ close(master);
411
+ }
412
+ throw Napi::Error::New(napiEnv, err);
374
413
  }
375
414
  if (pty_nonblock(master) == -1) {
376
415
  throw Napi::Error::New(napiEnv, "Could not set master fd to nonblocking.");
@@ -433,6 +472,9 @@ Napi::Value PtyFork(const Napi::CallbackInfo& info) {
433
472
  }
434
473
  }
435
474
 
475
+ // Close inherited FDs to prevent leaking pty master FDs to child
476
+ pty_close_inherited_fds();
477
+
436
478
  {
437
479
  char **old = environ;
438
480
  environ = env;
@@ -504,11 +546,13 @@ Napi::Value PtyResize(const Napi::CallbackInfo& info) {
504
546
  Napi::Env env(info.Env());
505
547
  Napi::HandleScope scope(env);
506
548
 
507
- if (info.Length() != 3 ||
549
+ if (info.Length() != 5 ||
508
550
  !info[0].IsNumber() ||
509
551
  !info[1].IsNumber() ||
510
- !info[2].IsNumber()) {
511
- throw Napi::Error::New(env, "Usage: pty.resize(fd, cols, rows)");
552
+ !info[2].IsNumber() ||
553
+ !info[3].IsNumber() ||
554
+ !info[4].IsNumber()) {
555
+ throw Napi::Error::New(env, "Usage: pty.resize(fd, cols, rows, xPixel, yPixel)");
512
556
  }
513
557
 
514
558
  int fd = info[0].As<Napi::Number>().Int32Value();
@@ -516,8 +560,8 @@ Napi::Value PtyResize(const Napi::CallbackInfo& info) {
516
560
  struct winsize winp;
517
561
  winp.ws_col = info[1].As<Napi::Number>().Int32Value();
518
562
  winp.ws_row = info[2].As<Napi::Number>().Int32Value();
519
- winp.ws_xpixel = 0;
520
- winp.ws_ypixel = 0;
563
+ winp.ws_xpixel = info[3].As<Napi::Number>().Int32Value();
564
+ winp.ws_ypixel = info[4].As<Napi::Number>().Int32Value();
521
565
 
522
566
  if (ioctl(fd, TIOCSWINSZ, &winp) == -1) {
523
567
  switch (errno) {
@@ -684,15 +728,26 @@ pty_getproc(int fd, char *tty) {
684
728
  #endif
685
729
 
686
730
  #if defined(__APPLE__)
731
+ static std::string format_error(const char* func, int err_code) {
732
+ char buf[256];
733
+ snprintf(buf, sizeof(buf), "%s: %s", func, strerror(err_code));
734
+ return buf;
735
+ }
736
+
687
737
  static void
688
738
  pty_posix_spawn(char** argv, char** env,
689
739
  const struct termios *termp,
690
740
  const struct winsize *winp,
691
741
  int* master,
692
742
  pid_t* pid,
693
- int* err) {
743
+ std::string* err) {
694
744
  int low_fds[3];
695
745
  size_t count = 0;
746
+ int res = 0;
747
+ int slave = -1;
748
+ char slave_pty_name[128];
749
+ int spawn_err;
750
+ sigset_t signal_set;
696
751
 
697
752
  for (; count < 3; count++) {
698
753
  low_fds[count] = posix_openpt(O_RDWR);
@@ -704,82 +759,103 @@ pty_posix_spawn(char** argv, char** env,
704
759
  POSIX_SPAWN_SETSIGDEF |
705
760
  POSIX_SPAWN_SETSIGMASK |
706
761
  POSIX_SPAWN_SETSID;
762
+
763
+ posix_spawn_file_actions_t acts;
764
+ posix_spawn_file_actions_init(&acts);
765
+
766
+ posix_spawnattr_t attrs;
767
+ posix_spawnattr_init(&attrs);
768
+
707
769
  *master = posix_openpt(O_RDWR);
708
770
  if (*master == -1) {
709
- return;
771
+ *err = format_error("posix_openpt failed", errno);
772
+ goto done;
710
773
  }
711
774
 
712
- int res = grantpt(*master) || unlockpt(*master);
775
+ res = grantpt(*master);
713
776
  if (res == -1) {
714
- return;
777
+ *err = format_error("grantpt failed", errno);
778
+ goto done;
779
+ }
780
+
781
+ res = unlockpt(*master);
782
+ if (res == -1) {
783
+ *err = format_error("unlockpt failed", errno);
784
+ goto done;
715
785
  }
716
786
 
717
787
  // Use TIOCPTYGNAME instead of ptsname() to avoid threading problems.
718
- int slave;
719
- char slave_pty_name[128];
720
788
  res = ioctl(*master, TIOCPTYGNAME, slave_pty_name);
721
789
  if (res == -1) {
722
- return;
790
+ *err = format_error("ioctl(TIOCPTYGNAME) failed", errno);
791
+ goto done;
723
792
  }
724
793
 
725
794
  slave = open(slave_pty_name, O_RDWR | O_NOCTTY);
726
795
  if (slave == -1) {
727
- return;
796
+ *err = format_error("open slave pty failed", errno);
797
+ goto done;
728
798
  }
729
799
 
730
800
  if (termp) {
731
801
  res = tcsetattr(slave, TCSANOW, termp);
732
802
  if (res == -1) {
733
- return;
803
+ *err = format_error("tcsetattr failed", errno);
804
+ goto done;
734
805
  };
735
806
  }
736
807
 
737
808
  if (winp) {
738
809
  res = ioctl(slave, TIOCSWINSZ, winp);
739
810
  if (res == -1) {
740
- return;
811
+ *err = format_error("ioctl(TIOCSWINSZ) failed", errno);
812
+ goto done;
741
813
  }
742
814
  }
743
815
 
744
- posix_spawn_file_actions_t acts;
745
- posix_spawn_file_actions_init(&acts);
746
816
  posix_spawn_file_actions_adddup2(&acts, slave, STDIN_FILENO);
747
817
  posix_spawn_file_actions_adddup2(&acts, slave, STDOUT_FILENO);
748
818
  posix_spawn_file_actions_adddup2(&acts, slave, STDERR_FILENO);
749
819
  posix_spawn_file_actions_addclose(&acts, slave);
750
820
  posix_spawn_file_actions_addclose(&acts, *master);
751
821
 
752
- posix_spawnattr_t attrs;
753
- posix_spawnattr_init(&attrs);
754
- *err = posix_spawnattr_setflags(&attrs, flags);
755
- if (*err != 0) {
822
+ spawn_err = posix_spawnattr_setflags(&attrs, flags);
823
+ if (spawn_err != 0) {
824
+ *err = format_error("posix_spawnattr_setflags failed", spawn_err);
756
825
  goto done;
757
826
  }
758
827
 
759
- sigset_t signal_set;
760
828
  /* Reset all signal the child to their default behavior */
761
829
  sigfillset(&signal_set);
762
- *err = posix_spawnattr_setsigdefault(&attrs, &signal_set);
763
- if (*err != 0) {
830
+ spawn_err = posix_spawnattr_setsigdefault(&attrs, &signal_set);
831
+ if (spawn_err != 0) {
832
+ *err = format_error("posix_spawnattr_setsigdefault failed", spawn_err);
764
833
  goto done;
765
834
  }
766
835
 
767
836
  /* Reset the signal mask for all signals */
768
837
  sigemptyset(&signal_set);
769
- *err = posix_spawnattr_setsigmask(&attrs, &signal_set);
770
- if (*err != 0) {
838
+ spawn_err = posix_spawnattr_setsigmask(&attrs, &signal_set);
839
+ if (spawn_err != 0) {
840
+ *err = format_error("posix_spawnattr_setsigmask failed", spawn_err);
771
841
  goto done;
772
842
  }
773
843
 
774
844
  do
775
- *err = posix_spawn(pid, argv[0], &acts, &attrs, argv, env);
776
- while (*err == EINTR);
845
+ spawn_err = posix_spawn(pid, argv[0], &acts, &attrs, argv, env);
846
+ while (spawn_err == EINTR);
847
+ if (spawn_err != 0) {
848
+ *err = format_error("posix_spawn failed", spawn_err);
849
+ }
777
850
  done:
778
851
  posix_spawn_file_actions_destroy(&acts);
779
852
  posix_spawnattr_destroy(&attrs);
853
+ if (slave != -1) {
854
+ close(slave);
855
+ }
780
856
 
781
- for (; count > 0; count--) {
782
- close(low_fds[count]);
857
+ for (size_t i = 0; i <= count; i++) {
858
+ close(low_fds[i]);
783
859
  }
784
860
  }
785
861
  #endif
package/src/win/conpty.cc CHANGED
@@ -230,7 +230,6 @@ HRESULT CreateNamedPipesAndPseudoConsole(const Napi::CallbackInfo& info,
230
230
  {
231
231
  // Failed to find CreatePseudoConsole in kernel32. This is likely because
232
232
  // the user is not running a build of Windows that supports that API.
233
- // We should fall back to winpty in this case.
234
233
  return HRESULT_FROM_WIN32(GetLastError());
235
234
  }
236
235
  } else {
@@ -238,7 +237,7 @@ HRESULT CreateNamedPipesAndPseudoConsole(const Napi::CallbackInfo& info,
238
237
  }
239
238
 
240
239
  // Failed to find kernel32. This is realy unlikely - honestly no idea how
241
- // this is even possible to hit. But if it does happen, fall back to winpty.
240
+ // this is even possible to hit.
242
241
  return HRESULT_FROM_WIN32(GetLastError());
243
242
  }
244
243
 
@@ -86,13 +86,14 @@ declare module 'node-pty' {
86
86
  }
87
87
 
88
88
  export interface IWindowsPtyForkOptions extends IBasePtyForkOptions {
89
- /**
90
- * Whether to use the ConPTY system on Windows. When this is not set, ConPTY will be used when
91
- * the Windows build number is >= 18309 (instead of winpty). Note that ConPTY is available from
92
- * build 17134 but is too unstable to enable by default.
93
- *
94
- * This setting does nothing on non-Windows.
95
- */
89
+ /**
90
+ * Whether to use the ConPTY system on Windows. When this is not set, ConPTY will be used when
91
+ * the Windows build number is >= 18309 (instead of winpty). Note that ConPTY is available from
92
+ * build 17134 but is too unstable to enable by default.
93
+ *
94
+ * @deprecated This option is ignored and will be removed in a future version.
95
+ * https://github.com/microsoft/node-pty/issues/871
96
+ */
96
97
  useConpty?: boolean;
97
98
 
98
99
  /**
@@ -111,7 +112,7 @@ declare module 'node-pty' {
111
112
  }
112
113
 
113
114
  /**
114
- * An interface representing a pseudoterminal, on Windows this is emulated via the winpty library.
115
+ * An interface representing a pseudoterminal.
115
116
  */
116
117
  export interface IPty {
117
118
  /**
@@ -158,8 +159,11 @@ declare module 'node-pty' {
158
159
  * Resizes the dimensions of the pty.
159
160
  * @param columns The number of columns to use.
160
161
  * @param rows The number of rows to use.
162
+ * @param pixelSize Optional pixel dimensions of the pty. On Unix, this sets the `ws_xpixel`
163
+ * and `ws_ypixel` fields of the `winsize` struct. Applications running in the pty can read
164
+ * these values via the `TIOCGWINSZ` ioctl. This parameter is ignored on Windows.
161
165
  */
162
- resize(columns: number, rows: number): void;
166
+ resize(columns: number, rows: number, pixelSize?: { width: number, height: number }): void;
163
167
 
164
168
  /**
165
169
  * Clears the pty's internal representation of its buffer. This is a no-op
@@ -1,2 +0,0 @@
1
- # Have editor config ignore this directory
2
- root = true
@@ -1,17 +0,0 @@
1
- # Build configure for https://www.tea-ci.org (fork of Drone CI with Msys2 support)
2
- build:
3
- image: teaci/msys$$arch
4
- pull: true
5
- shell: msys$$arch
6
- commands:
7
- - pacman -S --needed --noconfirm --noprogressbar mingw-w64-cross-gcc mingw-w64-cross-crt-git
8
- - ./configure
9
- - make
10
- - make tests
11
- - build/trivial_test.exe
12
- - mintty --log - --exec build/winpty.exe cmd /c ver | grep Windows
13
-
14
- matrix:
15
- arch:
16
- - 64
17
- - 32
@@ -1,19 +0,0 @@
1
- * text=auto
2
- *.bat text eol=crlf
3
- *.c text
4
- *.cc text
5
- *.gyp text
6
- *.gypi text
7
- *.h text
8
- *.ps1 text eol=crlf
9
- *.rst text
10
- *.sh text
11
- *.txt text
12
- .gitignore text
13
- .gitattributes text
14
- Makefile text
15
- configure text
16
-
17
- *.sh eol=lf
18
- configure eol=lf
19
- VERSION.txt eol=lf
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2011-2016 Ryan Prichard
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to
7
- deal in the Software without restriction, including without limitation the
8
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9
- sell copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
- IN THE SOFTWARE.
@@ -1,166 +0,0 @@
1
- # Copyright (c) 2011-2015 Ryan Prichard
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to
5
- # deal in the Software without restriction, including without limitation the
6
- # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
- # sell copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
- # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
- # IN THE SOFTWARE.
20
-
21
- # Use make -n to see the actual command-lines make would run.
22
-
23
- # The default "make install" prefix is /usr/local. Pass PREFIX=<path> on the
24
- # command-line to override the default.
25
-
26
- .SECONDEXPANSION :
27
-
28
- .PHONY : default
29
- default : all
30
-
31
- PREFIX := /usr/local
32
- UNIX_ADAPTER_EXE := winpty.exe
33
- MINGW_ENABLE_CXX11_FLAG := -std=c++11
34
- USE_PCH := 1
35
-
36
- COMMON_CXXFLAGS :=
37
- UNIX_CXXFLAGS :=
38
- MINGW_CXXFLAGS :=
39
- MINGW_LDFLAGS :=
40
- UNIX_LDFLAGS :=
41
-
42
- # Include config.mk but complain if it hasn't been created yet.
43
- ifeq "$(wildcard config.mk)" ""
44
- $(error config.mk does not exist. Please run ./configure)
45
- endif
46
- include config.mk
47
-
48
- COMMON_CXXFLAGS += \
49
- -MMD -Wall \
50
- -DUNICODE \
51
- -D_UNICODE \
52
- -D_WIN32_WINNT=0x0501 \
53
- -Ibuild/gen
54
-
55
- UNIX_CXXFLAGS += \
56
- $(COMMON_CXXFLAGS)
57
-
58
- MINGW_CXXFLAGS += \
59
- $(COMMON_CXXFLAGS) \
60
- -O2 \
61
- $(MINGW_ENABLE_CXX11_FLAG)
62
-
63
- MINGW_LDFLAGS += -static -static-libgcc -static-libstdc++
64
- UNIX_LDFLAGS += $(UNIX_LDFLAGS_STATIC)
65
-
66
- ifeq "$(USE_PCH)" "1"
67
- MINGW_CXXFLAGS += -include build/mingw/PrecompiledHeader.h
68
- PCH_DEP := build/mingw/PrecompiledHeader.h.gch
69
- else
70
- PCH_DEP :=
71
- endif
72
-
73
- build/gen/GenVersion.h : VERSION.txt $(COMMIT_HASH_DEP) | $$(@D)/.mkdir
74
- $(info Updating build/gen/GenVersion.h)
75
- @echo "const char GenVersion_Version[] = \"$(shell cat VERSION.txt | tr -d '\r\n')\";" > build/gen/GenVersion.h
76
- @echo "const char GenVersion_Commit[] = \"$(COMMIT_HASH)\";" >> build/gen/GenVersion.h
77
-
78
- build/mingw/PrecompiledHeader.h : src/shared/PrecompiledHeader.h | $$(@D)/.mkdir
79
- $(info Copying $< to $@)
80
- @cp $< $@
81
-
82
- build/mingw/PrecompiledHeader.h.gch : build/mingw/PrecompiledHeader.h | $$(@D)/.mkdir
83
- $(info Compiling $<)
84
- @$(MINGW_CXX) $(MINGW_CXXFLAGS) -c -o $@ $<
85
-
86
- -include build/mingw/PrecompiledHeader.h.d
87
-
88
- define def_unix_target
89
- build/$1/%.o : src/%.cc | $$$$(@D)/.mkdir
90
- $$(info Compiling $$<)
91
- @$$(UNIX_CXX) $$(UNIX_CXXFLAGS) $2 -I src/include -c -o $$@ $$<
92
- endef
93
-
94
- define def_mingw_target
95
- build/$1/%.o : src/%.cc $$(PCH_DEP) | $$$$(@D)/.mkdir
96
- $$(info Compiling $$<)
97
- @$$(MINGW_CXX) $$(MINGW_CXXFLAGS) $2 -I src/include -c -o $$@ $$<
98
- endef
99
-
100
- include src/subdir.mk
101
-
102
- .PHONY : all
103
- all : $(ALL_TARGETS)
104
-
105
- .PHONY : tests
106
- tests : $(TEST_PROGRAMS)
107
-
108
- .PHONY : install-bin
109
- install-bin : all
110
- mkdir -p $(PREFIX)/bin
111
- install -m 755 -p -s build/$(UNIX_ADAPTER_EXE) $(PREFIX)/bin
112
- install -m 755 -p -s build/winpty.dll $(PREFIX)/bin
113
- install -m 755 -p -s build/winpty-agent.exe $(PREFIX)/bin
114
-
115
- .PHONY : install-debugserver
116
- install-debugserver : all
117
- mkdir -p $(PREFIX)/bin
118
- install -m 755 -p -s build/winpty-debugserver.exe $(PREFIX)/bin
119
-
120
- .PHONY : install-lib
121
- install-lib : all
122
- mkdir -p $(PREFIX)/lib
123
- install -m 644 -p build/winpty.lib $(PREFIX)/lib
124
-
125
- .PHONY : install-doc
126
- install-doc :
127
- mkdir -p $(PREFIX)/share/doc/winpty
128
- install -m 644 -p LICENSE $(PREFIX)/share/doc/winpty
129
- install -m 644 -p README.md $(PREFIX)/share/doc/winpty
130
- install -m 644 -p RELEASES.md $(PREFIX)/share/doc/winpty
131
-
132
- .PHONY : install-include
133
- install-include :
134
- mkdir -p $(PREFIX)/include/winpty
135
- install -m 644 -p src/include/winpty.h $(PREFIX)/include/winpty
136
- install -m 644 -p src/include/winpty_constants.h $(PREFIX)/include/winpty
137
-
138
- .PHONY : install
139
- install : \
140
- install-bin \
141
- install-debugserver \
142
- install-lib \
143
- install-doc \
144
- install-include
145
-
146
- .PHONY : clean
147
- clean :
148
- rm -fr build
149
-
150
- .PHONY : clean-msvc
151
- clean-msvc :
152
- rm -fr src/Default src/Release src/.vs src/gen
153
- rm -f src/*.vcxproj src/*.vcxproj.filters src/*.sln src/*.sdf
154
-
155
- .PHONY : distclean
156
- distclean : clean
157
- rm -f config.mk
158
-
159
- .PRECIOUS : %.mkdir
160
- %.mkdir :
161
- $(info Creating directory $(dir $@))
162
- @mkdir -p $(dir $@)
163
- @touch $@
164
-
165
- src/%.h :
166
- @echo "Missing header file $@ (stale dependency file?)"