ser-mingw.c revision 1.11 1 /* Serial interface for local (hardwired) serial ports on Windows systems
2
3 Copyright (C) 2006-2024 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "serial.h"
21 #include "ser-base.h"
22 #include "ser-tcp.h"
23
24 #include <windows.h>
25 #include <conio.h>
26
27 #include <fcntl.h>
28 #include <unistd.h>
29 #include <sys/types.h>
30
31 #include "command.h"
32 #include "gdbsupport/buildargv.h"
33
34 struct ser_windows_state
35 {
36 int in_progress;
37 OVERLAPPED ov;
38 DWORD lastCommMask;
39 HANDLE except_event;
40 };
41
42 /* CancelIo is not available for Windows 95 OS, so we need to use
43 LoadLibrary/GetProcAddress to avoid a startup failure. */
44 #define CancelIo dyn_CancelIo
45 typedef BOOL WINAPI (CancelIo_ftype) (HANDLE);
46 static CancelIo_ftype *CancelIo;
47
48 /* Open up a real live device for serial I/O. */
49
50 static void
51 ser_windows_open (struct serial *scb, const char *name)
52 {
53 HANDLE h;
54 struct ser_windows_state *state;
55 COMMTIMEOUTS timeouts;
56
57 h = CreateFile (name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
58 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
59 if (h == INVALID_HANDLE_VALUE)
60 {
61 std::string msg = string_printf(_("could not open file: %s"),
62 name);
63 throw_winerror_with_name (msg.c_str (), GetLastError ());
64 }
65
66 scb->fd = _open_osfhandle ((intptr_t) h, O_RDWR);
67 if (scb->fd < 0)
68 error (_("could not get underlying file descriptor"));
69
70 if (!SetCommMask (h, EV_RXCHAR))
71 throw_winerror_with_name (_("error calling SetCommMask"),
72 GetLastError ());
73
74 timeouts.ReadIntervalTimeout = MAXDWORD;
75 timeouts.ReadTotalTimeoutConstant = 0;
76 timeouts.ReadTotalTimeoutMultiplier = 0;
77 timeouts.WriteTotalTimeoutConstant = 0;
78 timeouts.WriteTotalTimeoutMultiplier = 0;
79 if (!SetCommTimeouts (h, &timeouts))
80 throw_winerror_with_name (_("error calling SetCommTimeouts"),
81 GetLastError ());
82
83 state = XCNEW (struct ser_windows_state);
84 scb->state = state;
85
86 /* Create a manual reset event to watch the input buffer. */
87 state->ov.hEvent = CreateEvent (0, TRUE, FALSE, 0);
88
89 /* Create a (currently unused) handle to record exceptions. */
90 state->except_event = CreateEvent (0, TRUE, FALSE, 0);
91 }
92
93 /* Wait for the output to drain away, as opposed to flushing (discarding)
94 it. */
95
96 static int
97 ser_windows_drain_output (struct serial *scb)
98 {
99 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
100
101 return (FlushFileBuffers (h) != 0) ? 0 : -1;
102 }
103
104 static int
105 ser_windows_flush_output (struct serial *scb)
106 {
107 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
108
109 return (PurgeComm (h, PURGE_TXCLEAR) != 0) ? 0 : -1;
110 }
111
112 static int
113 ser_windows_flush_input (struct serial *scb)
114 {
115 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
116
117 return (PurgeComm (h, PURGE_RXCLEAR) != 0) ? 0 : -1;
118 }
119
120 static void
121 ser_windows_send_break (struct serial *scb)
122 {
123 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
124
125 if (SetCommBreak (h) == 0)
126 throw_winerror_with_name ("error calling SetCommBreak",
127 GetLastError ());
128
129 /* Delay for 250 milliseconds. */
130 Sleep (250);
131
132 if (ClearCommBreak (h) == 0)
133 throw_winerror_with_name ("error calling ClearCommBreak",
134 GetLastError ());
135 }
136
137 static void
138 ser_windows_raw (struct serial *scb)
139 {
140 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
141 DCB state;
142
143 if (GetCommState (h, &state) == 0)
144 return;
145
146 state.fOutxCtsFlow = FALSE;
147 state.fOutxDsrFlow = FALSE;
148 state.fDtrControl = DTR_CONTROL_ENABLE;
149 state.fDsrSensitivity = FALSE;
150 state.fOutX = FALSE;
151 state.fInX = FALSE;
152 state.fNull = FALSE;
153 state.fAbortOnError = FALSE;
154 state.ByteSize = 8;
155
156 if (SetCommState (h, &state) == 0)
157 warning (_("SetCommState failed"));
158 }
159
160 static int
161 ser_windows_setstopbits (struct serial *scb, int num)
162 {
163 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
164 DCB state;
165
166 if (GetCommState (h, &state) == 0)
167 return -1;
168
169 switch (num)
170 {
171 case SERIAL_1_STOPBITS:
172 state.StopBits = ONESTOPBIT;
173 break;
174 case SERIAL_1_AND_A_HALF_STOPBITS:
175 state.StopBits = ONE5STOPBITS;
176 break;
177 case SERIAL_2_STOPBITS:
178 state.StopBits = TWOSTOPBITS;
179 break;
180 default:
181 return 1;
182 }
183
184 return (SetCommState (h, &state) != 0) ? 0 : -1;
185 }
186
187 /* Implement the "setparity" serial_ops callback. */
188
189 static int
190 ser_windows_setparity (struct serial *scb, int parity)
191 {
192 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
193 DCB state;
194
195 if (GetCommState (h, &state) == 0)
196 return -1;
197
198 switch (parity)
199 {
200 case GDBPARITY_NONE:
201 state.Parity = NOPARITY;
202 state.fParity = FALSE;
203 break;
204 case GDBPARITY_ODD:
205 state.Parity = ODDPARITY;
206 state.fParity = TRUE;
207 break;
208 case GDBPARITY_EVEN:
209 state.Parity = EVENPARITY;
210 state.fParity = TRUE;
211 break;
212 default:
213 internal_warning ("Incorrect parity value: %d", parity);
214 return -1;
215 }
216
217 return (SetCommState (h, &state) != 0) ? 0 : -1;
218 }
219
220 static void
221 ser_windows_setbaudrate (struct serial *scb, int rate)
222 {
223 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
224 DCB state;
225
226 if (GetCommState (h, &state) == 0)
227 throw_winerror_with_name ("call to GetCommState failed", GetLastError ());
228
229 state.BaudRate = rate;
230
231 if (SetCommState (h, &state) == 0)
232 throw_winerror_with_name ("call to SetCommState failed", GetLastError ());
233 }
234
235 static void
236 ser_windows_close (struct serial *scb)
237 {
238 struct ser_windows_state *state;
239
240 /* Stop any pending selects. On Windows 95 OS, CancelIo function does
241 not exist. In that case, it can be replaced by a call to CloseHandle,
242 but this is not necessary here as we do close the Windows handle
243 by calling close (scb->fd) below. */
244 if (CancelIo)
245 CancelIo ((HANDLE) _get_osfhandle (scb->fd));
246 state = (struct ser_windows_state *) scb->state;
247 CloseHandle (state->ov.hEvent);
248 CloseHandle (state->except_event);
249
250 if (scb->fd < 0)
251 return;
252
253 close (scb->fd);
254 scb->fd = -1;
255
256 xfree (scb->state);
257 }
258
259 static void
260 ser_windows_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
261 {
262 struct ser_windows_state *state;
263 COMSTAT status;
264 DWORD errors;
265 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
266
267 state = (struct ser_windows_state *) scb->state;
268
269 *except = state->except_event;
270 *read = state->ov.hEvent;
271
272 if (state->in_progress)
273 return;
274
275 /* Reset the mask - we are only interested in any characters which
276 arrive after this point, not characters which might have arrived
277 and already been read. */
278
279 /* This really, really shouldn't be necessary - just the second one.
280 But otherwise an internal flag for EV_RXCHAR does not get
281 cleared, and we get a duplicated event, if the last batch
282 of characters included at least two arriving close together. */
283 if (!SetCommMask (h, 0))
284 warning (_("ser_windows_wait_handle: reseting mask failed"));
285
286 if (!SetCommMask (h, EV_RXCHAR))
287 warning (_("ser_windows_wait_handle: reseting mask failed (2)"));
288
289 /* There's a potential race condition here; we must check cbInQue
290 and not wait if that's nonzero. */
291
292 ClearCommError (h, &errors, &status);
293 if (status.cbInQue > 0)
294 {
295 SetEvent (state->ov.hEvent);
296 return;
297 }
298
299 state->in_progress = 1;
300 ResetEvent (state->ov.hEvent);
301 state->lastCommMask = -2;
302 if (WaitCommEvent (h, &state->lastCommMask, &state->ov))
303 {
304 gdb_assert (state->lastCommMask & EV_RXCHAR);
305 SetEvent (state->ov.hEvent);
306 }
307 else
308 gdb_assert (GetLastError () == ERROR_IO_PENDING);
309 }
310
311 static int
312 ser_windows_read_prim (struct serial *scb, size_t count)
313 {
314 struct ser_windows_state *state;
315 OVERLAPPED ov;
316 DWORD bytes_read;
317 HANDLE h;
318
319 state = (struct ser_windows_state *) scb->state;
320 if (state->in_progress)
321 {
322 WaitForSingleObject (state->ov.hEvent, INFINITE);
323 state->in_progress = 0;
324 ResetEvent (state->ov.hEvent);
325 }
326
327 memset (&ov, 0, sizeof (OVERLAPPED));
328 ov.hEvent = CreateEvent (0, FALSE, FALSE, 0);
329 h = (HANDLE) _get_osfhandle (scb->fd);
330
331 if (!ReadFile (h, scb->buf, /* count */ 1, &bytes_read, &ov))
332 {
333 if (GetLastError () != ERROR_IO_PENDING
334 || !GetOverlappedResult (h, &ov, &bytes_read, TRUE))
335 {
336 ULONGEST err = GetLastError ();
337 CloseHandle (ov.hEvent);
338 throw_winerror_with_name (_("error while reading"), err);
339 }
340 }
341
342 CloseHandle (ov.hEvent);
343 return bytes_read;
344 }
345
346 static int
347 ser_windows_write_prim (struct serial *scb, const void *buf, size_t len)
348 {
349 OVERLAPPED ov;
350 DWORD bytes_written;
351 HANDLE h;
352
353 memset (&ov, 0, sizeof (OVERLAPPED));
354 ov.hEvent = CreateEvent (0, FALSE, FALSE, 0);
355 h = (HANDLE) _get_osfhandle (scb->fd);
356 if (!WriteFile (h, buf, len, &bytes_written, &ov))
357 {
358 if (GetLastError () != ERROR_IO_PENDING
359 || !GetOverlappedResult (h, &ov, &bytes_written, TRUE))
360 throw_winerror_with_name ("error while writing", GetLastError ());
361 }
362
363 CloseHandle (ov.hEvent);
364 return bytes_written;
365 }
366
367 /* On Windows, gdb_select is implemented using WaitForMulpleObjects.
368 A "select thread" is created for each file descriptor. These
369 threads looks for activity on the corresponding descriptor, using
370 whatever techniques are appropriate for the descriptor type. When
371 that activity occurs, the thread signals an appropriate event,
372 which wakes up WaitForMultipleObjects.
373
374 Each select thread is in one of two states: stopped or started.
375 Select threads begin in the stopped state. When gdb_select is
376 called, threads corresponding to the descriptors of interest are
377 started by calling a wait_handle function. Each thread that
378 notices activity signals the appropriate event and then reenters
379 the stopped state. Before gdb_select returns it calls the
380 wait_handle_done functions, which return the threads to the stopped
381 state. */
382
383 enum select_thread_state {
384 STS_STARTED,
385 STS_STOPPED
386 };
387
388 struct ser_console_state
389 {
390 /* Signaled by the select thread to indicate that data is available
391 on the file descriptor. */
392 HANDLE read_event;
393 /* Signaled by the select thread to indicate that an exception has
394 occurred on the file descriptor. */
395 HANDLE except_event;
396 /* Signaled by the select thread to indicate that it has entered the
397 started state. HAVE_STARTED and HAVE_STOPPED are never signaled
398 simultaneously. */
399 HANDLE have_started;
400 /* Signaled by the select thread to indicate that it has stopped,
401 either because data is available (and READ_EVENT is signaled),
402 because an exception has occurred (and EXCEPT_EVENT is signaled),
403 or because STOP_SELECT was signaled. */
404 HANDLE have_stopped;
405
406 /* Signaled by the main program to tell the select thread to enter
407 the started state. */
408 HANDLE start_select;
409 /* Signaled by the main program to tell the select thread to enter
410 the stopped state. */
411 HANDLE stop_select;
412 /* Signaled by the main program to tell the select thread to
413 exit. */
414 HANDLE exit_select;
415
416 /* The handle for the select thread. */
417 HANDLE thread;
418 /* The state of the select thread. This field is only accessed in
419 the main program, never by the select thread itself. */
420 enum select_thread_state thread_state;
421 };
422
423 /* Called by a select thread to enter the stopped state. This
424 function does not return until the thread has re-entered the
425 started state. */
426 static void
427 select_thread_wait (struct ser_console_state *state)
428 {
429 HANDLE wait_events[2];
430
431 /* There are two things that can wake us up: a request that we enter
432 the started state, or that we exit this thread. */
433 wait_events[0] = state->start_select;
434 wait_events[1] = state->exit_select;
435 if (WaitForMultipleObjects (2, wait_events, FALSE, INFINITE)
436 != WAIT_OBJECT_0)
437 /* Either the EXIT_SELECT event was signaled (requesting that the
438 thread exit) or an error has occurred. In either case, we exit
439 the thread. */
440 ExitThread (0);
441
442 /* We are now in the started state. */
443 SetEvent (state->have_started);
444 }
445
446 typedef DWORD WINAPI (*thread_fn_type)(void *);
447
448 /* Create a new select thread for SCB executing THREAD_FN. The STATE
449 will be filled in by this function before return. */
450 static void
451 create_select_thread (thread_fn_type thread_fn,
452 struct serial *scb,
453 struct ser_console_state *state)
454 {
455 DWORD threadId;
456
457 /* Create all of the events. These are all auto-reset events. */
458 state->read_event = CreateEvent (NULL, FALSE, FALSE, NULL);
459 state->except_event = CreateEvent (NULL, FALSE, FALSE, NULL);
460 state->have_started = CreateEvent (NULL, FALSE, FALSE, NULL);
461 state->have_stopped = CreateEvent (NULL, FALSE, FALSE, NULL);
462 state->start_select = CreateEvent (NULL, FALSE, FALSE, NULL);
463 state->stop_select = CreateEvent (NULL, FALSE, FALSE, NULL);
464 state->exit_select = CreateEvent (NULL, FALSE, FALSE, NULL);
465
466 state->thread = CreateThread (NULL, 0, thread_fn, scb, 0, &threadId);
467 /* The thread begins in the stopped state. */
468 state->thread_state = STS_STOPPED;
469 }
470
471 /* Destroy the select thread indicated by STATE. */
472 static void
473 destroy_select_thread (struct ser_console_state *state)
474 {
475 /* Ask the thread to exit. */
476 SetEvent (state->exit_select);
477 /* Wait until it does. */
478 WaitForSingleObject (state->thread, INFINITE);
479
480 /* Destroy the events. */
481 CloseHandle (state->read_event);
482 CloseHandle (state->except_event);
483 CloseHandle (state->have_started);
484 CloseHandle (state->have_stopped);
485 CloseHandle (state->start_select);
486 CloseHandle (state->stop_select);
487 CloseHandle (state->exit_select);
488 }
489
490 /* Called by gdb_select to start the select thread indicated by STATE.
491 This function does not return until the thread has started. */
492 static void
493 start_select_thread (struct ser_console_state *state)
494 {
495 /* Ask the thread to start. */
496 SetEvent (state->start_select);
497 /* Wait until it does. */
498 WaitForSingleObject (state->have_started, INFINITE);
499 /* The thread is now started. */
500 state->thread_state = STS_STARTED;
501 }
502
503 /* Called by gdb_select to stop the select thread indicated by STATE.
504 This function does not return until the thread has stopped. */
505 static void
506 stop_select_thread (struct ser_console_state *state)
507 {
508 /* If the thread is already in the stopped state, we have nothing to
509 do. Some of the wait_handle functions avoid calling
510 start_select_thread if they notice activity on the relevant file
511 descriptors. The wait_handle_done functions still call
512 stop_select_thread -- but it is already stopped. */
513 if (state->thread_state != STS_STARTED)
514 return;
515 /* Ask the thread to stop. */
516 SetEvent (state->stop_select);
517 /* Wait until it does. */
518 WaitForSingleObject (state->have_stopped, INFINITE);
519 /* The thread is now stopped. */
520 state->thread_state = STS_STOPPED;
521 }
522
523 static DWORD WINAPI
524 console_select_thread (void *arg)
525 {
526 struct serial *scb = (struct serial *) arg;
527 struct ser_console_state *state;
528 int event_index;
529 HANDLE h;
530
531 state = (struct ser_console_state *) scb->state;
532 h = (HANDLE) _get_osfhandle (scb->fd);
533
534 while (1)
535 {
536 HANDLE wait_events[2];
537 INPUT_RECORD record;
538 DWORD n_records;
539
540 select_thread_wait (state);
541
542 while (1)
543 {
544 wait_events[0] = state->stop_select;
545 wait_events[1] = h;
546
547 event_index = WaitForMultipleObjects (2, wait_events,
548 FALSE, INFINITE);
549
550 if (event_index == WAIT_OBJECT_0
551 || WaitForSingleObject (state->stop_select, 0) == WAIT_OBJECT_0)
552 break;
553
554 if (event_index != WAIT_OBJECT_0 + 1)
555 {
556 /* Wait must have failed; assume an error has occurred, e.g.
557 the handle has been closed. */
558 SetEvent (state->except_event);
559 break;
560 }
561
562 /* We've got a pending event on the console. See if it's
563 of interest. */
564 if (!PeekConsoleInput (h, &record, 1, &n_records) || n_records != 1)
565 {
566 /* Something went wrong. Maybe the console is gone. */
567 SetEvent (state->except_event);
568 break;
569 }
570
571 if (record.EventType == KEY_EVENT && record.Event.KeyEvent.bKeyDown)
572 {
573 WORD keycode = record.Event.KeyEvent.wVirtualKeyCode;
574
575 /* Ignore events containing only control keys. We must
576 recognize "enhanced" keys which we are interested in
577 reading via getch, if they do not map to ASCII. But we
578 do not want to report input available for e.g. the
579 control key alone. */
580
581 if (record.Event.KeyEvent.uChar.AsciiChar != 0
582 || keycode == VK_PRIOR
583 || keycode == VK_NEXT
584 || keycode == VK_END
585 || keycode == VK_HOME
586 || keycode == VK_LEFT
587 || keycode == VK_UP
588 || keycode == VK_RIGHT
589 || keycode == VK_DOWN
590 || keycode == VK_INSERT
591 || keycode == VK_DELETE)
592 {
593 /* This is really a keypress. */
594 SetEvent (state->read_event);
595 break;
596 }
597 }
598 else if (record.EventType == MOUSE_EVENT)
599 {
600 SetEvent (state->read_event);
601 break;
602 }
603
604 /* Otherwise discard it and wait again. */
605 ReadConsoleInput (h, &record, 1, &n_records);
606 }
607
608 SetEvent(state->have_stopped);
609 }
610 return 0;
611 }
612
613 static int
614 fd_is_pipe (int fd)
615 {
616 if (PeekNamedPipe ((HANDLE) _get_osfhandle (fd), NULL, 0, NULL, NULL, NULL))
617 return 1;
618 else
619 return 0;
620 }
621
622 static int
623 fd_is_file (int fd)
624 {
625 if (GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_DISK)
626 return 1;
627 else
628 return 0;
629 }
630
631 static DWORD WINAPI
632 pipe_select_thread (void *arg)
633 {
634 struct serial *scb = (struct serial *) arg;
635 struct ser_console_state *state;
636 HANDLE h;
637
638 state = (struct ser_console_state *) scb->state;
639 h = (HANDLE) _get_osfhandle (scb->fd);
640
641 while (1)
642 {
643 DWORD n_avail;
644
645 select_thread_wait (state);
646
647 /* Wait for something to happen on the pipe. */
648 while (1)
649 {
650 if (!PeekNamedPipe (h, NULL, 0, NULL, &n_avail, NULL))
651 {
652 SetEvent (state->except_event);
653 break;
654 }
655
656 if (n_avail > 0)
657 {
658 SetEvent (state->read_event);
659 break;
660 }
661
662 /* Delay 10ms before checking again, but allow the stop
663 event to wake us. */
664 if (WaitForSingleObject (state->stop_select, 10) == WAIT_OBJECT_0)
665 break;
666 }
667
668 SetEvent (state->have_stopped);
669 }
670 return 0;
671 }
672
673 static DWORD WINAPI
674 file_select_thread (void *arg)
675 {
676 struct serial *scb = (struct serial *) arg;
677 struct ser_console_state *state;
678 HANDLE h;
679
680 state = (struct ser_console_state *) scb->state;
681 h = (HANDLE) _get_osfhandle (scb->fd);
682
683 while (1)
684 {
685 select_thread_wait (state);
686
687 if (SetFilePointer (h, 0, NULL, FILE_CURRENT)
688 == INVALID_SET_FILE_POINTER)
689 SetEvent (state->except_event);
690 else
691 SetEvent (state->read_event);
692
693 SetEvent (state->have_stopped);
694 }
695 return 0;
696 }
697
698 static void
699 ser_console_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
700 {
701 struct ser_console_state *state = (struct ser_console_state *) scb->state;
702
703 if (state == NULL)
704 {
705 thread_fn_type thread_fn;
706 int is_tty;
707
708 is_tty = isatty (scb->fd);
709 if (!is_tty && !fd_is_file (scb->fd) && !fd_is_pipe (scb->fd))
710 {
711 *read = NULL;
712 *except = NULL;
713 return;
714 }
715
716 state = XCNEW (struct ser_console_state);
717 scb->state = state;
718
719 if (is_tty)
720 thread_fn = console_select_thread;
721 else if (fd_is_pipe (scb->fd))
722 thread_fn = pipe_select_thread;
723 else
724 thread_fn = file_select_thread;
725
726 create_select_thread (thread_fn, scb, state);
727 }
728
729 *read = state->read_event;
730 *except = state->except_event;
731
732 /* Start from a blank state. */
733 ResetEvent (state->read_event);
734 ResetEvent (state->except_event);
735 ResetEvent (state->stop_select);
736
737 /* First check for a key already in the buffer. If there is one,
738 we don't need a thread. This also catches the second key of
739 multi-character returns from getch, for instance for arrow
740 keys. The second half is in a C library internal buffer,
741 and PeekConsoleInput will not find it. */
742 if (_kbhit ())
743 {
744 SetEvent (state->read_event);
745 return;
746 }
747
748 /* Otherwise, start the select thread. */
749 start_select_thread (state);
750 }
751
752 static void
753 ser_console_done_wait_handle (struct serial *scb)
754 {
755 struct ser_console_state *state = (struct ser_console_state *) scb->state;
756
757 if (state == NULL)
758 return;
759
760 stop_select_thread (state);
761 }
762
763 static void
764 ser_console_close (struct serial *scb)
765 {
766 struct ser_console_state *state = (struct ser_console_state *) scb->state;
767
768 if (scb->state)
769 {
770 destroy_select_thread (state);
771 xfree (scb->state);
772 }
773 }
774
775 struct ser_console_ttystate
776 {
777 int is_a_tty;
778 };
779
780 static serial_ttystate
781 ser_console_get_tty_state (struct serial *scb)
782 {
783 if (isatty (scb->fd))
784 {
785 struct ser_console_ttystate *state;
786
787 state = XNEW (struct ser_console_ttystate);
788 state->is_a_tty = 1;
789 return state;
790 }
791 else
792 return NULL;
793 }
794
795 struct pipe_state
796 {
797 /* Since we use the pipe_select_thread for our select emulation,
798 we need to place the state structure it requires at the front
799 of our state. */
800 struct ser_console_state wait;
801
802 /* The pex obj for our (one-stage) pipeline. */
803 struct pex_obj *pex;
804
805 /* Streams for the pipeline's input and output. */
806 FILE *input, *output;
807 };
808
809 static struct pipe_state *
810 make_pipe_state (void)
811 {
812 struct pipe_state *ps = XCNEW (struct pipe_state);
813
814 ps->wait.read_event = INVALID_HANDLE_VALUE;
815 ps->wait.except_event = INVALID_HANDLE_VALUE;
816 ps->wait.start_select = INVALID_HANDLE_VALUE;
817 ps->wait.stop_select = INVALID_HANDLE_VALUE;
818
819 return ps;
820 }
821
822 static void
823 free_pipe_state (struct pipe_state *ps)
824 {
825 int saved_errno = errno;
826
827 if (ps->wait.read_event != INVALID_HANDLE_VALUE)
828 destroy_select_thread (&ps->wait);
829
830 /* Close the pipe to the child. We must close the pipe before
831 calling pex_free because pex_free will wait for the child to exit
832 and the child will not exit until the pipe is closed. */
833 if (ps->input)
834 fclose (ps->input);
835 if (ps->pex)
836 {
837 pex_free (ps->pex);
838 /* pex_free closes ps->output. */
839 }
840 else if (ps->output)
841 fclose (ps->output);
842
843 xfree (ps);
844
845 errno = saved_errno;
846 }
847
848 struct pipe_state_destroyer
849 {
850 void operator() (pipe_state *ps) const
851 {
852 free_pipe_state (ps);
853 }
854 };
855
856 typedef std::unique_ptr<pipe_state, pipe_state_destroyer> pipe_state_up;
857
858 static void
859 pipe_windows_open (struct serial *scb, const char *name)
860 {
861 FILE *pex_stderr;
862
863 if (name == NULL)
864 error_no_arg (_("child command"));
865
866 if (*name == '|')
867 {
868 name++;
869 name = skip_spaces (name);
870 }
871
872 gdb_argv argv (name);
873
874 if (! argv[0] || argv[0][0] == '\0')
875 error (_("missing child command"));
876
877 pipe_state_up ps (make_pipe_state ());
878
879 ps->pex = pex_init (PEX_USE_PIPES, "target remote pipe", NULL);
880 if (! ps->pex)
881 error (_("could not start pipeline"));
882 ps->input = pex_input_pipe (ps->pex, 1);
883 if (! ps->input)
884 error (_("could not find input pipe"));
885
886 {
887 int err;
888 const char *err_msg
889 = pex_run (ps->pex, PEX_SEARCH | PEX_BINARY_INPUT | PEX_BINARY_OUTPUT
890 | PEX_STDERR_TO_PIPE,
891 argv[0], argv.get (), NULL, NULL,
892 &err);
893
894 if (err_msg)
895 {
896 /* Our caller expects us to return -1, but all they'll do with
897 it generally is print the message based on errno. We have
898 all the same information here, plus err_msg provided by
899 pex_run, so we just raise the error here. */
900 if (err)
901 error (_("error starting child process '%s': %s: %s"),
902 name, err_msg, safe_strerror (err));
903 else
904 error (_("error starting child process '%s': %s"),
905 name, err_msg);
906 }
907 }
908
909 ps->output = pex_read_output (ps->pex, 1);
910 if (! ps->output)
911 error (_("could not find output pipe"));
912 scb->fd = fileno (ps->output);
913
914 pex_stderr = pex_read_err (ps->pex, 1);
915 if (! pex_stderr)
916 error (_("could not find error pipe"));
917 scb->error_fd = fileno (pex_stderr);
918
919 scb->state = ps.release ();
920 }
921
922 static int
923 pipe_windows_fdopen (struct serial *scb, int fd)
924 {
925 struct pipe_state *ps;
926
927 ps = make_pipe_state ();
928
929 ps->input = fdopen (fd, "r+");
930 if (! ps->input)
931 goto fail;
932
933 ps->output = fdopen (fd, "r+");
934 if (! ps->output)
935 goto fail;
936
937 scb->fd = fd;
938 scb->state = (void *) ps;
939
940 return 0;
941
942 fail:
943 free_pipe_state (ps);
944 return -1;
945 }
946
947 static void
948 pipe_windows_close (struct serial *scb)
949 {
950 struct pipe_state *ps = (struct pipe_state *) scb->state;
951
952 /* In theory, we should try to kill the subprocess here, but the pex
953 interface doesn't give us enough information to do that. Usually
954 closing the input pipe will get the message across. */
955
956 free_pipe_state (ps);
957 }
958
959
960 static int
961 pipe_windows_read (struct serial *scb, size_t count)
962 {
963 HANDLE pipeline_out = (HANDLE) _get_osfhandle (scb->fd);
964 DWORD available;
965 DWORD bytes_read;
966
967 if (pipeline_out == INVALID_HANDLE_VALUE)
968 error (_("could not find file number for pipe"));
969
970 if (! PeekNamedPipe (pipeline_out, NULL, 0, NULL, &available, NULL))
971 throw_winerror_with_name (_("could not peek into pipe"), GetLastError ());
972
973 if (count > available)
974 count = available;
975
976 if (! ReadFile (pipeline_out, scb->buf, count, &bytes_read, NULL))
977 throw_winerror_with_name (_("could not read from pipe"), GetLastError ());
978
979 return bytes_read;
980 }
981
982
983 static int
984 pipe_windows_write (struct serial *scb, const void *buf, size_t count)
985 {
986 struct pipe_state *ps = (struct pipe_state *) scb->state;
987 HANDLE pipeline_in;
988 DWORD written;
989
990 int pipeline_in_fd = fileno (ps->input);
991 if (pipeline_in_fd < 0)
992 error (_("could not find file number for pipe"));
993
994 pipeline_in = (HANDLE) _get_osfhandle (pipeline_in_fd);
995 if (pipeline_in == INVALID_HANDLE_VALUE)
996 error (_("could not find handle for pipe"));
997
998 if (! WriteFile (pipeline_in, buf, count, &written, NULL))
999 throw_winerror_with_name (_("could not write to pipe"), GetLastError ());
1000
1001 return written;
1002 }
1003
1004
1005 static void
1006 pipe_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
1007 {
1008 struct pipe_state *ps = (struct pipe_state *) scb->state;
1009
1010 /* Have we allocated our events yet? */
1011 if (ps->wait.read_event == INVALID_HANDLE_VALUE)
1012 /* Start the thread. */
1013 create_select_thread (pipe_select_thread, scb, &ps->wait);
1014
1015 *read = ps->wait.read_event;
1016 *except = ps->wait.except_event;
1017
1018 /* Start from a blank state. */
1019 ResetEvent (ps->wait.read_event);
1020 ResetEvent (ps->wait.except_event);
1021 ResetEvent (ps->wait.stop_select);
1022
1023 start_select_thread (&ps->wait);
1024 }
1025
1026 static void
1027 pipe_done_wait_handle (struct serial *scb)
1028 {
1029 struct pipe_state *ps = (struct pipe_state *) scb->state;
1030
1031 /* Have we allocated our events yet? */
1032 if (ps->wait.read_event == INVALID_HANDLE_VALUE)
1033 return;
1034
1035 stop_select_thread (&ps->wait);
1036 }
1037
1038 static int
1039 pipe_avail (struct serial *scb, int fd)
1040 {
1041 HANDLE h = (HANDLE) _get_osfhandle (fd);
1042 DWORD numBytes;
1043 BOOL r = PeekNamedPipe (h, NULL, 0, NULL, &numBytes, NULL);
1044
1045 if (r == FALSE)
1046 numBytes = 0;
1047 return numBytes;
1048 }
1049
1050 int
1051 gdb_pipe (int pdes[2])
1052 {
1053 if (_pipe (pdes, 512, _O_BINARY | _O_NOINHERIT) == -1)
1054 return -1;
1055 return 0;
1056 }
1057
1058 struct net_windows_state
1059 {
1060 struct ser_console_state base;
1061
1062 HANDLE sock_event;
1063 };
1064
1065 /* Check whether the socket has any pending data to be read. If so,
1066 set the select thread's read event. On error, set the select
1067 thread's except event. If any event was set, return true,
1068 otherwise return false. */
1069
1070 static int
1071 net_windows_socket_check_pending (struct serial *scb)
1072 {
1073 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1074 unsigned long available;
1075
1076 if (ioctlsocket (scb->fd, FIONREAD, &available) != 0)
1077 {
1078 /* The socket closed, or some other error. */
1079 SetEvent (state->base.except_event);
1080 return 1;
1081 }
1082 else if (available > 0)
1083 {
1084 SetEvent (state->base.read_event);
1085 return 1;
1086 }
1087
1088 return 0;
1089 }
1090
1091 static DWORD WINAPI
1092 net_windows_select_thread (void *arg)
1093 {
1094 struct serial *scb = (struct serial *) arg;
1095 struct net_windows_state *state;
1096 int event_index;
1097
1098 state = (struct net_windows_state *) scb->state;
1099
1100 while (1)
1101 {
1102 HANDLE wait_events[2];
1103 WSANETWORKEVENTS events;
1104
1105 select_thread_wait (&state->base);
1106
1107 wait_events[0] = state->base.stop_select;
1108 wait_events[1] = state->sock_event;
1109
1110 /* Wait for something to happen on the socket. */
1111 while (1)
1112 {
1113 event_index = WaitForMultipleObjects (2, wait_events, FALSE, INFINITE);
1114
1115 if (event_index == WAIT_OBJECT_0
1116 || WaitForSingleObject (state->base.stop_select, 0) == WAIT_OBJECT_0)
1117 {
1118 /* We have been requested to stop. */
1119 break;
1120 }
1121
1122 if (event_index != WAIT_OBJECT_0 + 1)
1123 {
1124 /* Some error has occurred. Assume that this is an error
1125 condition. */
1126 SetEvent (state->base.except_event);
1127 break;
1128 }
1129
1130 /* Enumerate the internal network events, and reset the
1131 object that signalled us to catch the next event. */
1132 if (WSAEnumNetworkEvents (scb->fd, state->sock_event, &events) != 0)
1133 {
1134 /* Something went wrong. Maybe the socket is gone. */
1135 SetEvent (state->base.except_event);
1136 break;
1137 }
1138
1139 if (events.lNetworkEvents & FD_READ)
1140 {
1141 if (net_windows_socket_check_pending (scb))
1142 break;
1143
1144 /* Spurious wakeup. That is, the socket's event was
1145 signalled before we last called recv. */
1146 }
1147
1148 if (events.lNetworkEvents & FD_CLOSE)
1149 {
1150 SetEvent (state->base.except_event);
1151 break;
1152 }
1153 }
1154
1155 SetEvent (state->base.have_stopped);
1156 }
1157 return 0;
1158 }
1159
1160 static void
1161 net_windows_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
1162 {
1163 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1164
1165 /* Start from a clean slate. */
1166 ResetEvent (state->base.read_event);
1167 ResetEvent (state->base.except_event);
1168 ResetEvent (state->base.stop_select);
1169
1170 *read = state->base.read_event;
1171 *except = state->base.except_event;
1172
1173 /* Check any pending events. Otherwise, start the select
1174 thread. */
1175 if (!net_windows_socket_check_pending (scb))
1176 start_select_thread (&state->base);
1177 }
1178
1179 static void
1180 net_windows_done_wait_handle (struct serial *scb)
1181 {
1182 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1183
1184 stop_select_thread (&state->base);
1185 }
1186
1187 static void
1188 net_windows_open (struct serial *scb, const char *name)
1189 {
1190 struct net_windows_state *state;
1191
1192 net_open (scb, name);
1193
1194 state = XCNEW (struct net_windows_state);
1195 scb->state = state;
1196
1197 /* Associate an event with the socket. */
1198 state->sock_event = CreateEvent (0, TRUE, FALSE, 0);
1199 WSAEventSelect (scb->fd, state->sock_event, FD_READ | FD_CLOSE);
1200
1201 /* Start the thread. */
1202 create_select_thread (net_windows_select_thread, scb, &state->base);
1203 }
1204
1205
1206 static void
1207 net_windows_close (struct serial *scb)
1208 {
1209 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1210
1211 destroy_select_thread (&state->base);
1212 CloseHandle (state->sock_event);
1213
1214 xfree (scb->state);
1215
1216 net_close (scb);
1217 }
1218
1219 /* The serial port driver. */
1220
1221 static const struct serial_ops hardwire_ops =
1222 {
1223 "hardwire",
1224 ser_windows_open,
1225 ser_windows_close,
1226 NULL,
1227 ser_base_readchar,
1228 ser_base_write,
1229 ser_windows_flush_output,
1230 ser_windows_flush_input,
1231 ser_windows_send_break,
1232 ser_windows_raw,
1233 /* These are only used for stdin; we do not need them for serial
1234 ports, so supply the standard dummies. */
1235 ser_base_get_tty_state,
1236 ser_base_copy_tty_state,
1237 ser_base_set_tty_state,
1238 ser_base_print_tty_state,
1239 ser_windows_setbaudrate,
1240 ser_windows_setstopbits,
1241 ser_windows_setparity,
1242 ser_windows_drain_output,
1243 ser_base_async,
1244 ser_windows_read_prim,
1245 ser_windows_write_prim,
1246 NULL,
1247 ser_windows_wait_handle
1248 };
1249
1250 /* The dummy serial driver used for terminals. We only provide the
1251 TTY-related methods. */
1252
1253 static const struct serial_ops tty_ops =
1254 {
1255 "terminal",
1256 NULL,
1257 ser_console_close,
1258 NULL,
1259 NULL,
1260 NULL,
1261 NULL,
1262 NULL,
1263 NULL,
1264 NULL,
1265 ser_console_get_tty_state,
1266 ser_base_copy_tty_state,
1267 ser_base_set_tty_state,
1268 ser_base_print_tty_state,
1269 NULL,
1270 NULL,
1271 NULL,
1272 ser_base_drain_output,
1273 NULL,
1274 NULL,
1275 NULL,
1276 NULL,
1277 ser_console_wait_handle,
1278 ser_console_done_wait_handle
1279 };
1280
1281 /* The pipe interface. */
1282
1283 static const struct serial_ops pipe_ops =
1284 {
1285 "pipe",
1286 pipe_windows_open,
1287 pipe_windows_close,
1288 pipe_windows_fdopen,
1289 ser_base_readchar,
1290 ser_base_write,
1291 ser_base_flush_output,
1292 ser_base_flush_input,
1293 ser_base_send_break,
1294 ser_base_raw,
1295 ser_base_get_tty_state,
1296 ser_base_copy_tty_state,
1297 ser_base_set_tty_state,
1298 ser_base_print_tty_state,
1299 ser_base_setbaudrate,
1300 ser_base_setstopbits,
1301 ser_base_setparity,
1302 ser_base_drain_output,
1303 ser_base_async,
1304 pipe_windows_read,
1305 pipe_windows_write,
1306 pipe_avail,
1307 pipe_wait_handle,
1308 pipe_done_wait_handle
1309 };
1310
1311 /* The TCP/UDP socket driver. */
1312
1313 static const struct serial_ops tcp_ops =
1314 {
1315 "tcp",
1316 net_windows_open,
1317 net_windows_close,
1318 NULL,
1319 ser_base_readchar,
1320 ser_base_write,
1321 ser_base_flush_output,
1322 ser_base_flush_input,
1323 ser_tcp_send_break,
1324 ser_base_raw,
1325 ser_base_get_tty_state,
1326 ser_base_copy_tty_state,
1327 ser_base_set_tty_state,
1328 ser_base_print_tty_state,
1329 ser_base_setbaudrate,
1330 ser_base_setstopbits,
1331 ser_base_setparity,
1332 ser_base_drain_output,
1333 ser_base_async,
1334 net_read_prim,
1335 net_write_prim,
1336 NULL,
1337 net_windows_wait_handle,
1338 net_windows_done_wait_handle
1339 };
1340
1341 void _initialize_ser_windows ();
1342 void
1343 _initialize_ser_windows ()
1344 {
1345 WSADATA wsa_data;
1346
1347 HMODULE hm = NULL;
1348
1349 /* First find out if kernel32 exports CancelIo function. */
1350 hm = LoadLibrary ("kernel32.dll");
1351 if (hm)
1352 {
1353 CancelIo = (CancelIo_ftype *) GetProcAddress (hm, "CancelIo");
1354 FreeLibrary (hm);
1355 }
1356 else
1357 CancelIo = NULL;
1358
1359 serial_add_interface (&hardwire_ops);
1360 serial_add_interface (&tty_ops);
1361 serial_add_interface (&pipe_ops);
1362
1363 /* If WinSock works, register the TCP/UDP socket driver. */
1364
1365 if (WSAStartup (MAKEWORD (1, 0), &wsa_data) != 0)
1366 /* WinSock is unavailable. */
1367 return;
1368
1369 serial_add_interface (&tcp_ops);
1370 }
1371