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

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 (265) hide show
  1. package/README.md +4 -5
  2. package/binding.gyp +76 -37
  3. package/lib/conpty_console_list_agent.js +10 -1
  4. package/lib/unixTerminal.js +6 -3
  5. package/lib/utils.js +1 -1
  6. package/lib/windowsPtyAgent.js +62 -95
  7. package/lib/windowsTerminal.js +4 -2
  8. package/package.json +6 -5
  9. package/prebuilds/darwin-arm64/pty.node +0 -0
  10. package/prebuilds/darwin-arm64/spawn-helper +0 -0
  11. package/prebuilds/darwin-x64/pty.node +0 -0
  12. package/prebuilds/darwin-x64/spawn-helper +0 -0
  13. package/prebuilds/linux-arm64/pty.node +0 -0
  14. package/prebuilds/linux-x64/pty.node +0 -0
  15. package/prebuilds/win32-arm64/conpty.node +0 -0
  16. package/prebuilds/win32-arm64/conpty.pdb +0 -0
  17. package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  18. package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  19. package/prebuilds/win32-x64/conpty.node +0 -0
  20. package/prebuilds/win32-x64/conpty.pdb +0 -0
  21. package/prebuilds/win32-x64/conpty_console_list.node +0 -0
  22. package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  23. package/scripts/post-install.js +1 -5
  24. package/src/unix/pty.cc +111 -35
  25. package/src/win/conpty.cc +1 -2
  26. package/typings/node-pty.d.ts +13 -9
  27. package/deps/.editorconfig +0 -2
  28. package/deps/winpty/.drone.yml +0 -17
  29. package/deps/winpty/.gitattributes +0 -19
  30. package/deps/winpty/LICENSE +0 -21
  31. package/deps/winpty/Makefile +0 -166
  32. package/deps/winpty/README.md +0 -151
  33. package/deps/winpty/RELEASES.md +0 -280
  34. package/deps/winpty/VERSION.txt +0 -1
  35. package/deps/winpty/configure +0 -167
  36. package/deps/winpty/misc/BufferResizeTests.cc +0 -90
  37. package/deps/winpty/misc/ChangeScreenBuffer.cc +0 -53
  38. package/deps/winpty/misc/ClearConsole.cc +0 -72
  39. package/deps/winpty/misc/ConinMode.cc +0 -117
  40. package/deps/winpty/misc/ConinMode.ps1 +0 -116
  41. package/deps/winpty/misc/ConoutMode.cc +0 -113
  42. package/deps/winpty/misc/DebugClient.py +0 -42
  43. package/deps/winpty/misc/DebugServer.py +0 -63
  44. package/deps/winpty/misc/DumpLines.py +0 -5
  45. package/deps/winpty/misc/EnableExtendedFlags.txt +0 -46
  46. package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +0 -528
  47. package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +0 -633
  48. package/deps/winpty/misc/Font-Report-June2016/CP932.txt +0 -630
  49. package/deps/winpty/misc/Font-Report-June2016/CP936.txt +0 -630
  50. package/deps/winpty/misc/Font-Report-June2016/CP949.txt +0 -630
  51. package/deps/winpty/misc/Font-Report-June2016/CP950.txt +0 -630
  52. package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +0 -16
  53. package/deps/winpty/misc/Font-Report-June2016/Results.txt +0 -4
  54. package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +0 -144
  55. package/deps/winpty/misc/FontSurvey.cc +0 -100
  56. package/deps/winpty/misc/FormatChar.h +0 -21
  57. package/deps/winpty/misc/FreezePerfTest.cc +0 -62
  58. package/deps/winpty/misc/GetCh.cc +0 -20
  59. package/deps/winpty/misc/GetConsolePos.cc +0 -41
  60. package/deps/winpty/misc/GetFont.cc +0 -261
  61. package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +0 -51
  62. package/deps/winpty/misc/IsNewConsole.cc +0 -87
  63. package/deps/winpty/misc/MouseInputNotes.txt +0 -90
  64. package/deps/winpty/misc/MoveConsoleWindow.cc +0 -34
  65. package/deps/winpty/misc/Notes.txt +0 -219
  66. package/deps/winpty/misc/OSVersion.cc +0 -27
  67. package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +0 -101
  68. package/deps/winpty/misc/ScreenBufferTest.cc +0 -671
  69. package/deps/winpty/misc/ScreenBufferTest2.cc +0 -151
  70. package/deps/winpty/misc/SelectAllTest.cc +0 -45
  71. package/deps/winpty/misc/SetBufferSize.cc +0 -32
  72. package/deps/winpty/misc/SetCursorPos.cc +0 -10
  73. package/deps/winpty/misc/SetFont.cc +0 -145
  74. package/deps/winpty/misc/SetWindowRect.cc +0 -36
  75. package/deps/winpty/misc/ShowArgv.cc +0 -12
  76. package/deps/winpty/misc/ShowConsoleInput.cc +0 -40
  77. package/deps/winpty/misc/Spew.py +0 -5
  78. package/deps/winpty/misc/TestUtil.cc +0 -172
  79. package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +0 -102
  80. package/deps/winpty/misc/UnicodeWideTest1.cc +0 -246
  81. package/deps/winpty/misc/UnicodeWideTest2.cc +0 -130
  82. package/deps/winpty/misc/UnixEcho.cc +0 -89
  83. package/deps/winpty/misc/Utf16Echo.cc +0 -46
  84. package/deps/winpty/misc/VeryLargeRead.cc +0 -122
  85. package/deps/winpty/misc/VkEscapeTest.cc +0 -56
  86. package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +0 -52
  87. package/deps/winpty/misc/Win10WrapTest1.cc +0 -57
  88. package/deps/winpty/misc/Win10WrapTest2.cc +0 -30
  89. package/deps/winpty/misc/Win32Echo1.cc +0 -26
  90. package/deps/winpty/misc/Win32Echo2.cc +0 -19
  91. package/deps/winpty/misc/Win32Test1.cc +0 -46
  92. package/deps/winpty/misc/Win32Test2.cc +0 -70
  93. package/deps/winpty/misc/Win32Test3.cc +0 -78
  94. package/deps/winpty/misc/Win32Write1.cc +0 -44
  95. package/deps/winpty/misc/WindowsBugCrashReader.cc +0 -27
  96. package/deps/winpty/misc/WriteConsole.cc +0 -106
  97. package/deps/winpty/misc/build32.sh +0 -9
  98. package/deps/winpty/misc/build64.sh +0 -9
  99. package/deps/winpty/misc/color-test.sh +0 -212
  100. package/deps/winpty/misc/font-notes.txt +0 -300
  101. package/deps/winpty/misc/winbug-15048.cc +0 -201
  102. package/deps/winpty/ship/build-pty4j-libpty.bat +0 -36
  103. package/deps/winpty/ship/common_ship.py +0 -53
  104. package/deps/winpty/ship/make_msvc_package.py +0 -165
  105. package/deps/winpty/ship/ship.py +0 -108
  106. package/deps/winpty/src/agent/Agent.cc +0 -613
  107. package/deps/winpty/src/agent/Agent.h +0 -103
  108. package/deps/winpty/src/agent/AgentCreateDesktop.cc +0 -84
  109. package/deps/winpty/src/agent/AgentCreateDesktop.h +0 -28
  110. package/deps/winpty/src/agent/ConsoleFont.cc +0 -632
  111. package/deps/winpty/src/agent/ConsoleFont.h +0 -28
  112. package/deps/winpty/src/agent/ConsoleInput.cc +0 -852
  113. package/deps/winpty/src/agent/ConsoleInput.h +0 -109
  114. package/deps/winpty/src/agent/ConsoleInputReencoding.cc +0 -121
  115. package/deps/winpty/src/agent/ConsoleInputReencoding.h +0 -36
  116. package/deps/winpty/src/agent/ConsoleLine.cc +0 -152
  117. package/deps/winpty/src/agent/ConsoleLine.h +0 -41
  118. package/deps/winpty/src/agent/Coord.h +0 -87
  119. package/deps/winpty/src/agent/DebugShowInput.cc +0 -239
  120. package/deps/winpty/src/agent/DebugShowInput.h +0 -32
  121. package/deps/winpty/src/agent/DefaultInputMap.cc +0 -422
  122. package/deps/winpty/src/agent/DefaultInputMap.h +0 -28
  123. package/deps/winpty/src/agent/DsrSender.h +0 -30
  124. package/deps/winpty/src/agent/EventLoop.cc +0 -99
  125. package/deps/winpty/src/agent/EventLoop.h +0 -47
  126. package/deps/winpty/src/agent/InputMap.cc +0 -246
  127. package/deps/winpty/src/agent/InputMap.h +0 -114
  128. package/deps/winpty/src/agent/LargeConsoleRead.cc +0 -71
  129. package/deps/winpty/src/agent/LargeConsoleRead.h +0 -68
  130. package/deps/winpty/src/agent/NamedPipe.cc +0 -378
  131. package/deps/winpty/src/agent/NamedPipe.h +0 -125
  132. package/deps/winpty/src/agent/Scraper.cc +0 -699
  133. package/deps/winpty/src/agent/Scraper.h +0 -103
  134. package/deps/winpty/src/agent/SimplePool.h +0 -75
  135. package/deps/winpty/src/agent/SmallRect.h +0 -143
  136. package/deps/winpty/src/agent/Terminal.cc +0 -535
  137. package/deps/winpty/src/agent/Terminal.h +0 -69
  138. package/deps/winpty/src/agent/UnicodeEncoding.h +0 -157
  139. package/deps/winpty/src/agent/UnicodeEncodingTest.cc +0 -189
  140. package/deps/winpty/src/agent/Win32Console.cc +0 -107
  141. package/deps/winpty/src/agent/Win32Console.h +0 -67
  142. package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +0 -193
  143. package/deps/winpty/src/agent/Win32ConsoleBuffer.h +0 -99
  144. package/deps/winpty/src/agent/main.cc +0 -114
  145. package/deps/winpty/src/agent/subdir.mk +0 -61
  146. package/deps/winpty/src/configurations.gypi +0 -60
  147. package/deps/winpty/src/debugserver/DebugServer.cc +0 -117
  148. package/deps/winpty/src/debugserver/subdir.mk +0 -41
  149. package/deps/winpty/src/include/winpty.h +0 -242
  150. package/deps/winpty/src/include/winpty_constants.h +0 -131
  151. package/deps/winpty/src/libwinpty/AgentLocation.cc +0 -75
  152. package/deps/winpty/src/libwinpty/AgentLocation.h +0 -28
  153. package/deps/winpty/src/libwinpty/LibWinptyException.h +0 -54
  154. package/deps/winpty/src/libwinpty/WinptyInternal.h +0 -72
  155. package/deps/winpty/src/libwinpty/subdir.mk +0 -46
  156. package/deps/winpty/src/libwinpty/winpty.cc +0 -970
  157. package/deps/winpty/src/shared/AgentMsg.h +0 -38
  158. package/deps/winpty/src/shared/BackgroundDesktop.cc +0 -122
  159. package/deps/winpty/src/shared/BackgroundDesktop.h +0 -73
  160. package/deps/winpty/src/shared/Buffer.cc +0 -103
  161. package/deps/winpty/src/shared/Buffer.h +0 -102
  162. package/deps/winpty/src/shared/DebugClient.cc +0 -187
  163. package/deps/winpty/src/shared/DebugClient.h +0 -38
  164. package/deps/winpty/src/shared/GenRandom.cc +0 -138
  165. package/deps/winpty/src/shared/GenRandom.h +0 -55
  166. package/deps/winpty/src/shared/GetCommitHash.bat +0 -13
  167. package/deps/winpty/src/shared/Mutex.h +0 -54
  168. package/deps/winpty/src/shared/OsModule.h +0 -63
  169. package/deps/winpty/src/shared/OwnedHandle.cc +0 -36
  170. package/deps/winpty/src/shared/OwnedHandle.h +0 -45
  171. package/deps/winpty/src/shared/PrecompiledHeader.h +0 -43
  172. package/deps/winpty/src/shared/StringBuilder.h +0 -227
  173. package/deps/winpty/src/shared/StringBuilderTest.cc +0 -114
  174. package/deps/winpty/src/shared/StringUtil.cc +0 -55
  175. package/deps/winpty/src/shared/StringUtil.h +0 -80
  176. package/deps/winpty/src/shared/TimeMeasurement.h +0 -63
  177. package/deps/winpty/src/shared/UnixCtrlChars.h +0 -45
  178. package/deps/winpty/src/shared/UpdateGenVersion.bat +0 -20
  179. package/deps/winpty/src/shared/WindowsSecurity.cc +0 -460
  180. package/deps/winpty/src/shared/WindowsSecurity.h +0 -104
  181. package/deps/winpty/src/shared/WindowsVersion.cc +0 -252
  182. package/deps/winpty/src/shared/WindowsVersion.h +0 -29
  183. package/deps/winpty/src/shared/WinptyAssert.cc +0 -55
  184. package/deps/winpty/src/shared/WinptyAssert.h +0 -64
  185. package/deps/winpty/src/shared/WinptyException.cc +0 -57
  186. package/deps/winpty/src/shared/WinptyException.h +0 -43
  187. package/deps/winpty/src/shared/WinptyVersion.cc +0 -42
  188. package/deps/winpty/src/shared/WinptyVersion.h +0 -27
  189. package/deps/winpty/src/shared/winpty_snprintf.h +0 -99
  190. package/deps/winpty/src/subdir.mk +0 -5
  191. package/deps/winpty/src/tests/subdir.mk +0 -28
  192. package/deps/winpty/src/tests/trivial_test.cc +0 -158
  193. package/deps/winpty/src/unix-adapter/InputHandler.cc +0 -114
  194. package/deps/winpty/src/unix-adapter/InputHandler.h +0 -56
  195. package/deps/winpty/src/unix-adapter/OutputHandler.cc +0 -80
  196. package/deps/winpty/src/unix-adapter/OutputHandler.h +0 -53
  197. package/deps/winpty/src/unix-adapter/Util.cc +0 -86
  198. package/deps/winpty/src/unix-adapter/Util.h +0 -31
  199. package/deps/winpty/src/unix-adapter/WakeupFd.cc +0 -70
  200. package/deps/winpty/src/unix-adapter/WakeupFd.h +0 -42
  201. package/deps/winpty/src/unix-adapter/main.cc +0 -729
  202. package/deps/winpty/src/unix-adapter/subdir.mk +0 -41
  203. package/deps/winpty/src/winpty.gyp +0 -234
  204. package/deps/winpty/vcbuild.bat +0 -83
  205. package/lib/conpty_console_list_agent.js.map +0 -1
  206. package/lib/eventEmitter2.js.map +0 -1
  207. package/lib/eventEmitter2.test.js +0 -30
  208. package/lib/eventEmitter2.test.js.map +0 -1
  209. package/lib/index.js.map +0 -1
  210. package/lib/interfaces.js.map +0 -1
  211. package/lib/shared/conout.js.map +0 -1
  212. package/lib/terminal.js.map +0 -1
  213. package/lib/terminal.test.js +0 -139
  214. package/lib/terminal.test.js.map +0 -1
  215. package/lib/testUtils.test.js +0 -28
  216. package/lib/testUtils.test.js.map +0 -1
  217. package/lib/types.js.map +0 -1
  218. package/lib/unixTerminal.js.map +0 -1
  219. package/lib/unixTerminal.test.js +0 -351
  220. package/lib/unixTerminal.test.js.map +0 -1
  221. package/lib/utils.js.map +0 -1
  222. package/lib/windowsConoutConnection.js.map +0 -1
  223. package/lib/windowsPtyAgent.js.map +0 -1
  224. package/lib/windowsPtyAgent.test.js +0 -90
  225. package/lib/windowsPtyAgent.test.js.map +0 -1
  226. package/lib/windowsTerminal.js.map +0 -1
  227. package/lib/windowsTerminal.test.js +0 -219
  228. package/lib/windowsTerminal.test.js.map +0 -1
  229. package/lib/worker/conoutSocketWorker.js.map +0 -1
  230. package/prebuilds/win32-arm64/pty.node +0 -0
  231. package/prebuilds/win32-arm64/pty.pdb +0 -0
  232. package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
  233. package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
  234. package/prebuilds/win32-arm64/winpty.dll +0 -0
  235. package/prebuilds/win32-arm64/winpty.pdb +0 -0
  236. package/prebuilds/win32-x64/pty.node +0 -0
  237. package/prebuilds/win32-x64/pty.pdb +0 -0
  238. package/prebuilds/win32-x64/winpty-agent.exe +0 -0
  239. package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
  240. package/prebuilds/win32-x64/winpty.dll +0 -0
  241. package/prebuilds/win32-x64/winpty.pdb +0 -0
  242. package/scripts/gen-compile-commands.js +0 -8
  243. package/scripts/increment-version.js +0 -54
  244. package/src/conpty_console_list_agent.ts +0 -15
  245. package/src/eventEmitter2.test.ts +0 -30
  246. package/src/eventEmitter2.ts +0 -48
  247. package/src/index.ts +0 -52
  248. package/src/interfaces.ts +0 -130
  249. package/src/native.d.ts +0 -54
  250. package/src/shared/conout.ts +0 -15
  251. package/src/terminal.test.ts +0 -119
  252. package/src/terminal.ts +0 -211
  253. package/src/testUtils.test.ts +0 -23
  254. package/src/tsconfig.json +0 -22
  255. package/src/types.ts +0 -15
  256. package/src/unixTerminal.test.ts +0 -367
  257. package/src/unixTerminal.ts +0 -388
  258. package/src/utils.ts +0 -29
  259. package/src/win/winpty.cc +0 -333
  260. package/src/windowsConoutConnection.ts +0 -82
  261. package/src/windowsPtyAgent.test.ts +0 -94
  262. package/src/windowsPtyAgent.ts +0 -321
  263. package/src/windowsTerminal.test.ts +0 -229
  264. package/src/windowsTerminal.ts +0 -203
  265. 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?)"