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