Fix building Loongarch BFD with a 32-bit compiler
[binutils-gdb.git] / gdb / ser-mingw.c
blob2603bb8dcfb49521132ce08bc0e596276080a7bd
1 /* Serial interface for local (hardwired) serial ports on Windows systems
3 Copyright (C) 2006-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
20 #include "serial.h"
21 #include "ser-base.h"
22 #include "ser-tcp.h"
24 #include <windows.h>
25 #include <conio.h>
27 #include <fcntl.h>
28 #include <unistd.h>
29 #include <sys/types.h>
31 #include "command.h"
32 #include "gdbsupport/buildargv.h"
34 struct ser_windows_state
36 int in_progress;
37 OVERLAPPED ov;
38 DWORD lastCommMask;
39 HANDLE except_event;
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;
48 /* Open up a real live device for serial I/O. */
50 static void
51 ser_windows_open (struct serial *scb, const char *name)
53 HANDLE h;
54 struct ser_windows_state *state;
55 COMMTIMEOUTS timeouts;
57 h = CreateFile (name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
58 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
59 if (h == INVALID_HANDLE_VALUE)
61 std::string msg = string_printf(_("could not open file: %s"),
62 name);
63 throw_winerror_with_name (msg.c_str (), GetLastError ());
66 scb->fd = _open_osfhandle ((intptr_t) h, O_RDWR);
67 if (scb->fd < 0)
68 error (_("could not get underlying file descriptor"));
70 if (!SetCommMask (h, EV_RXCHAR))
71 throw_winerror_with_name (_("error calling SetCommMask"),
72 GetLastError ());
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 ());
83 state = XCNEW (struct ser_windows_state);
84 scb->state = state;
86 /* Create a manual reset event to watch the input buffer. */
87 state->ov.hEvent = CreateEvent (0, TRUE, FALSE, 0);
89 /* Create a (currently unused) handle to record exceptions. */
90 state->except_event = CreateEvent (0, TRUE, FALSE, 0);
93 /* Wait for the output to drain away, as opposed to flushing (discarding)
94 it. */
96 static int
97 ser_windows_drain_output (struct serial *scb)
99 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
101 return (FlushFileBuffers (h) != 0) ? 0 : -1;
104 static int
105 ser_windows_flush_output (struct serial *scb)
107 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
109 return (PurgeComm (h, PURGE_TXCLEAR) != 0) ? 0 : -1;
112 static int
113 ser_windows_flush_input (struct serial *scb)
115 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
117 return (PurgeComm (h, PURGE_RXCLEAR) != 0) ? 0 : -1;
120 static void
121 ser_windows_send_break (struct serial *scb)
123 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
125 if (SetCommBreak (h) == 0)
126 throw_winerror_with_name ("error calling SetCommBreak",
127 GetLastError ());
129 /* Delay for 250 milliseconds. */
130 Sleep (250);
132 if (ClearCommBreak (h) == 0)
133 throw_winerror_with_name ("error calling ClearCommBreak",
134 GetLastError ());
137 static void
138 ser_windows_raw (struct serial *scb)
140 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
141 DCB state;
143 if (GetCommState (h, &state) == 0)
144 return;
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;
156 if (SetCommState (h, &state) == 0)
157 warning (_("SetCommState failed"));
160 static int
161 ser_windows_setstopbits (struct serial *scb, int num)
163 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
164 DCB state;
166 if (GetCommState (h, &state) == 0)
167 return -1;
169 switch (num)
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;
184 return (SetCommState (h, &state) != 0) ? 0 : -1;
187 /* Implement the "setparity" serial_ops callback. */
189 static int
190 ser_windows_setparity (struct serial *scb, int parity)
192 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
193 DCB state;
195 if (GetCommState (h, &state) == 0)
196 return -1;
198 switch (parity)
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;
217 return (SetCommState (h, &state) != 0) ? 0 : -1;
220 static void
221 ser_windows_setbaudrate (struct serial *scb, int rate)
223 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
224 DCB state;
226 if (GetCommState (h, &state) == 0)
227 throw_winerror_with_name ("call to GetCommState failed", GetLastError ());
229 state.BaudRate = rate;
231 if (SetCommState (h, &state) == 0)
232 throw_winerror_with_name ("call to SetCommState failed", GetLastError ());
235 static void
236 ser_windows_close (struct serial *scb)
238 struct ser_windows_state *state;
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);
250 if (scb->fd < 0)
251 return;
253 close (scb->fd);
254 scb->fd = -1;
256 xfree (scb->state);
259 static void
260 ser_windows_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
262 struct ser_windows_state *state;
263 COMSTAT status;
264 DWORD errors;
265 HANDLE h = (HANDLE) _get_osfhandle (scb->fd);
267 state = (struct ser_windows_state *) scb->state;
269 *except = state->except_event;
270 *read = state->ov.hEvent;
272 if (state->in_progress)
273 return;
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. */
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"));
286 if (!SetCommMask (h, EV_RXCHAR))
287 warning (_("ser_windows_wait_handle: reseting mask failed (2)"));
289 /* There's a potential race condition here; we must check cbInQue
290 and not wait if that's nonzero. */
292 ClearCommError (h, &errors, &status);
293 if (status.cbInQue > 0)
295 SetEvent (state->ov.hEvent);
296 return;
299 state->in_progress = 1;
300 ResetEvent (state->ov.hEvent);
301 state->lastCommMask = -2;
302 if (WaitCommEvent (h, &state->lastCommMask, &state->ov))
304 gdb_assert (state->lastCommMask & EV_RXCHAR);
305 SetEvent (state->ov.hEvent);
307 else
308 gdb_assert (GetLastError () == ERROR_IO_PENDING);
311 static int
312 ser_windows_read_prim (struct serial *scb, size_t count)
314 struct ser_windows_state *state;
315 OVERLAPPED ov;
316 DWORD bytes_read;
317 HANDLE h;
319 state = (struct ser_windows_state *) scb->state;
320 if (state->in_progress)
322 WaitForSingleObject (state->ov.hEvent, INFINITE);
323 state->in_progress = 0;
324 ResetEvent (state->ov.hEvent);
327 memset (&ov, 0, sizeof (OVERLAPPED));
328 ov.hEvent = CreateEvent (0, FALSE, FALSE, 0);
329 h = (HANDLE) _get_osfhandle (scb->fd);
331 if (!ReadFile (h, scb->buf, /* count */ 1, &bytes_read, &ov))
333 if (GetLastError () != ERROR_IO_PENDING
334 || !GetOverlappedResult (h, &ov, &bytes_read, TRUE))
336 ULONGEST err = GetLastError ();
337 CloseHandle (ov.hEvent);
338 throw_winerror_with_name (_("error while reading"), err);
342 CloseHandle (ov.hEvent);
343 return bytes_read;
346 static int
347 ser_windows_write_prim (struct serial *scb, const void *buf, size_t len)
349 OVERLAPPED ov;
350 DWORD bytes_written;
351 HANDLE h;
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))
358 if (GetLastError () != ERROR_IO_PENDING
359 || !GetOverlappedResult (h, &ov, &bytes_written, TRUE))
360 throw_winerror_with_name ("error while writing", GetLastError ());
363 CloseHandle (ov.hEvent);
364 return bytes_written;
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.
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. */
383 enum select_thread_state {
384 STS_STARTED,
385 STS_STOPPED
388 struct ser_console_state
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;
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;
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;
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)
429 HANDLE wait_events[2];
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);
442 /* We are now in the started state. */
443 SetEvent (state->have_started);
446 typedef DWORD WINAPI (*thread_fn_type)(void *);
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)
455 DWORD threadId;
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);
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;
471 /* Destroy the select thread indicated by STATE. */
472 static void
473 destroy_select_thread (struct ser_console_state *state)
475 /* Ask the thread to exit. */
476 SetEvent (state->exit_select);
477 /* Wait until it does. */
478 WaitForSingleObject (state->thread, INFINITE);
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);
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)
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;
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)
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;
523 static DWORD WINAPI
524 console_select_thread (void *arg)
526 struct serial *scb = (struct serial *) arg;
527 struct ser_console_state *state;
528 int event_index;
529 HANDLE h;
531 state = (struct ser_console_state *) scb->state;
532 h = (HANDLE) _get_osfhandle (scb->fd);
534 while (1)
536 HANDLE wait_events[2];
537 INPUT_RECORD record;
538 DWORD n_records;
540 select_thread_wait (state);
542 while (1)
544 wait_events[0] = state->stop_select;
545 wait_events[1] = h;
547 event_index = WaitForMultipleObjects (2, wait_events,
548 FALSE, INFINITE);
550 if (event_index == WAIT_OBJECT_0
551 || WaitForSingleObject (state->stop_select, 0) == WAIT_OBJECT_0)
552 break;
554 if (event_index != WAIT_OBJECT_0 + 1)
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;
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)
566 /* Something went wrong. Maybe the console is gone. */
567 SetEvent (state->except_event);
568 break;
571 if (record.EventType == KEY_EVENT && record.Event.KeyEvent.bKeyDown)
573 WORD keycode = record.Event.KeyEvent.wVirtualKeyCode;
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. */
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)
593 /* This is really a keypress. */
594 SetEvent (state->read_event);
595 break;
598 else if (record.EventType == MOUSE_EVENT)
600 SetEvent (state->read_event);
601 break;
604 /* Otherwise discard it and wait again. */
605 ReadConsoleInput (h, &record, 1, &n_records);
608 SetEvent(state->have_stopped);
610 return 0;
613 static int
614 fd_is_pipe (int fd)
616 if (PeekNamedPipe ((HANDLE) _get_osfhandle (fd), NULL, 0, NULL, NULL, NULL))
617 return 1;
618 else
619 return 0;
622 static int
623 fd_is_file (int fd)
625 if (GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_DISK)
626 return 1;
627 else
628 return 0;
631 static DWORD WINAPI
632 pipe_select_thread (void *arg)
634 struct serial *scb = (struct serial *) arg;
635 struct ser_console_state *state;
636 HANDLE h;
638 state = (struct ser_console_state *) scb->state;
639 h = (HANDLE) _get_osfhandle (scb->fd);
641 while (1)
643 DWORD n_avail;
645 select_thread_wait (state);
647 /* Wait for something to happen on the pipe. */
648 while (1)
650 if (!PeekNamedPipe (h, NULL, 0, NULL, &n_avail, NULL))
652 SetEvent (state->except_event);
653 break;
656 if (n_avail > 0)
658 SetEvent (state->read_event);
659 break;
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;
668 SetEvent (state->have_stopped);
670 return 0;
673 static DWORD WINAPI
674 file_select_thread (void *arg)
676 struct serial *scb = (struct serial *) arg;
677 struct ser_console_state *state;
678 HANDLE h;
680 state = (struct ser_console_state *) scb->state;
681 h = (HANDLE) _get_osfhandle (scb->fd);
683 while (1)
685 select_thread_wait (state);
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);
693 SetEvent (state->have_stopped);
695 return 0;
698 static void
699 ser_console_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
701 struct ser_console_state *state = (struct ser_console_state *) scb->state;
703 if (state == NULL)
705 thread_fn_type thread_fn;
706 int is_tty;
708 is_tty = isatty (scb->fd);
709 if (!is_tty && !fd_is_file (scb->fd) && !fd_is_pipe (scb->fd))
711 *read = NULL;
712 *except = NULL;
713 return;
716 state = XCNEW (struct ser_console_state);
717 scb->state = state;
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;
726 create_select_thread (thread_fn, scb, state);
729 *read = state->read_event;
730 *except = state->except_event;
732 /* Start from a blank state. */
733 ResetEvent (state->read_event);
734 ResetEvent (state->except_event);
735 ResetEvent (state->stop_select);
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 ())
744 SetEvent (state->read_event);
745 return;
748 /* Otherwise, start the select thread. */
749 start_select_thread (state);
752 static void
753 ser_console_done_wait_handle (struct serial *scb)
755 struct ser_console_state *state = (struct ser_console_state *) scb->state;
757 if (state == NULL)
758 return;
760 stop_select_thread (state);
763 static void
764 ser_console_close (struct serial *scb)
766 struct ser_console_state *state = (struct ser_console_state *) scb->state;
768 if (scb->state)
770 destroy_select_thread (state);
771 xfree (scb->state);
775 struct ser_console_ttystate
777 int is_a_tty;
780 static serial_ttystate
781 ser_console_get_tty_state (struct serial *scb)
783 if (isatty (scb->fd))
785 struct ser_console_ttystate *state;
787 state = XNEW (struct ser_console_ttystate);
788 state->is_a_tty = 1;
789 return state;
791 else
792 return NULL;
795 struct pipe_state
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;
802 /* The pex obj for our (one-stage) pipeline. */
803 struct pex_obj *pex;
805 /* Streams for the pipeline's input and output. */
806 FILE *input, *output;
809 static struct pipe_state *
810 make_pipe_state (void)
812 struct pipe_state *ps = XCNEW (struct pipe_state);
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;
819 return ps;
822 static void
823 free_pipe_state (struct pipe_state *ps)
825 int saved_errno = errno;
827 if (ps->wait.read_event != INVALID_HANDLE_VALUE)
828 destroy_select_thread (&ps->wait);
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)
837 pex_free (ps->pex);
838 /* pex_free closes ps->output. */
840 else if (ps->output)
841 fclose (ps->output);
843 xfree (ps);
845 errno = saved_errno;
848 struct pipe_state_destroyer
850 void operator() (pipe_state *ps) const
852 free_pipe_state (ps);
856 typedef std::unique_ptr<pipe_state, pipe_state_destroyer> pipe_state_up;
858 static void
859 pipe_windows_open (struct serial *scb, const char *name)
861 FILE *pex_stderr;
863 if (name == NULL)
864 error_no_arg (_("child command"));
866 if (*name == '|')
868 name++;
869 name = skip_spaces (name);
872 gdb_argv argv (name);
874 if (! argv[0] || argv[0][0] == '\0')
875 error (_("missing child command"));
877 pipe_state_up ps (make_pipe_state ());
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"));
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);
894 if (err_msg)
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);
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);
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);
919 scb->state = ps.release ();
922 static int
923 pipe_windows_fdopen (struct serial *scb, int fd)
925 struct pipe_state *ps;
927 ps = make_pipe_state ();
929 ps->input = fdopen (fd, "r+");
930 if (! ps->input)
931 goto fail;
933 ps->output = fdopen (fd, "r+");
934 if (! ps->output)
935 goto fail;
937 scb->fd = fd;
938 scb->state = (void *) ps;
940 return 0;
942 fail:
943 free_pipe_state (ps);
944 return -1;
947 static void
948 pipe_windows_close (struct serial *scb)
950 struct pipe_state *ps = (struct pipe_state *) scb->state;
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. */
956 free_pipe_state (ps);
960 static int
961 pipe_windows_read (struct serial *scb, size_t count)
963 HANDLE pipeline_out = (HANDLE) _get_osfhandle (scb->fd);
964 DWORD available;
965 DWORD bytes_read;
967 if (pipeline_out == INVALID_HANDLE_VALUE)
968 error (_("could not find file number for pipe"));
970 if (! PeekNamedPipe (pipeline_out, NULL, 0, NULL, &available, NULL))
971 throw_winerror_with_name (_("could not peek into pipe"), GetLastError ());
973 if (count > available)
974 count = available;
976 if (! ReadFile (pipeline_out, scb->buf, count, &bytes_read, NULL))
977 throw_winerror_with_name (_("could not read from pipe"), GetLastError ());
979 return bytes_read;
983 static int
984 pipe_windows_write (struct serial *scb, const void *buf, size_t count)
986 struct pipe_state *ps = (struct pipe_state *) scb->state;
987 HANDLE pipeline_in;
988 DWORD written;
990 int pipeline_in_fd = fileno (ps->input);
991 if (pipeline_in_fd < 0)
992 error (_("could not find file number for pipe"));
994 pipeline_in = (HANDLE) _get_osfhandle (pipeline_in_fd);
995 if (pipeline_in == INVALID_HANDLE_VALUE)
996 error (_("could not find handle for pipe"));
998 if (! WriteFile (pipeline_in, buf, count, &written, NULL))
999 throw_winerror_with_name (_("could not write to pipe"), GetLastError ());
1001 return written;
1005 static void
1006 pipe_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
1008 struct pipe_state *ps = (struct pipe_state *) scb->state;
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);
1015 *read = ps->wait.read_event;
1016 *except = ps->wait.except_event;
1018 /* Start from a blank state. */
1019 ResetEvent (ps->wait.read_event);
1020 ResetEvent (ps->wait.except_event);
1021 ResetEvent (ps->wait.stop_select);
1023 start_select_thread (&ps->wait);
1026 static void
1027 pipe_done_wait_handle (struct serial *scb)
1029 struct pipe_state *ps = (struct pipe_state *) scb->state;
1031 /* Have we allocated our events yet? */
1032 if (ps->wait.read_event == INVALID_HANDLE_VALUE)
1033 return;
1035 stop_select_thread (&ps->wait);
1038 static int
1039 pipe_avail (struct serial *scb, int fd)
1041 HANDLE h = (HANDLE) _get_osfhandle (fd);
1042 DWORD numBytes;
1043 BOOL r = PeekNamedPipe (h, NULL, 0, NULL, &numBytes, NULL);
1045 if (r == FALSE)
1046 numBytes = 0;
1047 return numBytes;
1051 gdb_pipe (int pdes[2])
1053 if (_pipe (pdes, 512, _O_BINARY | _O_NOINHERIT) == -1)
1054 return -1;
1055 return 0;
1058 struct net_windows_state
1060 struct ser_console_state base;
1062 HANDLE sock_event;
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. */
1070 static int
1071 net_windows_socket_check_pending (struct serial *scb)
1073 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1074 unsigned long available;
1076 if (ioctlsocket (scb->fd, FIONREAD, &available) != 0)
1078 /* The socket closed, or some other error. */
1079 SetEvent (state->base.except_event);
1080 return 1;
1082 else if (available > 0)
1084 SetEvent (state->base.read_event);
1085 return 1;
1088 return 0;
1091 static DWORD WINAPI
1092 net_windows_select_thread (void *arg)
1094 struct serial *scb = (struct serial *) arg;
1095 struct net_windows_state *state;
1096 int event_index;
1098 state = (struct net_windows_state *) scb->state;
1100 while (1)
1102 HANDLE wait_events[2];
1103 WSANETWORKEVENTS events;
1105 select_thread_wait (&state->base);
1107 wait_events[0] = state->base.stop_select;
1108 wait_events[1] = state->sock_event;
1110 /* Wait for something to happen on the socket. */
1111 while (1)
1113 event_index = WaitForMultipleObjects (2, wait_events, FALSE, INFINITE);
1115 if (event_index == WAIT_OBJECT_0
1116 || WaitForSingleObject (state->base.stop_select, 0) == WAIT_OBJECT_0)
1118 /* We have been requested to stop. */
1119 break;
1122 if (event_index != WAIT_OBJECT_0 + 1)
1124 /* Some error has occurred. Assume that this is an error
1125 condition. */
1126 SetEvent (state->base.except_event);
1127 break;
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)
1134 /* Something went wrong. Maybe the socket is gone. */
1135 SetEvent (state->base.except_event);
1136 break;
1139 if (events.lNetworkEvents & FD_READ)
1141 if (net_windows_socket_check_pending (scb))
1142 break;
1144 /* Spurious wakeup. That is, the socket's event was
1145 signalled before we last called recv. */
1148 if (events.lNetworkEvents & FD_CLOSE)
1150 SetEvent (state->base.except_event);
1151 break;
1155 SetEvent (state->base.have_stopped);
1157 return 0;
1160 static void
1161 net_windows_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
1163 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1165 /* Start from a clean slate. */
1166 ResetEvent (state->base.read_event);
1167 ResetEvent (state->base.except_event);
1168 ResetEvent (state->base.stop_select);
1170 *read = state->base.read_event;
1171 *except = state->base.except_event;
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);
1179 static void
1180 net_windows_done_wait_handle (struct serial *scb)
1182 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1184 stop_select_thread (&state->base);
1187 static void
1188 net_windows_open (struct serial *scb, const char *name)
1190 struct net_windows_state *state;
1192 net_open (scb, name);
1194 state = XCNEW (struct net_windows_state);
1195 scb->state = state;
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);
1201 /* Start the thread. */
1202 create_select_thread (net_windows_select_thread, scb, &state->base);
1206 static void
1207 net_windows_close (struct serial *scb)
1209 struct net_windows_state *state = (struct net_windows_state *) scb->state;
1211 destroy_select_thread (&state->base);
1212 CloseHandle (state->sock_event);
1214 xfree (scb->state);
1216 net_close (scb);
1219 /* The serial port driver. */
1221 static const struct serial_ops hardwire_ops =
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
1250 /* The dummy serial driver used for terminals. We only provide the
1251 TTY-related methods. */
1253 static const struct serial_ops tty_ops =
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
1281 /* The pipe interface. */
1283 static const struct serial_ops pipe_ops =
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
1311 /* The TCP/UDP socket driver. */
1313 static const struct serial_ops tcp_ops =
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
1341 void _initialize_ser_windows ();
1342 void
1343 _initialize_ser_windows ()
1345 WSADATA wsa_data;
1347 HMODULE hm = NULL;
1349 /* First find out if kernel32 exports CancelIo function. */
1350 hm = LoadLibrary ("kernel32.dll");
1351 if (hm)
1353 CancelIo = (CancelIo_ftype *) GetProcAddress (hm, "CancelIo");
1354 FreeLibrary (hm);
1356 else
1357 CancelIo = NULL;
1359 serial_add_interface (&hardwire_ops);
1360 serial_add_interface (&tty_ops);
1361 serial_add_interface (&pipe_ops);
1363 /* If WinSock works, register the TCP/UDP socket driver. */
1365 if (WSAStartup (MAKEWORD (1, 0), &wsa_data) != 0)
1366 /* WinSock is unavailable. */
1367 return;
1369 serial_add_interface (&tcp_ops);