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/>. */
29 #include <sys/types.h>
32 #include "gdbsupport/buildargv.h"
34 struct ser_windows_state
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. */
51 ser_windows_open (struct serial
*scb
, const char *name
)
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"),
63 throw_winerror_with_name (msg
.c_str (), GetLastError ());
66 scb
->fd
= _open_osfhandle ((intptr_t) h
, O_RDWR
);
68 error (_("could not get underlying file descriptor"));
70 if (!SetCommMask (h
, EV_RXCHAR
))
71 throw_winerror_with_name (_("error calling SetCommMask"),
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"),
83 state
= XCNEW (struct ser_windows_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)
97 ser_windows_drain_output (struct serial
*scb
)
99 HANDLE h
= (HANDLE
) _get_osfhandle (scb
->fd
);
101 return (FlushFileBuffers (h
) != 0) ? 0 : -1;
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;
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;
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",
129 /* Delay for 250 milliseconds. */
132 if (ClearCommBreak (h
) == 0)
133 throw_winerror_with_name ("error calling ClearCommBreak",
138 ser_windows_raw (struct serial
*scb
)
140 HANDLE h
= (HANDLE
) _get_osfhandle (scb
->fd
);
143 if (GetCommState (h
, &state
) == 0)
146 state
.fOutxCtsFlow
= FALSE
;
147 state
.fOutxDsrFlow
= FALSE
;
148 state
.fDtrControl
= DTR_CONTROL_ENABLE
;
149 state
.fDsrSensitivity
= FALSE
;
153 state
.fAbortOnError
= FALSE
;
156 if (SetCommState (h
, &state
) == 0)
157 warning (_("SetCommState failed"));
161 ser_windows_setstopbits (struct serial
*scb
, int num
)
163 HANDLE h
= (HANDLE
) _get_osfhandle (scb
->fd
);
166 if (GetCommState (h
, &state
) == 0)
171 case SERIAL_1_STOPBITS
:
172 state
.StopBits
= ONESTOPBIT
;
174 case SERIAL_1_AND_A_HALF_STOPBITS
:
175 state
.StopBits
= ONE5STOPBITS
;
177 case SERIAL_2_STOPBITS
:
178 state
.StopBits
= TWOSTOPBITS
;
184 return (SetCommState (h
, &state
) != 0) ? 0 : -1;
187 /* Implement the "setparity" serial_ops callback. */
190 ser_windows_setparity (struct serial
*scb
, int parity
)
192 HANDLE h
= (HANDLE
) _get_osfhandle (scb
->fd
);
195 if (GetCommState (h
, &state
) == 0)
201 state
.Parity
= NOPARITY
;
202 state
.fParity
= FALSE
;
205 state
.Parity
= ODDPARITY
;
206 state
.fParity
= TRUE
;
209 state
.Parity
= EVENPARITY
;
210 state
.fParity
= TRUE
;
213 internal_warning ("Incorrect parity value: %d", parity
);
217 return (SetCommState (h
, &state
) != 0) ? 0 : -1;
221 ser_windows_setbaudrate (struct serial
*scb
, int rate
)
223 HANDLE h
= (HANDLE
) _get_osfhandle (scb
->fd
);
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 ());
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. */
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
);
260 ser_windows_wait_handle (struct serial
*scb
, HANDLE
*read
, HANDLE
*except
)
262 struct ser_windows_state
*state
;
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
)
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
);
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
);
308 gdb_assert (GetLastError () == ERROR_IO_PENDING
);
312 ser_windows_read_prim (struct serial
*scb
, size_t count
)
314 struct ser_windows_state
*state
;
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
);
347 ser_windows_write_prim (struct serial
*scb
, const void *buf
, size_t len
)
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
383 enum select_thread_state
{
388 struct ser_console_state
390 /* Signaled by the select thread to indicate that data is available
391 on the file descriptor. */
393 /* Signaled by the select thread to indicate that an exception has
394 occurred on the file descriptor. */
396 /* Signaled by the select thread to indicate that it has entered the
397 started state. HAVE_STARTED and HAVE_STOPPED are never signaled
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. */
406 /* Signaled by the main program to tell the select thread to enter
407 the started state. */
409 /* Signaled by the main program to tell the select thread to enter
410 the stopped state. */
412 /* Signaled by the main program to tell the select thread to
416 /* The handle for the select 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
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
)
437 /* Either the EXIT_SELECT event was signaled (requesting that the
438 thread exit) or an error has occurred. In either case, we exit
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. */
451 create_select_thread (thread_fn_type thread_fn
,
453 struct ser_console_state
*state
)
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. */
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. */
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. */
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
)
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
;
524 console_select_thread (void *arg
)
526 struct serial
*scb
= (struct serial
*) arg
;
527 struct ser_console_state
*state
;
531 state
= (struct ser_console_state
*) scb
->state
;
532 h
= (HANDLE
) _get_osfhandle (scb
->fd
);
536 HANDLE wait_events
[2];
540 select_thread_wait (state
);
544 wait_events
[0] = state
->stop_select
;
547 event_index
= WaitForMultipleObjects (2, wait_events
,
550 if (event_index
== WAIT_OBJECT_0
551 || WaitForSingleObject (state
->stop_select
, 0) == WAIT_OBJECT_0
)
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
);
562 /* We've got a pending event on the console. See if it's
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
);
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
585 || keycode
== VK_HOME
586 || keycode
== VK_LEFT
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
);
598 else if (record
.EventType
== MOUSE_EVENT
)
600 SetEvent (state
->read_event
);
604 /* Otherwise discard it and wait again. */
605 ReadConsoleInput (h
, &record
, 1, &n_records
);
608 SetEvent(state
->have_stopped
);
616 if (PeekNamedPipe ((HANDLE
) _get_osfhandle (fd
), NULL
, 0, NULL
, NULL
, NULL
))
625 if (GetFileType ((HANDLE
) _get_osfhandle (fd
)) == FILE_TYPE_DISK
)
632 pipe_select_thread (void *arg
)
634 struct serial
*scb
= (struct serial
*) arg
;
635 struct ser_console_state
*state
;
638 state
= (struct ser_console_state
*) scb
->state
;
639 h
= (HANDLE
) _get_osfhandle (scb
->fd
);
645 select_thread_wait (state
);
647 /* Wait for something to happen on the pipe. */
650 if (!PeekNamedPipe (h
, NULL
, 0, NULL
, &n_avail
, NULL
))
652 SetEvent (state
->except_event
);
658 SetEvent (state
->read_event
);
662 /* Delay 10ms before checking again, but allow the stop
664 if (WaitForSingleObject (state
->stop_select
, 10) == WAIT_OBJECT_0
)
668 SetEvent (state
->have_stopped
);
674 file_select_thread (void *arg
)
676 struct serial
*scb
= (struct serial
*) arg
;
677 struct ser_console_state
*state
;
680 state
= (struct ser_console_state
*) scb
->state
;
681 h
= (HANDLE
) _get_osfhandle (scb
->fd
);
685 select_thread_wait (state
);
687 if (SetFilePointer (h
, 0, NULL
, FILE_CURRENT
)
688 == INVALID_SET_FILE_POINTER
)
689 SetEvent (state
->except_event
);
691 SetEvent (state
->read_event
);
693 SetEvent (state
->have_stopped
);
699 ser_console_wait_handle (struct serial
*scb
, HANDLE
*read
, HANDLE
*except
)
701 struct ser_console_state
*state
= (struct ser_console_state
*) scb
->state
;
705 thread_fn_type thread_fn
;
708 is_tty
= isatty (scb
->fd
);
709 if (!is_tty
&& !fd_is_file (scb
->fd
) && !fd_is_pipe (scb
->fd
))
716 state
= XCNEW (struct ser_console_state
);
720 thread_fn
= console_select_thread
;
721 else if (fd_is_pipe (scb
->fd
))
722 thread_fn
= pipe_select_thread
;
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. */
744 SetEvent (state
->read_event
);
748 /* Otherwise, start the select thread. */
749 start_select_thread (state
);
753 ser_console_done_wait_handle (struct serial
*scb
)
755 struct ser_console_state
*state
= (struct ser_console_state
*) scb
->state
;
760 stop_select_thread (state
);
764 ser_console_close (struct serial
*scb
)
766 struct ser_console_state
*state
= (struct ser_console_state
*) scb
->state
;
770 destroy_select_thread (state
);
775 struct ser_console_ttystate
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
);
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
800 struct ser_console_state wait
;
802 /* The pex obj for our (one-stage) pipeline. */
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
;
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. */
838 /* pex_free closes ps->output. */
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
;
859 pipe_windows_open (struct serial
*scb
, const char *name
)
864 error_no_arg (_("child command"));
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
);
881 error (_("could not start pipeline"));
882 ps
->input
= pex_input_pipe (ps
->pex
, 1);
884 error (_("could not find input pipe"));
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
,
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. */
901 error (_("error starting child process '%s': %s: %s"),
902 name
, err_msg
, safe_strerror (err
));
904 error (_("error starting child process '%s': %s"),
909 ps
->output
= pex_read_output (ps
->pex
, 1);
911 error (_("could not find output pipe"));
912 scb
->fd
= fileno (ps
->output
);
914 pex_stderr
= pex_read_err (ps
->pex
, 1);
916 error (_("could not find error pipe"));
917 scb
->error_fd
= fileno (pex_stderr
);
919 scb
->state
= ps
.release ();
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+");
933 ps
->output
= fdopen (fd
, "r+");
938 scb
->state
= (void *) ps
;
943 free_pipe_state (ps
);
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
);
961 pipe_windows_read (struct serial
*scb
, size_t count
)
963 HANDLE pipeline_out
= (HANDLE
) _get_osfhandle (scb
->fd
);
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
)
976 if (! ReadFile (pipeline_out
, scb
->buf
, count
, &bytes_read
, NULL
))
977 throw_winerror_with_name (_("could not read from pipe"), GetLastError ());
984 pipe_windows_write (struct serial
*scb
, const void *buf
, size_t count
)
986 struct pipe_state
*ps
= (struct pipe_state
*) scb
->state
;
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 ());
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
);
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
)
1035 stop_select_thread (&ps
->wait
);
1039 pipe_avail (struct serial
*scb
, int fd
)
1041 HANDLE h
= (HANDLE
) _get_osfhandle (fd
);
1043 BOOL r
= PeekNamedPipe (h
, NULL
, 0, NULL
, &numBytes
, NULL
);
1051 gdb_pipe (int pdes
[2])
1053 if (_pipe (pdes
, 512, _O_BINARY
| _O_NOINHERIT
) == -1)
1058 struct net_windows_state
1060 struct ser_console_state base
;
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. */
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
);
1082 else if (available
> 0)
1084 SetEvent (state
->base
.read_event
);
1092 net_windows_select_thread (void *arg
)
1094 struct serial
*scb
= (struct serial
*) arg
;
1095 struct net_windows_state
*state
;
1098 state
= (struct net_windows_state
*) scb
->state
;
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. */
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. */
1122 if (event_index
!= WAIT_OBJECT_0
+ 1)
1124 /* Some error has occurred. Assume that this is an error
1126 SetEvent (state
->base
.except_event
);
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
);
1139 if (events
.lNetworkEvents
& FD_READ
)
1141 if (net_windows_socket_check_pending (scb
))
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
);
1155 SetEvent (state
->base
.have_stopped
);
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
1175 if (!net_windows_socket_check_pending (scb
))
1176 start_select_thread (&state
->base
);
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
);
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
);
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
);
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
);
1219 /* The serial port driver. */
1221 static const struct serial_ops hardwire_ops
=
1229 ser_windows_flush_output
,
1230 ser_windows_flush_input
,
1231 ser_windows_send_break
,
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
,
1244 ser_windows_read_prim
,
1245 ser_windows_write_prim
,
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
=
1265 ser_console_get_tty_state
,
1266 ser_base_copy_tty_state
,
1267 ser_base_set_tty_state
,
1268 ser_base_print_tty_state
,
1272 ser_base_drain_output
,
1277 ser_console_wait_handle
,
1278 ser_console_done_wait_handle
1281 /* The pipe interface. */
1283 static const struct serial_ops pipe_ops
=
1288 pipe_windows_fdopen
,
1291 ser_base_flush_output
,
1292 ser_base_flush_input
,
1293 ser_base_send_break
,
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
,
1302 ser_base_drain_output
,
1308 pipe_done_wait_handle
1311 /* The TCP/UDP socket driver. */
1313 static const struct serial_ops tcp_ops
=
1321 ser_base_flush_output
,
1322 ser_base_flush_input
,
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
,
1332 ser_base_drain_output
,
1337 net_windows_wait_handle
,
1338 net_windows_done_wait_handle
1341 void _initialize_ser_windows ();
1343 _initialize_ser_windows ()
1349 /* First find out if kernel32 exports CancelIo function. */
1350 hm
= LoadLibrary ("kernel32.dll");
1353 CancelIo
= (CancelIo_ftype
*) GetProcAddress (hm
, "CancelIo");
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. */
1369 serial_add_interface (&tcp_ops
);