Set dynamic tag VMA and size from dynamic section when possible
[external/binutils.git] / gdb / ser-mingw.c
1 /* Serial interface for local (hardwired) serial ports on Windows systems
2
3    Copyright (C) 2006-2016 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 typedef BOOL WINAPI (CancelIo_ftype) (HANDLE);
48 static CancelIo_ftype *CancelIo;
49
50 /* Open up a real live device for serial I/O.  */
51
52 static int
53 ser_windows_open (struct serial *scb, const char *name)
54 {
55   HANDLE h;
56   struct ser_windows_state *state;
57   COMMTIMEOUTS timeouts;
58
59   h = CreateFile (name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
60                   OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
61   if (h == INVALID_HANDLE_VALUE)
62     {
63       errno = ENOENT;
64       return -1;
65     }
66
67   scb->fd = _open_osfhandle ((intptr_t) h, O_RDWR);
68   if (scb->fd < 0)
69     {
70       errno = ENOENT;
71       return -1;
72     }
73
74   if (!SetCommMask (h, EV_RXCHAR))
75     {
76       errno = EINVAL;
77       return -1;
78     }
79
80   timeouts.ReadIntervalTimeout = MAXDWORD;
81   timeouts.ReadTotalTimeoutConstant = 0;
82   timeouts.ReadTotalTimeoutMultiplier = 0;
83   timeouts.WriteTotalTimeoutConstant = 0;
84   timeouts.WriteTotalTimeoutMultiplier = 0;
85   if (!SetCommTimeouts (h, &timeouts))
86     {
87       errno = EINVAL;
88       return -1;
89     }
90
91   state = XCNEW (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 = (struct ser_windows_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 = (struct ser_windows_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 = (struct ser_windows_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 = (struct serial *) arg;
537   struct ser_console_state *state;
538   int event_index;
539   HANDLE h;
540
541   state = (struct ser_console_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 = (struct serial *) arg;
640   struct ser_console_state *state;
641   int event_index;
642   HANDLE h;
643
644   state = (struct ser_console_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 = (struct serial *) arg;
683   struct ser_console_state *state;
684   int event_index;
685   HANDLE h;
686
687   state = (struct ser_console_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 = (struct ser_console_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 = XCNEW (struct ser_console_state);
724       scb->state = state;
725
726       if (is_tty)
727         thread_fn = console_select_thread;
728       else if (fd_is_pipe (scb->fd))
729         thread_fn = pipe_select_thread;
730       else
731         thread_fn = file_select_thread;
732
733       create_select_thread (thread_fn, scb, state);
734     }
735
736   *read = state->read_event;
737   *except = state->except_event;
738
739   /* Start from a blank state.  */
740   ResetEvent (state->read_event);
741   ResetEvent (state->except_event);
742   ResetEvent (state->stop_select);
743
744   /* First check for a key already in the buffer.  If there is one,
745      we don't need a thread.  This also catches the second key of
746      multi-character returns from getch, for instance for arrow
747      keys.  The second half is in a C library internal buffer,
748      and PeekConsoleInput will not find it.  */
749   if (_kbhit ())
750     {
751       SetEvent (state->read_event);
752       return;
753     }
754
755   /* Otherwise, start the select thread.  */
756   start_select_thread (state);
757 }
758
759 static void
760 ser_console_done_wait_handle (struct serial *scb)
761 {
762   struct ser_console_state *state = (struct ser_console_state *) scb->state;
763
764   if (state == NULL)
765     return;
766
767   stop_select_thread (state);
768 }
769
770 static void
771 ser_console_close (struct serial *scb)
772 {
773   struct ser_console_state *state = (struct ser_console_state *) scb->state;
774
775   if (scb->state)
776     {
777       destroy_select_thread (state);
778       xfree (scb->state);
779     }
780 }
781
782 struct ser_console_ttystate
783 {
784   int is_a_tty;
785 };
786
787 static serial_ttystate
788 ser_console_get_tty_state (struct serial *scb)
789 {
790   if (isatty (scb->fd))
791     {
792       struct ser_console_ttystate *state;
793
794       state = XNEW (struct ser_console_ttystate);
795       state->is_a_tty = 1;
796       return state;
797     }
798   else
799     return NULL;
800 }
801
802 struct pipe_state
803 {
804   /* Since we use the pipe_select_thread for our select emulation,
805      we need to place the state structure it requires at the front
806      of our state.  */
807   struct ser_console_state wait;
808
809   /* The pex obj for our (one-stage) pipeline.  */
810   struct pex_obj *pex;
811
812   /* Streams for the pipeline's input and output.  */
813   FILE *input, *output;
814 };
815
816 static struct pipe_state *
817 make_pipe_state (void)
818 {
819   struct pipe_state *ps = XCNEW (struct pipe_state);
820
821   ps->wait.read_event = INVALID_HANDLE_VALUE;
822   ps->wait.except_event = INVALID_HANDLE_VALUE;
823   ps->wait.start_select = INVALID_HANDLE_VALUE;
824   ps->wait.stop_select = INVALID_HANDLE_VALUE;
825
826   return ps;
827 }
828
829 static void
830 free_pipe_state (struct pipe_state *ps)
831 {
832   int saved_errno = errno;
833
834   if (ps->wait.read_event != INVALID_HANDLE_VALUE)
835     destroy_select_thread (&ps->wait);
836
837   /* Close the pipe to the child.  We must close the pipe before
838      calling pex_free because pex_free will wait for the child to exit
839      and the child will not exit until the pipe is closed.  */
840   if (ps->input)
841     fclose (ps->input);
842   if (ps->pex)
843     {
844       pex_free (ps->pex);
845       /* pex_free closes ps->output.  */
846     }
847   else if (ps->output)
848     fclose (ps->output);
849
850   xfree (ps);
851
852   errno = saved_errno;
853 }
854
855 static void
856 cleanup_pipe_state (void *untyped)
857 {
858   struct pipe_state *ps = (struct pipe_state *) untyped;
859
860   free_pipe_state (ps);
861 }
862
863 static int
864 pipe_windows_open (struct serial *scb, const char *name)
865 {
866   struct pipe_state *ps;
867   FILE *pex_stderr;
868   char **argv;
869   struct cleanup *back_to;
870
871   if (name == NULL)
872     error_no_arg (_("child command"));
873
874   argv = gdb_buildargv (name);
875   back_to = make_cleanup_freeargv (argv);
876
877   if (! argv[0] || argv[0][0] == '\0')
878     error (_("missing child command"));
879
880   ps = make_pipe_state ();
881   make_cleanup (cleanup_pipe_state, ps);
882
883   ps->pex = pex_init (PEX_USE_PIPES, "target remote pipe", NULL);
884   if (! ps->pex)
885     goto fail;
886   ps->input = pex_input_pipe (ps->pex, 1);
887   if (! ps->input)
888     goto fail;
889
890   {
891     int err;
892     const char *err_msg
893       = pex_run (ps->pex, PEX_SEARCH | PEX_BINARY_INPUT | PEX_BINARY_OUTPUT
894                  | PEX_STDERR_TO_PIPE,
895                  argv[0], argv, NULL, NULL,
896                  &err);
897
898     if (err_msg)
899       {
900         /* Our caller expects us to return -1, but all they'll do with
901            it generally is print the message based on errno.  We have
902            all the same information here, plus err_msg provided by
903            pex_run, so we just raise the error here.  */
904         if (err)
905           error (_("error starting child process '%s': %s: %s"),
906                  name, err_msg, safe_strerror (err));
907         else
908           error (_("error starting child process '%s': %s"),
909                  name, err_msg);
910       }
911   }
912
913   ps->output = pex_read_output (ps->pex, 1);
914   if (! ps->output)
915     goto fail;
916   scb->fd = fileno (ps->output);
917
918   pex_stderr = pex_read_err (ps->pex, 1);
919   if (! pex_stderr)
920     goto fail;
921   scb->error_fd = fileno (pex_stderr);
922
923   scb->state = (void *) ps;
924
925   discard_cleanups (back_to);
926   return 0;
927
928  fail:
929   do_cleanups (back_to);
930   return -1;
931 }
932
933 static int
934 pipe_windows_fdopen (struct serial *scb, int fd)
935 {
936   struct pipe_state *ps;
937
938   ps = make_pipe_state ();
939
940   ps->input = fdopen (fd, "r+");
941   if (! ps->input)
942     goto fail;
943
944   ps->output = fdopen (fd, "r+");
945   if (! ps->output)
946     goto fail;
947
948   scb->fd = fd;
949   scb->state = (void *) ps;
950
951   return 0;
952
953  fail:
954   free_pipe_state (ps);
955   return -1;
956 }
957
958 static void
959 pipe_windows_close (struct serial *scb)
960 {
961   struct pipe_state *ps = (struct pipe_state *) scb->state;
962
963   /* In theory, we should try to kill the subprocess here, but the pex
964      interface doesn't give us enough information to do that.  Usually
965      closing the input pipe will get the message across.  */
966
967   free_pipe_state (ps);
968 }
969
970
971 static int
972 pipe_windows_read (struct serial *scb, size_t count)
973 {
974   HANDLE pipeline_out = (HANDLE) _get_osfhandle (scb->fd);
975   DWORD available;
976   DWORD bytes_read;
977
978   if (pipeline_out == INVALID_HANDLE_VALUE)
979     return -1;
980
981   if (! PeekNamedPipe (pipeline_out, NULL, 0, NULL, &available, NULL))
982     return -1;
983
984   if (count > available)
985     count = available;
986
987   if (! ReadFile (pipeline_out, scb->buf, count, &bytes_read, NULL))
988     return -1;
989
990   return bytes_read;
991 }
992
993
994 static int
995 pipe_windows_write (struct serial *scb, const void *buf, size_t count)
996 {
997   struct pipe_state *ps = (struct pipe_state *) scb->state;
998   HANDLE pipeline_in;
999   DWORD written;
1000
1001   int pipeline_in_fd = fileno (ps->input);
1002   if (pipeline_in_fd < 0)
1003     return -1;
1004
1005   pipeline_in = (HANDLE) _get_osfhandle (pipeline_in_fd);
1006   if (pipeline_in == INVALID_HANDLE_VALUE)
1007     return -1;
1008
1009   if (! WriteFile (pipeline_in, buf, count, &written, NULL))
1010     return -1;
1011
1012   return written;
1013 }
1014
1015
1016 static void
1017 pipe_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
1018 {
1019   struct pipe_state *ps = (struct pipe_state *) scb->state;
1020
1021   /* Have we allocated our events yet?  */
1022   if (ps->wait.read_event == INVALID_HANDLE_VALUE)
1023     /* Start the thread.  */
1024     create_select_thread (pipe_select_thread, scb, &ps->wait);
1025
1026   *read = ps->wait.read_event;
1027   *except = ps->wait.except_event;
1028
1029   /* Start from a blank state.  */
1030   ResetEvent (ps->wait.read_event);
1031   ResetEvent (ps->wait.except_event);
1032   ResetEvent (ps->wait.stop_select);
1033
1034   start_select_thread (&ps->wait);
1035 }
1036
1037 static void
1038 pipe_done_wait_handle (struct serial *scb)
1039 {
1040   struct pipe_state *ps = (struct pipe_state *) scb->state;
1041
1042   /* Have we allocated our events yet?  */
1043   if (ps->wait.read_event == INVALID_HANDLE_VALUE)
1044     return;
1045
1046   stop_select_thread (&ps->wait);
1047 }
1048
1049 static int
1050 pipe_avail (struct serial *scb, int fd)
1051 {
1052   HANDLE h = (HANDLE) _get_osfhandle (fd);
1053   DWORD numBytes;
1054   BOOL r = PeekNamedPipe (h, NULL, 0, NULL, &numBytes, NULL);
1055
1056   if (r == FALSE)
1057     numBytes = 0;
1058   return numBytes;
1059 }
1060
1061 int
1062 gdb_pipe (int pdes[2])
1063 {
1064   if (_pipe (pdes, 512, _O_BINARY | _O_NOINHERIT) == -1)
1065     return -1;
1066   return 0;
1067 }
1068
1069 struct net_windows_state
1070 {
1071   struct ser_console_state base;
1072   
1073   HANDLE sock_event;
1074 };
1075
1076 /* Check whether the socket has any pending data to be read.  If so,
1077    set the select thread's read event.  On error, set the select
1078    thread's except event.  If any event was set, return true,
1079    otherwise return false.  */
1080
1081 static int
1082 net_windows_socket_check_pending (struct serial *scb)
1083 {
1084   struct net_windows_state *state = (struct net_windows_state *) scb->state;
1085   unsigned long available;
1086
1087   if (ioctlsocket (scb->fd, FIONREAD, &available) != 0)
1088     {
1089       /* The socket closed, or some other error.  */
1090       SetEvent (state->base.except_event);
1091       return 1;
1092     }
1093   else if (available > 0)
1094     {
1095       SetEvent (state->base.read_event);
1096       return 1;
1097     }
1098
1099   return 0;
1100 }
1101
1102 static DWORD WINAPI
1103 net_windows_select_thread (void *arg)
1104 {
1105   struct serial *scb = (struct serial *) arg;
1106   struct net_windows_state *state;
1107   int event_index;
1108
1109   state = (struct net_windows_state *) scb->state;
1110
1111   while (1)
1112     {
1113       HANDLE wait_events[2];
1114       WSANETWORKEVENTS events;
1115
1116       select_thread_wait (&state->base);
1117
1118       wait_events[0] = state->base.stop_select;
1119       wait_events[1] = state->sock_event;
1120
1121       /* Wait for something to happen on the socket.  */
1122       while (1)
1123         {
1124           event_index = WaitForMultipleObjects (2, wait_events, FALSE, INFINITE);
1125
1126           if (event_index == WAIT_OBJECT_0
1127               || WaitForSingleObject (state->base.stop_select, 0) == WAIT_OBJECT_0)
1128             {
1129               /* We have been requested to stop.  */
1130               break;
1131             }
1132
1133           if (event_index != WAIT_OBJECT_0 + 1)
1134             {
1135               /* Some error has occured.  Assume that this is an error
1136                  condition.  */
1137               SetEvent (state->base.except_event);
1138               break;
1139             }
1140
1141           /* Enumerate the internal network events, and reset the
1142              object that signalled us to catch the next event.  */
1143           if (WSAEnumNetworkEvents (scb->fd, state->sock_event, &events) != 0)
1144             {
1145               /* Something went wrong.  Maybe the socket is gone.  */
1146               SetEvent (state->base.except_event);
1147               break;
1148             }
1149
1150           if (events.lNetworkEvents & FD_READ)
1151             {
1152               if (net_windows_socket_check_pending (scb))
1153                 break;
1154
1155               /* Spurious wakeup.  That is, the socket's event was
1156                  signalled before we last called recv.  */
1157             }
1158
1159           if (events.lNetworkEvents & FD_CLOSE)
1160             {
1161               SetEvent (state->base.except_event);
1162               break;
1163             }
1164         }
1165
1166       SetEvent (state->base.have_stopped);
1167     }
1168   return 0;
1169 }
1170
1171 static void
1172 net_windows_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
1173 {
1174   struct net_windows_state *state = (struct net_windows_state *) scb->state;
1175
1176   /* Start from a clean slate.  */
1177   ResetEvent (state->base.read_event);
1178   ResetEvent (state->base.except_event);
1179   ResetEvent (state->base.stop_select);
1180
1181   *read = state->base.read_event;
1182   *except = state->base.except_event;
1183
1184   /* Check any pending events.  Otherwise, start the select
1185      thread.  */
1186   if (!net_windows_socket_check_pending (scb))
1187     start_select_thread (&state->base);
1188 }
1189
1190 static void
1191 net_windows_done_wait_handle (struct serial *scb)
1192 {
1193   struct net_windows_state *state = (struct net_windows_state *) scb->state;
1194
1195   stop_select_thread (&state->base);
1196 }
1197
1198 static int
1199 net_windows_open (struct serial *scb, const char *name)
1200 {
1201   struct net_windows_state *state;
1202   int ret;
1203   DWORD threadId;
1204
1205   ret = net_open (scb, name);
1206   if (ret != 0)
1207     return ret;
1208
1209   state = XCNEW (struct net_windows_state);
1210   scb->state = state;
1211
1212   /* Associate an event with the socket.  */
1213   state->sock_event = CreateEvent (0, TRUE, FALSE, 0);
1214   WSAEventSelect (scb->fd, state->sock_event, FD_READ | FD_CLOSE);
1215
1216   /* Start the thread.  */
1217   create_select_thread (net_windows_select_thread, scb, &state->base);
1218
1219   return 0;
1220 }
1221
1222
1223 static void
1224 net_windows_close (struct serial *scb)
1225 {
1226   struct net_windows_state *state = (struct net_windows_state *) scb->state;
1227
1228   destroy_select_thread (&state->base);
1229   CloseHandle (state->sock_event);
1230
1231   xfree (scb->state);
1232
1233   net_close (scb);
1234 }
1235
1236 /* The serial port driver.  */
1237
1238 static const struct serial_ops hardwire_ops =
1239 {
1240   "hardwire",
1241   ser_windows_open,
1242   ser_windows_close,
1243   NULL,
1244   ser_base_readchar,
1245   ser_base_write,
1246   ser_windows_flush_output,
1247   ser_windows_flush_input,
1248   ser_windows_send_break,
1249   ser_windows_raw,
1250   /* These are only used for stdin; we do not need them for serial
1251      ports, so supply the standard dummies.  */
1252   ser_base_get_tty_state,
1253   ser_base_copy_tty_state,
1254   ser_base_set_tty_state,
1255   ser_base_print_tty_state,
1256   ser_base_noflush_set_tty_state,
1257   ser_windows_setbaudrate,
1258   ser_windows_setstopbits,
1259   ser_windows_setparity,
1260   ser_windows_drain_output,
1261   ser_base_async,
1262   ser_windows_read_prim,
1263   ser_windows_write_prim,
1264   NULL,
1265   ser_windows_wait_handle
1266 };
1267
1268 /* The dummy serial driver used for terminals.  We only provide the
1269    TTY-related methods.  */
1270
1271 static const struct serial_ops tty_ops =
1272 {
1273   "terminal",
1274   NULL,
1275   ser_console_close,
1276   NULL,
1277   NULL,
1278   NULL,
1279   NULL,
1280   NULL,
1281   NULL,
1282   NULL,
1283   ser_console_get_tty_state,
1284   ser_base_copy_tty_state,
1285   ser_base_set_tty_state,
1286   ser_base_print_tty_state,
1287   ser_base_noflush_set_tty_state,
1288   NULL,
1289   NULL,
1290   NULL,
1291   ser_base_drain_output,
1292   NULL,
1293   NULL,
1294   NULL,
1295   NULL,
1296   ser_console_wait_handle,
1297   ser_console_done_wait_handle
1298 };
1299
1300 /* The pipe interface.  */
1301
1302 static const struct serial_ops pipe_ops =
1303 {
1304   "pipe",
1305   pipe_windows_open,
1306   pipe_windows_close,
1307   pipe_windows_fdopen,
1308   ser_base_readchar,
1309   ser_base_write,
1310   ser_base_flush_output,
1311   ser_base_flush_input,
1312   ser_base_send_break,
1313   ser_base_raw,
1314   ser_base_get_tty_state,
1315   ser_base_copy_tty_state,
1316   ser_base_set_tty_state,
1317   ser_base_print_tty_state,
1318   ser_base_noflush_set_tty_state,
1319   ser_base_setbaudrate,
1320   ser_base_setstopbits,
1321   ser_base_setparity,
1322   ser_base_drain_output,
1323   ser_base_async,
1324   pipe_windows_read,
1325   pipe_windows_write,
1326   pipe_avail,
1327   pipe_wait_handle,
1328   pipe_done_wait_handle
1329 };
1330
1331 /* The TCP/UDP socket driver.  */
1332
1333 static const struct serial_ops tcp_ops =
1334 {
1335   "tcp",
1336   net_windows_open,
1337   net_windows_close,
1338   NULL,
1339   ser_base_readchar,
1340   ser_base_write,
1341   ser_base_flush_output,
1342   ser_base_flush_input,
1343   ser_tcp_send_break,
1344   ser_base_raw,
1345   ser_base_get_tty_state,
1346   ser_base_copy_tty_state,
1347   ser_base_set_tty_state,
1348   ser_base_print_tty_state,
1349   ser_base_noflush_set_tty_state,
1350   ser_base_setbaudrate,
1351   ser_base_setstopbits,
1352   ser_base_setparity,
1353   ser_base_drain_output,
1354   ser_base_async,
1355   net_read_prim,
1356   net_write_prim,
1357   NULL,
1358   net_windows_wait_handle,
1359   net_windows_done_wait_handle
1360 };
1361
1362 void
1363 _initialize_ser_windows (void)
1364 {
1365   WSADATA wsa_data;
1366   struct serial_ops *ops;
1367
1368   HMODULE hm = NULL;
1369
1370   /* First find out if kernel32 exports CancelIo function.  */
1371   hm = LoadLibrary ("kernel32.dll");
1372   if (hm)
1373     {
1374       CancelIo = (CancelIo_ftype *) GetProcAddress (hm, "CancelIo");
1375       FreeLibrary (hm);
1376     }
1377   else
1378     CancelIo = NULL;
1379
1380   serial_add_interface (&hardwire_ops);
1381   serial_add_interface (&tty_ops);
1382   serial_add_interface (&pipe_ops);
1383
1384   /* If WinSock works, register the TCP/UDP socket driver.  */
1385
1386   if (WSAStartup (MAKEWORD (1, 0), &wsa_data) != 0)
1387     /* WinSock is unavailable.  */
1388     return;
1389
1390   serial_add_interface (&tcp_ops);
1391 }