xref: /dragonfly/contrib/gdb-7/gdb/ser-base.c (revision a563ca70)
1 /* Generic serial interface functions.
2 
3    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2003,
4    2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
5    Free Software Foundation, Inc.
6 
7    This file is part of GDB.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21 
22 #include "defs.h"
23 #include "serial.h"
24 #include "ser-base.h"
25 #include "event-loop.h"
26 
27 #include "gdb_select.h"
28 #include "gdb_string.h"
29 #include <sys/time.h>
30 #ifdef USE_WIN32API
31 #include <winsock2.h>
32 #endif
33 
34 
35 static timer_handler_func push_event;
36 static handler_func fd_event;
37 
38 /* Event handling for ASYNC serial code.
39 
40    At any time the SERIAL device either: has an empty FIFO and is
41    waiting on a FD event; or has a non-empty FIFO/error condition and
42    is constantly scheduling timer events.
43 
44    ASYNC only stops pestering its client when it is de-async'ed or it
45    is told to go away.  */
46 
47 /* Value of scb->async_state: */
48 enum {
49   /* >= 0 (TIMER_SCHEDULED) */
50   /* The ID of the currently scheduled timer event.  This state is
51      rarely encountered.  Timer events are one-off so as soon as the
52      event is delivered the state is shanged to NOTHING_SCHEDULED.  */
53   FD_SCHEDULED = -1,
54   /* The fd_event() handler is scheduled.  It is called when ever the
55      file descriptor becomes ready.  */
56   NOTHING_SCHEDULED = -2
57   /* Either no task is scheduled (just going into ASYNC mode) or a
58      timer event has just gone off and the current state has been
59      forced into nothing scheduled.  */
60 };
61 
62 /* Identify and schedule the next ASYNC task based on scb->async_state
63    and scb->buf* (the input FIFO).  A state machine is used to avoid
64    the need to make redundant calls into the event-loop - the next
65    scheduled task is only changed when needed.  */
66 
67 static void
68 reschedule (struct serial *scb)
69 {
70   if (serial_is_async_p (scb))
71     {
72       int next_state;
73 
74       switch (scb->async_state)
75 	{
76 	case FD_SCHEDULED:
77 	  if (scb->bufcnt == 0)
78 	    next_state = FD_SCHEDULED;
79 	  else
80 	    {
81 	      delete_file_handler (scb->fd);
82 	      next_state = create_timer (0, push_event, scb);
83 	    }
84 	  break;
85 	case NOTHING_SCHEDULED:
86 	  if (scb->bufcnt == 0)
87 	    {
88 	      add_file_handler (scb->fd, fd_event, scb);
89 	      next_state = FD_SCHEDULED;
90 	    }
91 	  else
92 	    {
93 	      next_state = create_timer (0, push_event, scb);
94 	    }
95 	  break;
96 	default: /* TIMER SCHEDULED */
97 	  if (scb->bufcnt == 0)
98 	    {
99 	      delete_timer (scb->async_state);
100 	      add_file_handler (scb->fd, fd_event, scb);
101 	      next_state = FD_SCHEDULED;
102 	    }
103 	  else
104 	    next_state = scb->async_state;
105 	  break;
106 	}
107       if (serial_debug_p (scb))
108 	{
109 	  switch (next_state)
110 	    {
111 	    case FD_SCHEDULED:
112 	      if (scb->async_state != FD_SCHEDULED)
113 		fprintf_unfiltered (gdb_stdlog, "[fd%d->fd-scheduled]\n",
114 				    scb->fd);
115 	      break;
116 	    default: /* TIMER SCHEDULED */
117 	      if (scb->async_state == FD_SCHEDULED)
118 		fprintf_unfiltered (gdb_stdlog, "[fd%d->timer-scheduled]\n",
119 				    scb->fd);
120 	      break;
121 	    }
122 	}
123       scb->async_state = next_state;
124     }
125 }
126 
127 /* FD_EVENT: This is scheduled when the input FIFO is empty (and there
128    is no pending error).  As soon as data arrives, it is read into the
129    input FIFO and the client notified.  The client should then drain
130    the FIFO using readchar().  If the FIFO isn't immediatly emptied,
131    push_event() is used to nag the client until it is.  */
132 
133 static void
134 fd_event (int error, void *context)
135 {
136   struct serial *scb = context;
137   if (error != 0)
138     {
139       scb->bufcnt = SERIAL_ERROR;
140     }
141   else if (scb->bufcnt == 0)
142     {
143       /* Prime the input FIFO.  The readchar() function is used to
144          pull characters out of the buffer.  See also
145          generic_readchar().  */
146       int nr;
147       nr = scb->ops->read_prim (scb, BUFSIZ);
148       if (nr == 0)
149 	{
150 	  scb->bufcnt = SERIAL_EOF;
151 	}
152       else if (nr > 0)
153 	{
154 	  scb->bufcnt = nr;
155 	  scb->bufp = scb->buf;
156 	}
157       else
158 	{
159 	  scb->bufcnt = SERIAL_ERROR;
160 	}
161     }
162   scb->async_handler (scb, scb->async_context);
163   reschedule (scb);
164 }
165 
166 /* PUSH_EVENT: The input FIFO is non-empty (or there is a pending
167    error).  Nag the client until all the data has been read.  In the
168    case of errors, the client will need to close or de-async the
169    device before naging stops.  */
170 
171 static void
172 push_event (void *context)
173 {
174   struct serial *scb = context;
175 
176   scb->async_state = NOTHING_SCHEDULED; /* Timers are one-off */
177   scb->async_handler (scb, scb->async_context);
178   /* re-schedule */
179   reschedule (scb);
180 }
181 
182 /* Wait for input on scb, with timeout seconds.  Returns 0 on success,
183    otherwise SERIAL_TIMEOUT or SERIAL_ERROR.  */
184 
185 static int
186 ser_base_wait_for (struct serial *scb, int timeout)
187 {
188   while (1)
189     {
190       int numfds;
191       struct timeval tv;
192       fd_set readfds, exceptfds;
193 
194       /* NOTE: Some OS's can scramble the READFDS when the select()
195          call fails (ex the kernel with Red Hat 5.2).  Initialize all
196          arguments before each call.  */
197 
198       tv.tv_sec = timeout;
199       tv.tv_usec = 0;
200 
201       FD_ZERO (&readfds);
202       FD_ZERO (&exceptfds);
203       FD_SET (scb->fd, &readfds);
204       FD_SET (scb->fd, &exceptfds);
205 
206       if (timeout >= 0)
207 	numfds = gdb_select (scb->fd + 1, &readfds, 0, &exceptfds, &tv);
208       else
209 	numfds = gdb_select (scb->fd + 1, &readfds, 0, &exceptfds, 0);
210 
211       if (numfds <= 0)
212 	{
213 	  if (numfds == 0)
214 	    return SERIAL_TIMEOUT;
215 	  else if (errno == EINTR)
216 	    continue;
217 	  else
218 	    return SERIAL_ERROR;	/* Got an error from select or
219 					   poll.  */
220 	}
221 
222       return 0;
223     }
224 }
225 
226 /* Read a character with user-specified timeout.  TIMEOUT is number of seconds
227    to wait, or -1 to wait forever.  Use timeout of 0 to effect a poll.  Returns
228    char if successful.  Returns -2 if timeout expired, EOF if line dropped
229    dead, or -3 for any other error (see errno in that case).  */
230 
231 static int
232 do_ser_base_readchar (struct serial *scb, int timeout)
233 {
234   int status;
235   int delta;
236 
237   /* We have to be able to keep the GUI alive here, so we break the
238      original timeout into steps of 1 second, running the "keep the
239      GUI alive" hook each time through the loop.
240 
241      Also, timeout = 0 means to poll, so we just set the delta to 0,
242      so we will only go through the loop once.  */
243 
244   delta = (timeout == 0 ? 0 : 1);
245   while (1)
246     {
247       /* N.B. The UI may destroy our world (for instance by calling
248          remote_stop,) in which case we want to get out of here as
249          quickly as possible.  It is not safe to touch scb, since
250          someone else might have freed it.  The
251          deprecated_ui_loop_hook signals that we should exit by
252          returning 1.  */
253 
254       if (deprecated_ui_loop_hook)
255 	{
256 	  if (deprecated_ui_loop_hook (0))
257 	    return SERIAL_TIMEOUT;
258 	}
259 
260       status = ser_base_wait_for (scb, delta);
261       if (timeout > 0)
262         timeout -= delta;
263 
264       /* If we got a character or an error back from wait_for, then we can
265          break from the loop before the timeout is completed.  */
266       if (status != SERIAL_TIMEOUT)
267 	break;
268 
269       /* If we have exhausted the original timeout, then generate
270          a SERIAL_TIMEOUT, and pass it out of the loop.  */
271       else if (timeout == 0)
272 	{
273 	  status = SERIAL_TIMEOUT;
274 	  break;
275 	}
276     }
277 
278   if (status < 0)
279     return status;
280 
281   status = scb->ops->read_prim (scb, BUFSIZ);
282 
283   if (status <= 0)
284     {
285       if (status == 0)
286         return SERIAL_EOF;
287       else
288 	/* Got an error from read.  */
289 	return SERIAL_ERROR;
290     }
291 
292   scb->bufcnt = status;
293   scb->bufcnt--;
294   scb->bufp = scb->buf;
295   return *scb->bufp++;
296 }
297 
298 /* Perform operations common to both old and new readchar.  */
299 
300 /* Return the next character from the input FIFO.  If the FIFO is
301    empty, call the SERIAL specific routine to try and read in more
302    characters.
303 
304    Initially data from the input FIFO is returned (fd_event()
305    pre-reads the input into that FIFO.  Once that has been emptied,
306    further data is obtained by polling the input FD using the device
307    specific readchar() function.  Note: reschedule() is called after
308    every read.  This is because there is no guarentee that the lower
309    level fd_event() poll_event() code (which also calls reschedule())
310    will be called.  */
311 
312 int
313 generic_readchar (struct serial *scb, int timeout,
314 		  int (do_readchar) (struct serial *scb, int timeout))
315 {
316   int ch;
317   if (scb->bufcnt > 0)
318     {
319       ch = *scb->bufp;
320       scb->bufcnt--;
321       scb->bufp++;
322     }
323   else if (scb->bufcnt < 0)
324     {
325       /* Some errors/eof are are sticky.  */
326       ch = scb->bufcnt;
327     }
328   else
329     {
330       ch = do_readchar (scb, timeout);
331       if (ch < 0)
332 	{
333 	  switch ((enum serial_rc) ch)
334 	    {
335 	    case SERIAL_EOF:
336 	    case SERIAL_ERROR:
337 	      /* Make the error/eof stick.  */
338 	      scb->bufcnt = ch;
339 	      break;
340 	    case SERIAL_TIMEOUT:
341 	      scb->bufcnt = 0;
342 	      break;
343 	    }
344 	}
345     }
346   /* Read any error output we might have.  */
347   if (scb->error_fd != -1)
348     {
349       ssize_t s;
350       char buf[81];
351 
352       for (;;)
353         {
354  	  char *current;
355  	  char *newline;
356 	  int to_read = 80;
357 
358 	  int num_bytes = -1;
359 	  if (scb->ops->avail)
360 	    num_bytes = (scb->ops->avail)(scb, scb->error_fd);
361 	  if (num_bytes != -1)
362 	    to_read = (num_bytes < to_read) ? num_bytes : to_read;
363 
364 	  if (to_read == 0)
365 	    break;
366 
367 	  s = read (scb->error_fd, &buf, to_read);
368 	  if (s == -1)
369 	    break;
370 	  if (s == 0)
371 	    {
372 	      /* EOF */
373 	      close (scb->error_fd);
374 	      scb->error_fd = -1;
375 	      break;
376 	    }
377 
378 	  /* In theory, embedded newlines are not a problem.
379 	     But for MI, we want each output line to have just
380 	     one newline for legibility.  So output things
381 	     in newline chunks.  */
382 	  buf[s] = '\0';
383 	  current = buf;
384 	  while ((newline = strstr (current, "\n")) != NULL)
385 	    {
386 	      *newline = '\0';
387 	      fputs_unfiltered (current, gdb_stderr);
388 	      fputs_unfiltered ("\n", gdb_stderr);
389 	      current = newline + 1;
390 	    }
391 	  fputs_unfiltered (current, gdb_stderr);
392 	}
393     }
394 
395   reschedule (scb);
396   return ch;
397 }
398 
399 int
400 ser_base_readchar (struct serial *scb, int timeout)
401 {
402   return generic_readchar (scb, timeout, do_ser_base_readchar);
403 }
404 
405 int
406 ser_base_write (struct serial *scb, const char *str, int len)
407 {
408   int cc;
409 
410   while (len > 0)
411     {
412       cc = scb->ops->write_prim (scb, str, len);
413 
414       if (cc < 0)
415 	return 1;
416       len -= cc;
417       str += cc;
418     }
419   return 0;
420 }
421 
422 int
423 ser_base_flush_output (struct serial *scb)
424 {
425   return 0;
426 }
427 
428 int
429 ser_base_flush_input (struct serial *scb)
430 {
431   if (scb->bufcnt >= 0)
432     {
433       scb->bufcnt = 0;
434       scb->bufp = scb->buf;
435       return 0;
436     }
437   else
438     return SERIAL_ERROR;
439 }
440 
441 int
442 ser_base_send_break (struct serial *scb)
443 {
444   return 0;
445 }
446 
447 int
448 ser_base_drain_output (struct serial *scb)
449 {
450   return 0;
451 }
452 
453 void
454 ser_base_raw (struct serial *scb)
455 {
456   return;			/* Always in raw mode.  */
457 }
458 
459 serial_ttystate
460 ser_base_get_tty_state (struct serial *scb)
461 {
462   /* Allocate a dummy.  */
463   return (serial_ttystate) XMALLOC (int);
464 }
465 
466 serial_ttystate
467 ser_base_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
468 {
469   /* Allocate another dummy.  */
470   return (serial_ttystate) XMALLOC (int);
471 }
472 
473 int
474 ser_base_set_tty_state (struct serial *scb, serial_ttystate ttystate)
475 {
476   return 0;
477 }
478 
479 int
480 ser_base_noflush_set_tty_state (struct serial *scb,
481 				serial_ttystate new_ttystate,
482 				serial_ttystate old_ttystate)
483 {
484   return 0;
485 }
486 
487 void
488 ser_base_print_tty_state (struct serial *scb,
489 			  serial_ttystate ttystate,
490 			  struct ui_file *stream)
491 {
492   /* Nothing to print.  */
493   return;
494 }
495 
496 int
497 ser_base_setbaudrate (struct serial *scb, int rate)
498 {
499   return 0;			/* Never fails!  */
500 }
501 
502 int
503 ser_base_setstopbits (struct serial *scb, int num)
504 {
505   return 0;			/* Never fails!  */
506 }
507 
508 /* Put the SERIAL device into/out-of ASYNC mode.  */
509 
510 void
511 ser_base_async (struct serial *scb,
512 		int async_p)
513 {
514   if (async_p)
515     {
516       /* Force a re-schedule.  */
517       scb->async_state = NOTHING_SCHEDULED;
518       if (serial_debug_p (scb))
519 	fprintf_unfiltered (gdb_stdlog, "[fd%d->asynchronous]\n",
520 			    scb->fd);
521       reschedule (scb);
522     }
523   else
524     {
525       if (serial_debug_p (scb))
526 	fprintf_unfiltered (gdb_stdlog, "[fd%d->synchronous]\n",
527 			    scb->fd);
528       /* De-schedule whatever tasks are currently scheduled.  */
529       switch (scb->async_state)
530 	{
531 	case FD_SCHEDULED:
532 	  delete_file_handler (scb->fd);
533 	  break;
534 	case NOTHING_SCHEDULED:
535 	  break;
536 	default: /* TIMER SCHEDULED */
537 	  delete_timer (scb->async_state);
538 	  break;
539 	}
540     }
541 }
542