xref: /openbsd-src/gnu/usr.bin/binutils/gdb/ser-unix.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
1e93f7393Sniklas /* Serial interface for local (hardwired) serial ports on Un*x like systems
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
4b725ae77Skettenis    2003, 2004 Free Software Foundation, Inc.
5e93f7393Sniklas 
6e93f7393Sniklas    This file is part of GDB.
7e93f7393Sniklas 
8e93f7393Sniklas    This program is free software; you can redistribute it and/or modify
9e93f7393Sniklas    it under the terms of the GNU General Public License as published by
10e93f7393Sniklas    the Free Software Foundation; either version 2 of the License, or
11e93f7393Sniklas    (at your option) any later version.
12e93f7393Sniklas 
13e93f7393Sniklas    This program is distributed in the hope that it will be useful,
14e93f7393Sniklas    but WITHOUT ANY WARRANTY; without even the implied warranty of
15e93f7393Sniklas    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16e93f7393Sniklas    GNU General Public License for more details.
17e93f7393Sniklas 
18e93f7393Sniklas    You should have received a copy of the GNU General Public License
19e93f7393Sniklas    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22e93f7393Sniklas 
23e93f7393Sniklas #include "defs.h"
24e93f7393Sniklas #include "serial.h"
25b725ae77Skettenis #include "ser-unix.h"
26b725ae77Skettenis 
27e93f7393Sniklas #include <fcntl.h>
28e93f7393Sniklas #include <sys/types.h>
29e93f7393Sniklas #include "terminal.h"
30b725ae77Skettenis #include <sys/socket.h>
31b725ae77Skettenis #include <sys/time.h>
32b725ae77Skettenis 
33b725ae77Skettenis #include "gdb_string.h"
34b725ae77Skettenis #include "event-loop.h"
35e93f7393Sniklas 
36e93f7393Sniklas #ifdef HAVE_TERMIOS
37e93f7393Sniklas 
38e93f7393Sniklas struct hardwire_ttystate
39e93f7393Sniklas   {
40e93f7393Sniklas     struct termios termios;
41e93f7393Sniklas   };
42e93f7393Sniklas #endif /* termios */
43e93f7393Sniklas 
44e93f7393Sniklas #ifdef HAVE_TERMIO
45e93f7393Sniklas 
46e93f7393Sniklas /* It is believed that all systems which have added job control to SVR3
47e93f7393Sniklas    (e.g. sco) have also added termios.  Even if not, trying to figure out
48e93f7393Sniklas    all the variations (TIOCGPGRP vs. TCGETPGRP, etc.) would be pretty
49e93f7393Sniklas    bewildering.  So we don't attempt it.  */
50e93f7393Sniklas 
51e93f7393Sniklas struct hardwire_ttystate
52e93f7393Sniklas   {
53e93f7393Sniklas     struct termio termio;
54e93f7393Sniklas   };
55e93f7393Sniklas #endif /* termio */
56e93f7393Sniklas 
57e93f7393Sniklas #ifdef HAVE_SGTTY
58e93f7393Sniklas struct hardwire_ttystate
59e93f7393Sniklas   {
60e93f7393Sniklas     struct sgttyb sgttyb;
61e93f7393Sniklas     struct tchars tc;
62e93f7393Sniklas     struct ltchars ltc;
63e93f7393Sniklas     /* Line discipline flags.  */
64e93f7393Sniklas     int lmode;
65e93f7393Sniklas   };
66e93f7393Sniklas #endif /* sgtty */
67e93f7393Sniklas 
68b725ae77Skettenis static int hardwire_open (struct serial *scb, const char *name);
69b725ae77Skettenis static void hardwire_raw (struct serial *scb);
70b725ae77Skettenis static int wait_for (struct serial *scb, int timeout);
71b725ae77Skettenis static int hardwire_readchar (struct serial *scb, int timeout);
72b725ae77Skettenis static int do_hardwire_readchar (struct serial *scb, int timeout);
73b725ae77Skettenis static int generic_readchar (struct serial *scb, int timeout,
74b725ae77Skettenis 			     int (*do_readchar) (struct serial *scb,
75b725ae77Skettenis 						 int timeout));
76b725ae77Skettenis static int rate_to_code (int rate);
77b725ae77Skettenis static int hardwire_setbaudrate (struct serial *scb, int rate);
78b725ae77Skettenis static void hardwire_close (struct serial *scb);
79b725ae77Skettenis static int get_tty_state (struct serial *scb,
80b725ae77Skettenis 			  struct hardwire_ttystate * state);
81b725ae77Skettenis static int set_tty_state (struct serial *scb,
82b725ae77Skettenis 			  struct hardwire_ttystate * state);
83b725ae77Skettenis static serial_ttystate hardwire_get_tty_state (struct serial *scb);
84b725ae77Skettenis static int hardwire_set_tty_state (struct serial *scb, serial_ttystate state);
85b725ae77Skettenis static int hardwire_noflush_set_tty_state (struct serial *, serial_ttystate,
86b725ae77Skettenis 					   serial_ttystate);
87b725ae77Skettenis static void hardwire_print_tty_state (struct serial *, serial_ttystate,
88b725ae77Skettenis 				      struct ui_file *);
89b725ae77Skettenis static int hardwire_drain_output (struct serial *);
90b725ae77Skettenis static int hardwire_flush_output (struct serial *);
91b725ae77Skettenis static int hardwire_flush_input (struct serial *);
92b725ae77Skettenis static int hardwire_send_break (struct serial *);
93b725ae77Skettenis static int hardwire_setstopbits (struct serial *, int);
94b725ae77Skettenis 
95b725ae77Skettenis static int do_unix_readchar (struct serial *scb, int timeout);
96b725ae77Skettenis static timer_handler_func push_event;
97b725ae77Skettenis static handler_func fd_event;
98b725ae77Skettenis static void reschedule (struct serial *scb);
99b725ae77Skettenis 
100b725ae77Skettenis void _initialize_ser_hardwire (void);
101b725ae77Skettenis 
102e93f7393Sniklas /* Open up a real live device for serial I/O */
103e93f7393Sniklas 
104e93f7393Sniklas static int
hardwire_open(struct serial * scb,const char * name)105b725ae77Skettenis hardwire_open (struct serial *scb, const char *name)
106e93f7393Sniklas {
107e93f7393Sniklas   scb->fd = open (name, O_RDWR);
108e93f7393Sniklas   if (scb->fd < 0)
109e93f7393Sniklas     return -1;
110e93f7393Sniklas 
111e93f7393Sniklas   return 0;
112e93f7393Sniklas }
113e93f7393Sniklas 
114e93f7393Sniklas static int
get_tty_state(struct serial * scb,struct hardwire_ttystate * state)115b725ae77Skettenis get_tty_state (struct serial *scb, struct hardwire_ttystate *state)
116e93f7393Sniklas {
117e93f7393Sniklas #ifdef HAVE_TERMIOS
118e93f7393Sniklas   if (tcgetattr (scb->fd, &state->termios) < 0)
119e93f7393Sniklas     return -1;
120e93f7393Sniklas 
121e93f7393Sniklas   return 0;
122e93f7393Sniklas #endif
123e93f7393Sniklas 
124e93f7393Sniklas #ifdef HAVE_TERMIO
125e93f7393Sniklas   if (ioctl (scb->fd, TCGETA, &state->termio) < 0)
126e93f7393Sniklas     return -1;
127e93f7393Sniklas   return 0;
128e93f7393Sniklas #endif
129e93f7393Sniklas 
130e93f7393Sniklas #ifdef HAVE_SGTTY
131e93f7393Sniklas   if (ioctl (scb->fd, TIOCGETP, &state->sgttyb) < 0)
132e93f7393Sniklas     return -1;
133e93f7393Sniklas   if (ioctl (scb->fd, TIOCGETC, &state->tc) < 0)
134e93f7393Sniklas     return -1;
135e93f7393Sniklas   if (ioctl (scb->fd, TIOCGLTC, &state->ltc) < 0)
136e93f7393Sniklas     return -1;
137e93f7393Sniklas   if (ioctl (scb->fd, TIOCLGET, &state->lmode) < 0)
138e93f7393Sniklas     return -1;
139e93f7393Sniklas 
140e93f7393Sniklas   return 0;
141e93f7393Sniklas #endif
142e93f7393Sniklas }
143e93f7393Sniklas 
144e93f7393Sniklas static int
set_tty_state(struct serial * scb,struct hardwire_ttystate * state)145b725ae77Skettenis set_tty_state (struct serial *scb, struct hardwire_ttystate *state)
146e93f7393Sniklas {
147e93f7393Sniklas #ifdef HAVE_TERMIOS
148e93f7393Sniklas   if (tcsetattr (scb->fd, TCSANOW, &state->termios) < 0)
149e93f7393Sniklas     return -1;
150e93f7393Sniklas 
151e93f7393Sniklas   return 0;
152e93f7393Sniklas #endif
153e93f7393Sniklas 
154e93f7393Sniklas #ifdef HAVE_TERMIO
155e93f7393Sniklas   if (ioctl (scb->fd, TCSETA, &state->termio) < 0)
156e93f7393Sniklas     return -1;
157e93f7393Sniklas   return 0;
158e93f7393Sniklas #endif
159e93f7393Sniklas 
160e93f7393Sniklas #ifdef HAVE_SGTTY
161e93f7393Sniklas   if (ioctl (scb->fd, TIOCSETN, &state->sgttyb) < 0)
162e93f7393Sniklas     return -1;
163e93f7393Sniklas   if (ioctl (scb->fd, TIOCSETC, &state->tc) < 0)
164e93f7393Sniklas     return -1;
165e93f7393Sniklas   if (ioctl (scb->fd, TIOCSLTC, &state->ltc) < 0)
166e93f7393Sniklas     return -1;
167e93f7393Sniklas   if (ioctl (scb->fd, TIOCLSET, &state->lmode) < 0)
168e93f7393Sniklas     return -1;
169e93f7393Sniklas 
170e93f7393Sniklas   return 0;
171e93f7393Sniklas #endif
172e93f7393Sniklas }
173e93f7393Sniklas 
174e93f7393Sniklas static serial_ttystate
hardwire_get_tty_state(struct serial * scb)175b725ae77Skettenis hardwire_get_tty_state (struct serial *scb)
176e93f7393Sniklas {
177e93f7393Sniklas   struct hardwire_ttystate *state;
178e93f7393Sniklas 
179e93f7393Sniklas   state = (struct hardwire_ttystate *) xmalloc (sizeof *state);
180e93f7393Sniklas 
181e93f7393Sniklas   if (get_tty_state (scb, state))
182e93f7393Sniklas     return NULL;
183e93f7393Sniklas 
184e93f7393Sniklas   return (serial_ttystate) state;
185e93f7393Sniklas }
186e93f7393Sniklas 
187e93f7393Sniklas static int
hardwire_set_tty_state(struct serial * scb,serial_ttystate ttystate)188b725ae77Skettenis hardwire_set_tty_state (struct serial *scb, serial_ttystate ttystate)
189e93f7393Sniklas {
190e93f7393Sniklas   struct hardwire_ttystate *state;
191e93f7393Sniklas 
192e93f7393Sniklas   state = (struct hardwire_ttystate *) ttystate;
193e93f7393Sniklas 
194e93f7393Sniklas   return set_tty_state (scb, state);
195e93f7393Sniklas }
196e93f7393Sniklas 
197e93f7393Sniklas static int
hardwire_noflush_set_tty_state(struct serial * scb,serial_ttystate new_ttystate,serial_ttystate old_ttystate)198b725ae77Skettenis hardwire_noflush_set_tty_state (struct serial *scb,
199b725ae77Skettenis 				serial_ttystate new_ttystate,
200b725ae77Skettenis 				serial_ttystate old_ttystate)
201e93f7393Sniklas {
202e93f7393Sniklas   struct hardwire_ttystate new_state;
203e93f7393Sniklas #ifdef HAVE_SGTTY
204e93f7393Sniklas   struct hardwire_ttystate *state = (struct hardwire_ttystate *) old_ttystate;
205e93f7393Sniklas #endif
206e93f7393Sniklas 
207e93f7393Sniklas   new_state = *(struct hardwire_ttystate *) new_ttystate;
208e93f7393Sniklas 
209e93f7393Sniklas   /* Don't change in or out of raw mode; we don't want to flush input.
210e93f7393Sniklas      termio and termios have no such restriction; for them flushing input
211e93f7393Sniklas      is separate from setting the attributes.  */
212e93f7393Sniklas 
213e93f7393Sniklas #ifdef HAVE_SGTTY
214e93f7393Sniklas   if (state->sgttyb.sg_flags & RAW)
215e93f7393Sniklas     new_state.sgttyb.sg_flags |= RAW;
216e93f7393Sniklas   else
217e93f7393Sniklas     new_state.sgttyb.sg_flags &= ~RAW;
218e93f7393Sniklas 
219e93f7393Sniklas   /* I'm not sure whether this is necessary; the manpage just mentions
220e93f7393Sniklas      RAW not CBREAK.  */
221e93f7393Sniklas   if (state->sgttyb.sg_flags & CBREAK)
222e93f7393Sniklas     new_state.sgttyb.sg_flags |= CBREAK;
223e93f7393Sniklas   else
224e93f7393Sniklas     new_state.sgttyb.sg_flags &= ~CBREAK;
225e93f7393Sniklas #endif
226e93f7393Sniklas 
227e93f7393Sniklas   return set_tty_state (scb, &new_state);
228e93f7393Sniklas }
229e93f7393Sniklas 
230e93f7393Sniklas static void
hardwire_print_tty_state(struct serial * scb,serial_ttystate ttystate,struct ui_file * stream)231b725ae77Skettenis hardwire_print_tty_state (struct serial *scb,
232b725ae77Skettenis 			  serial_ttystate ttystate,
233b725ae77Skettenis 			  struct ui_file *stream)
234e93f7393Sniklas {
235e93f7393Sniklas   struct hardwire_ttystate *state = (struct hardwire_ttystate *) ttystate;
236e93f7393Sniklas   int i;
237e93f7393Sniklas 
238e93f7393Sniklas #ifdef HAVE_TERMIOS
239b725ae77Skettenis   fprintf_filtered (stream, "c_iflag = 0x%x, c_oflag = 0x%x,\n",
240b725ae77Skettenis 		    (int) state->termios.c_iflag,
241b725ae77Skettenis 		    (int) state->termios.c_oflag);
242b725ae77Skettenis   fprintf_filtered (stream, "c_cflag = 0x%x, c_lflag = 0x%x\n",
243b725ae77Skettenis 		    (int) state->termios.c_cflag,
244b725ae77Skettenis 		    (int) state->termios.c_lflag);
245e93f7393Sniklas #if 0
246e93f7393Sniklas   /* This not in POSIX, and is not really documented by those systems
247e93f7393Sniklas      which have it (at least not Sun).  */
248b725ae77Skettenis   fprintf_filtered (stream, "c_line = 0x%x.\n", state->termios.c_line);
249e93f7393Sniklas #endif
250b725ae77Skettenis   fprintf_filtered (stream, "c_cc: ");
251e93f7393Sniklas   for (i = 0; i < NCCS; i += 1)
252b725ae77Skettenis     fprintf_filtered (stream, "0x%x ", state->termios.c_cc[i]);
253b725ae77Skettenis   fprintf_filtered (stream, "\n");
254e93f7393Sniklas #endif
255e93f7393Sniklas 
256e93f7393Sniklas #ifdef HAVE_TERMIO
257b725ae77Skettenis   fprintf_filtered (stream, "c_iflag = 0x%x, c_oflag = 0x%x,\n",
258e93f7393Sniklas 		    state->termio.c_iflag, state->termio.c_oflag);
259b725ae77Skettenis   fprintf_filtered (stream, "c_cflag = 0x%x, c_lflag = 0x%x, c_line = 0x%x.\n",
260e93f7393Sniklas 		    state->termio.c_cflag, state->termio.c_lflag,
261e93f7393Sniklas 		    state->termio.c_line);
262b725ae77Skettenis   fprintf_filtered (stream, "c_cc: ");
263e93f7393Sniklas   for (i = 0; i < NCC; i += 1)
264b725ae77Skettenis     fprintf_filtered (stream, "0x%x ", state->termio.c_cc[i]);
265b725ae77Skettenis   fprintf_filtered (stream, "\n");
266e93f7393Sniklas #endif
267e93f7393Sniklas 
268e93f7393Sniklas #ifdef HAVE_SGTTY
269b725ae77Skettenis   fprintf_filtered (stream, "sgttyb.sg_flags = 0x%x.\n",
270b725ae77Skettenis 		    state->sgttyb.sg_flags);
271e93f7393Sniklas 
272b725ae77Skettenis   fprintf_filtered (stream, "tchars: ");
273e93f7393Sniklas   for (i = 0; i < (int) sizeof (struct tchars); i++)
274b725ae77Skettenis     fprintf_filtered (stream, "0x%x ", ((unsigned char *) &state->tc)[i]);
275b725ae77Skettenis   fprintf_filtered (stream, "\n");
276e93f7393Sniklas 
277b725ae77Skettenis   fprintf_filtered (stream, "ltchars: ");
278e93f7393Sniklas   for (i = 0; i < (int) sizeof (struct ltchars); i++)
279b725ae77Skettenis     fprintf_filtered (stream, "0x%x ", ((unsigned char *) &state->ltc)[i]);
280b725ae77Skettenis   fprintf_filtered (stream, "\n");
281e93f7393Sniklas 
282b725ae77Skettenis   fprintf_filtered (stream, "lmode:  0x%x\n", state->lmode);
283b725ae77Skettenis #endif
284b725ae77Skettenis }
285b725ae77Skettenis 
286b725ae77Skettenis /* Wait for the output to drain away, as opposed to flushing (discarding) it */
287b725ae77Skettenis 
288b725ae77Skettenis static int
hardwire_drain_output(struct serial * scb)289b725ae77Skettenis hardwire_drain_output (struct serial *scb)
290b725ae77Skettenis {
291b725ae77Skettenis #ifdef HAVE_TERMIOS
292b725ae77Skettenis   return tcdrain (scb->fd);
293b725ae77Skettenis #endif
294b725ae77Skettenis 
295b725ae77Skettenis #ifdef HAVE_TERMIO
296b725ae77Skettenis   return ioctl (scb->fd, TCSBRK, 1);
297b725ae77Skettenis #endif
298b725ae77Skettenis 
299b725ae77Skettenis #ifdef HAVE_SGTTY
300b725ae77Skettenis   /* Get the current state and then restore it using TIOCSETP,
301b725ae77Skettenis      which should cause the output to drain and pending input
302b725ae77Skettenis      to be discarded. */
303b725ae77Skettenis   {
304b725ae77Skettenis     struct hardwire_ttystate state;
305b725ae77Skettenis     if (get_tty_state (scb, &state))
306b725ae77Skettenis       {
307b725ae77Skettenis 	return (-1);
308b725ae77Skettenis       }
309b725ae77Skettenis     else
310b725ae77Skettenis       {
311b725ae77Skettenis 	return (ioctl (scb->fd, TIOCSETP, &state.sgttyb));
312b725ae77Skettenis       }
313b725ae77Skettenis   }
314e93f7393Sniklas #endif
315e93f7393Sniklas }
316e93f7393Sniklas 
317e93f7393Sniklas static int
hardwire_flush_output(struct serial * scb)318b725ae77Skettenis hardwire_flush_output (struct serial *scb)
319e93f7393Sniklas {
320e93f7393Sniklas #ifdef HAVE_TERMIOS
321e93f7393Sniklas   return tcflush (scb->fd, TCOFLUSH);
322e93f7393Sniklas #endif
323e93f7393Sniklas 
324e93f7393Sniklas #ifdef HAVE_TERMIO
325e93f7393Sniklas   return ioctl (scb->fd, TCFLSH, 1);
326e93f7393Sniklas #endif
327e93f7393Sniklas 
328e93f7393Sniklas #ifdef HAVE_SGTTY
329e93f7393Sniklas   /* This flushes both input and output, but we can't do better.  */
330e93f7393Sniklas   return ioctl (scb->fd, TIOCFLUSH, 0);
331e93f7393Sniklas #endif
332e93f7393Sniklas }
333e93f7393Sniklas 
334e93f7393Sniklas static int
hardwire_flush_input(struct serial * scb)335b725ae77Skettenis hardwire_flush_input (struct serial *scb)
336e93f7393Sniklas {
337b725ae77Skettenis   ser_unix_flush_input (scb);
338e93f7393Sniklas 
339e93f7393Sniklas #ifdef HAVE_TERMIOS
340e93f7393Sniklas   return tcflush (scb->fd, TCIFLUSH);
341e93f7393Sniklas #endif
342e93f7393Sniklas 
343e93f7393Sniklas #ifdef HAVE_TERMIO
344e93f7393Sniklas   return ioctl (scb->fd, TCFLSH, 0);
345e93f7393Sniklas #endif
346e93f7393Sniklas 
347e93f7393Sniklas #ifdef HAVE_SGTTY
348e93f7393Sniklas   /* This flushes both input and output, but we can't do better.  */
349e93f7393Sniklas   return ioctl (scb->fd, TIOCFLUSH, 0);
350e93f7393Sniklas #endif
351e93f7393Sniklas }
352e93f7393Sniklas 
353e93f7393Sniklas static int
hardwire_send_break(struct serial * scb)354b725ae77Skettenis hardwire_send_break (struct serial *scb)
355e93f7393Sniklas {
356e93f7393Sniklas #ifdef HAVE_TERMIOS
357e93f7393Sniklas   return tcsendbreak (scb->fd, 0);
358e93f7393Sniklas #endif
359e93f7393Sniklas 
360e93f7393Sniklas #ifdef HAVE_TERMIO
361e93f7393Sniklas   return ioctl (scb->fd, TCSBRK, 0);
362e93f7393Sniklas #endif
363e93f7393Sniklas 
364e93f7393Sniklas #ifdef HAVE_SGTTY
365e93f7393Sniklas   {
366e93f7393Sniklas     int status;
367e93f7393Sniklas     struct timeval timeout;
368e93f7393Sniklas 
369e93f7393Sniklas     status = ioctl (scb->fd, TIOCSBRK, 0);
370e93f7393Sniklas 
371e93f7393Sniklas     /* Can't use usleep; it doesn't exist in BSD 4.2.  */
372e93f7393Sniklas     /* Note that if this select() is interrupted by a signal it will not wait
373e93f7393Sniklas        the full length of time.  I think that is OK.  */
374e93f7393Sniklas     timeout.tv_sec = 0;
375e93f7393Sniklas     timeout.tv_usec = 250000;
376e93f7393Sniklas     select (0, 0, 0, 0, &timeout);
377e93f7393Sniklas     status = ioctl (scb->fd, TIOCCBRK, 0);
378e93f7393Sniklas     return status;
379e93f7393Sniklas   }
380e93f7393Sniklas #endif
381e93f7393Sniklas }
382e93f7393Sniklas 
383e93f7393Sniklas static void
hardwire_raw(struct serial * scb)384b725ae77Skettenis hardwire_raw (struct serial *scb)
385e93f7393Sniklas {
386e93f7393Sniklas   struct hardwire_ttystate state;
387e93f7393Sniklas 
388e93f7393Sniklas   if (get_tty_state (scb, &state))
389e93f7393Sniklas     fprintf_unfiltered (gdb_stderr, "get_tty_state failed: %s\n", safe_strerror (errno));
390e93f7393Sniklas 
391e93f7393Sniklas #ifdef HAVE_TERMIOS
392e93f7393Sniklas   state.termios.c_iflag = 0;
393e93f7393Sniklas   state.termios.c_oflag = 0;
394e93f7393Sniklas   state.termios.c_lflag = 0;
395e93f7393Sniklas   state.termios.c_cflag &= ~(CSIZE | PARENB);
396e93f7393Sniklas   state.termios.c_cflag |= CLOCAL | CS8;
397e93f7393Sniklas   state.termios.c_cc[VMIN] = 0;
398e93f7393Sniklas   state.termios.c_cc[VTIME] = 0;
399e93f7393Sniklas #endif
400e93f7393Sniklas 
401e93f7393Sniklas #ifdef HAVE_TERMIO
402e93f7393Sniklas   state.termio.c_iflag = 0;
403e93f7393Sniklas   state.termio.c_oflag = 0;
404e93f7393Sniklas   state.termio.c_lflag = 0;
405e93f7393Sniklas   state.termio.c_cflag &= ~(CSIZE | PARENB);
406e93f7393Sniklas   state.termio.c_cflag |= CLOCAL | CS8;
407e93f7393Sniklas   state.termio.c_cc[VMIN] = 0;
408e93f7393Sniklas   state.termio.c_cc[VTIME] = 0;
409e93f7393Sniklas #endif
410e93f7393Sniklas 
411e93f7393Sniklas #ifdef HAVE_SGTTY
412e93f7393Sniklas   state.sgttyb.sg_flags |= RAW | ANYP;
413e93f7393Sniklas   state.sgttyb.sg_flags &= ~(CBREAK | ECHO);
414e93f7393Sniklas #endif
415e93f7393Sniklas 
416e93f7393Sniklas   scb->current_timeout = 0;
417e93f7393Sniklas 
418e93f7393Sniklas   if (set_tty_state (scb, &state))
419e93f7393Sniklas     fprintf_unfiltered (gdb_stderr, "set_tty_state failed: %s\n", safe_strerror (errno));
420e93f7393Sniklas }
421e93f7393Sniklas 
422e93f7393Sniklas /* Wait for input on scb, with timeout seconds.  Returns 0 on success,
423e93f7393Sniklas    otherwise SERIAL_TIMEOUT or SERIAL_ERROR.
424e93f7393Sniklas 
425e93f7393Sniklas    For termio{s}, we actually just setup VTIME if necessary, and let the
426e93f7393Sniklas    timeout occur in the read() in hardwire_read().
427e93f7393Sniklas  */
428e93f7393Sniklas 
429b725ae77Skettenis /* FIXME: cagney/1999-09-16: Don't replace this with the equivalent
430b725ae77Skettenis    ser_unix*() until the old TERMIOS/SGTTY/... timer code has been
431b725ae77Skettenis    flushed. . */
432e93f7393Sniklas 
433b725ae77Skettenis /* NOTE: cagney/1999-09-30: Much of the code below is dead.  The only
434b725ae77Skettenis    possible values of the TIMEOUT parameter are ONE and ZERO.
435b725ae77Skettenis    Consequently all the code that tries to handle the possability of
436b725ae77Skettenis    an overflowed timer is unnecessary. */
437b725ae77Skettenis 
438b725ae77Skettenis static int
wait_for(struct serial * scb,int timeout)439b725ae77Skettenis wait_for (struct serial *scb, int timeout)
440b725ae77Skettenis {
441e93f7393Sniklas #ifdef HAVE_SGTTY
442b725ae77Skettenis   while (1)
443e93f7393Sniklas     {
444e93f7393Sniklas       struct timeval tv;
445e93f7393Sniklas       fd_set readfds;
446b725ae77Skettenis       int numfds;
447e93f7393Sniklas 
448b725ae77Skettenis       /* NOTE: Some OS's can scramble the READFDS when the select()
449b725ae77Skettenis          call fails (ex the kernel with Red Hat 5.2).  Initialize all
450b725ae77Skettenis          arguments before each call. */
451e93f7393Sniklas 
452e93f7393Sniklas       tv.tv_sec = timeout;
453e93f7393Sniklas       tv.tv_usec = 0;
454e93f7393Sniklas 
455b725ae77Skettenis       FD_ZERO (&readfds);
456e93f7393Sniklas       FD_SET (scb->fd, &readfds);
457e93f7393Sniklas 
458e93f7393Sniklas       if (timeout >= 0)
459e93f7393Sniklas 	numfds = select (scb->fd + 1, &readfds, 0, 0, &tv);
460e93f7393Sniklas       else
461e93f7393Sniklas 	numfds = select (scb->fd + 1, &readfds, 0, 0, 0);
462e93f7393Sniklas 
463e93f7393Sniklas       if (numfds <= 0)
464e93f7393Sniklas 	if (numfds == 0)
465e93f7393Sniklas 	  return SERIAL_TIMEOUT;
466e93f7393Sniklas 	else if (errno == EINTR)
467e93f7393Sniklas 	  continue;
468e93f7393Sniklas 	else
469e93f7393Sniklas 	  return SERIAL_ERROR;	/* Got an error from select or poll */
470e93f7393Sniklas 
471e93f7393Sniklas       return 0;
472e93f7393Sniklas     }
473e93f7393Sniklas #endif /* HAVE_SGTTY */
474e93f7393Sniklas 
475e93f7393Sniklas #if defined HAVE_TERMIO || defined HAVE_TERMIOS
476e93f7393Sniklas   if (timeout == scb->current_timeout)
477e93f7393Sniklas     return 0;
478e93f7393Sniklas 
479e93f7393Sniklas   scb->current_timeout = timeout;
480e93f7393Sniklas 
481e93f7393Sniklas   {
482e93f7393Sniklas     struct hardwire_ttystate state;
483e93f7393Sniklas 
484e93f7393Sniklas     if (get_tty_state (scb, &state))
485e93f7393Sniklas       fprintf_unfiltered (gdb_stderr, "get_tty_state failed: %s\n", safe_strerror (errno));
486e93f7393Sniklas 
487e93f7393Sniklas #ifdef HAVE_TERMIOS
488e93f7393Sniklas     if (timeout < 0)
489e93f7393Sniklas       {
490e93f7393Sniklas 	/* No timeout.  */
491e93f7393Sniklas 	state.termios.c_cc[VTIME] = 0;
492e93f7393Sniklas 	state.termios.c_cc[VMIN] = 1;
493e93f7393Sniklas       }
494e93f7393Sniklas     else
495e93f7393Sniklas       {
496e93f7393Sniklas 	state.termios.c_cc[VMIN] = 0;
497e93f7393Sniklas 	state.termios.c_cc[VTIME] = timeout * 10;
498e93f7393Sniklas 	if (state.termios.c_cc[VTIME] != timeout * 10)
499e93f7393Sniklas 	  {
500e93f7393Sniklas 
501e93f7393Sniklas 	    /* If c_cc is an 8-bit signed character, we can't go
502e93f7393Sniklas 	       bigger than this.  If it is always unsigned, we could use
503e93f7393Sniklas 	       25.  */
504e93f7393Sniklas 
505e93f7393Sniklas 	    scb->current_timeout = 12;
506e93f7393Sniklas 	    state.termios.c_cc[VTIME] = scb->current_timeout * 10;
507e93f7393Sniklas 	    scb->timeout_remaining = timeout - scb->current_timeout;
508e93f7393Sniklas 	  }
509e93f7393Sniklas       }
510e93f7393Sniklas #endif
511e93f7393Sniklas 
512e93f7393Sniklas #ifdef HAVE_TERMIO
513e93f7393Sniklas     if (timeout < 0)
514e93f7393Sniklas       {
515e93f7393Sniklas 	/* No timeout.  */
516e93f7393Sniklas 	state.termio.c_cc[VTIME] = 0;
517e93f7393Sniklas 	state.termio.c_cc[VMIN] = 1;
518e93f7393Sniklas       }
519e93f7393Sniklas     else
520e93f7393Sniklas       {
521e93f7393Sniklas 	state.termio.c_cc[VMIN] = 0;
522e93f7393Sniklas 	state.termio.c_cc[VTIME] = timeout * 10;
523e93f7393Sniklas 	if (state.termio.c_cc[VTIME] != timeout * 10)
524e93f7393Sniklas 	  {
525e93f7393Sniklas 	    /* If c_cc is an 8-bit signed character, we can't go
526e93f7393Sniklas 	       bigger than this.  If it is always unsigned, we could use
527e93f7393Sniklas 	       25.  */
528e93f7393Sniklas 
529e93f7393Sniklas 	    scb->current_timeout = 12;
530e93f7393Sniklas 	    state.termio.c_cc[VTIME] = scb->current_timeout * 10;
531e93f7393Sniklas 	    scb->timeout_remaining = timeout - scb->current_timeout;
532e93f7393Sniklas 	  }
533e93f7393Sniklas       }
534e93f7393Sniklas #endif
535e93f7393Sniklas 
536e93f7393Sniklas     if (set_tty_state (scb, &state))
537e93f7393Sniklas       fprintf_unfiltered (gdb_stderr, "set_tty_state failed: %s\n", safe_strerror (errno));
538e93f7393Sniklas 
539e93f7393Sniklas     return 0;
540e93f7393Sniklas   }
541e93f7393Sniklas #endif /* HAVE_TERMIO || HAVE_TERMIOS */
542e93f7393Sniklas }
543e93f7393Sniklas 
544e93f7393Sniklas /* Read a character with user-specified timeout.  TIMEOUT is number of seconds
545e93f7393Sniklas    to wait, or -1 to wait forever.  Use timeout of 0 to effect a poll.  Returns
546e93f7393Sniklas    char if successful.  Returns SERIAL_TIMEOUT if timeout expired, EOF if line
547e93f7393Sniklas    dropped dead, or SERIAL_ERROR for any other error (see errno in that case).  */
548e93f7393Sniklas 
549b725ae77Skettenis /* FIXME: cagney/1999-09-16: Don't replace this with the equivalent
550b725ae77Skettenis    ser_unix*() until the old TERMIOS/SGTTY/... timer code has been
551b725ae77Skettenis    flushed. */
552b725ae77Skettenis 
553b725ae77Skettenis /* NOTE: cagney/1999-09-16: This function is not identical to
554b725ae77Skettenis    ser_unix_readchar() as part of replacing it with ser_unix*()
555b725ae77Skettenis    merging will be required - this code handles the case where read()
556b725ae77Skettenis    times out due to no data while ser_unix_readchar() doesn't expect
557b725ae77Skettenis    that. */
558b725ae77Skettenis 
559e93f7393Sniklas static int
do_hardwire_readchar(struct serial * scb,int timeout)560b725ae77Skettenis do_hardwire_readchar (struct serial *scb, int timeout)
561e93f7393Sniklas {
562b725ae77Skettenis   int status, delta;
563b725ae77Skettenis   int detach = 0;
564e93f7393Sniklas 
565b725ae77Skettenis   if (timeout > 0)
566b725ae77Skettenis     timeout++;
567e93f7393Sniklas 
568b725ae77Skettenis   /* We have to be able to keep the GUI alive here, so we break the original
569b725ae77Skettenis      timeout into steps of 1 second, running the "keep the GUI alive" hook
570b725ae77Skettenis      each time through the loop.
571b725ae77Skettenis      Also, timeout = 0 means to poll, so we just set the delta to 0, so we
572b725ae77Skettenis      will only go through the loop once. */
573b725ae77Skettenis 
574b725ae77Skettenis   delta = (timeout == 0 ? 0 : 1);
575e93f7393Sniklas   while (1)
576e93f7393Sniklas     {
577b725ae77Skettenis 
578b725ae77Skettenis       /* N.B. The UI may destroy our world (for instance by calling
579b725ae77Skettenis          remote_stop,) in which case we want to get out of here as
580b725ae77Skettenis          quickly as possible.  It is not safe to touch scb, since
581*63addd46Skettenis          someone else might have freed it.  The
582*63addd46Skettenis          deprecated_ui_loop_hook signals that we should exit by
583*63addd46Skettenis          returning 1.  */
584b725ae77Skettenis 
585*63addd46Skettenis       if (deprecated_ui_loop_hook)
586*63addd46Skettenis 	detach = deprecated_ui_loop_hook (0);
587b725ae77Skettenis 
588b725ae77Skettenis       if (detach)
589b725ae77Skettenis 	return SERIAL_TIMEOUT;
590b725ae77Skettenis 
591b725ae77Skettenis       scb->timeout_remaining = (timeout < 0 ? timeout : timeout - delta);
592b725ae77Skettenis       status = wait_for (scb, delta);
593e93f7393Sniklas 
594e93f7393Sniklas       if (status < 0)
595e93f7393Sniklas 	return status;
596e93f7393Sniklas 
597b725ae77Skettenis       status = read (scb->fd, scb->buf, BUFSIZ);
598e93f7393Sniklas 
599b725ae77Skettenis       if (status <= 0)
600e93f7393Sniklas 	{
601b725ae77Skettenis 	  if (status == 0)
602e93f7393Sniklas 	    {
603e93f7393Sniklas 	      /* Zero characters means timeout (it could also be EOF, but
604e93f7393Sniklas 	         we don't (yet at least) distinguish).  */
605e93f7393Sniklas 	      if (scb->timeout_remaining > 0)
606e93f7393Sniklas 		{
607e93f7393Sniklas 		  timeout = scb->timeout_remaining;
608e93f7393Sniklas 		  continue;
609e93f7393Sniklas 		}
610b725ae77Skettenis 	      else if (scb->timeout_remaining < 0)
611b725ae77Skettenis 		continue;
612e93f7393Sniklas 	      else
613e93f7393Sniklas 		return SERIAL_TIMEOUT;
614e93f7393Sniklas 	    }
615e93f7393Sniklas 	  else if (errno == EINTR)
616e93f7393Sniklas 	    continue;
617e93f7393Sniklas 	  else
618e93f7393Sniklas 	    return SERIAL_ERROR;	/* Got an error from read */
619e93f7393Sniklas 	}
620e93f7393Sniklas 
621b725ae77Skettenis       scb->bufcnt = status;
622e93f7393Sniklas       scb->bufcnt--;
623e93f7393Sniklas       scb->bufp = scb->buf;
624e93f7393Sniklas       return *scb->bufp++;
625e93f7393Sniklas     }
626e93f7393Sniklas }
627e93f7393Sniklas 
628b725ae77Skettenis static int
hardwire_readchar(struct serial * scb,int timeout)629b725ae77Skettenis hardwire_readchar (struct serial *scb, int timeout)
630b725ae77Skettenis {
631b725ae77Skettenis   return generic_readchar (scb, timeout, do_hardwire_readchar);
632b725ae77Skettenis }
633b725ae77Skettenis 
634b725ae77Skettenis 
635e93f7393Sniklas #ifndef B19200
636e93f7393Sniklas #define B19200 EXTA
637e93f7393Sniklas #endif
638e93f7393Sniklas 
639e93f7393Sniklas #ifndef B38400
640e93f7393Sniklas #define B38400 EXTB
641e93f7393Sniklas #endif
642e93f7393Sniklas 
643e93f7393Sniklas /* Translate baud rates from integers to damn B_codes.  Unix should
644e93f7393Sniklas    have outgrown this crap years ago, but even POSIX wouldn't buck it.  */
645e93f7393Sniklas 
646e93f7393Sniklas static struct
647e93f7393Sniklas {
648e93f7393Sniklas   int rate;
649e93f7393Sniklas   int code;
650e93f7393Sniklas }
651e93f7393Sniklas baudtab[] =
652e93f7393Sniklas {
653b725ae77Skettenis   {
654b725ae77Skettenis     50, B50
655b725ae77Skettenis   }
656b725ae77Skettenis   ,
657b725ae77Skettenis   {
658b725ae77Skettenis     75, B75
659b725ae77Skettenis   }
660b725ae77Skettenis   ,
661b725ae77Skettenis   {
662b725ae77Skettenis     110, B110
663b725ae77Skettenis   }
664b725ae77Skettenis   ,
665b725ae77Skettenis   {
666b725ae77Skettenis     134, B134
667b725ae77Skettenis   }
668b725ae77Skettenis   ,
669b725ae77Skettenis   {
670b725ae77Skettenis     150, B150
671b725ae77Skettenis   }
672b725ae77Skettenis   ,
673b725ae77Skettenis   {
674b725ae77Skettenis     200, B200
675b725ae77Skettenis   }
676b725ae77Skettenis   ,
677b725ae77Skettenis   {
678b725ae77Skettenis     300, B300
679b725ae77Skettenis   }
680b725ae77Skettenis   ,
681b725ae77Skettenis   {
682b725ae77Skettenis     600, B600
683b725ae77Skettenis   }
684b725ae77Skettenis   ,
685b725ae77Skettenis   {
686b725ae77Skettenis     1200, B1200
687b725ae77Skettenis   }
688b725ae77Skettenis   ,
689b725ae77Skettenis   {
690b725ae77Skettenis     1800, B1800
691b725ae77Skettenis   }
692b725ae77Skettenis   ,
693b725ae77Skettenis   {
694b725ae77Skettenis     2400, B2400
695b725ae77Skettenis   }
696b725ae77Skettenis   ,
697b725ae77Skettenis   {
698b725ae77Skettenis     4800, B4800
699b725ae77Skettenis   }
700b725ae77Skettenis   ,
701b725ae77Skettenis   {
702b725ae77Skettenis     9600, B9600
703b725ae77Skettenis   }
704b725ae77Skettenis   ,
705b725ae77Skettenis   {
706b725ae77Skettenis     19200, B19200
707b725ae77Skettenis   }
708b725ae77Skettenis   ,
709b725ae77Skettenis   {
710b725ae77Skettenis     38400, B38400
711b725ae77Skettenis   }
712b725ae77Skettenis   ,
713b725ae77Skettenis #ifdef B57600
714b725ae77Skettenis   {
715b725ae77Skettenis     57600, B57600
716b725ae77Skettenis   }
717b725ae77Skettenis   ,
718b725ae77Skettenis #endif
719b725ae77Skettenis #ifdef B115200
720b725ae77Skettenis   {
721b725ae77Skettenis     115200, B115200
722b725ae77Skettenis   }
723b725ae77Skettenis   ,
724b725ae77Skettenis #endif
725b725ae77Skettenis #ifdef B230400
726b725ae77Skettenis   {
727b725ae77Skettenis     230400, B230400
728b725ae77Skettenis   }
729b725ae77Skettenis   ,
730b725ae77Skettenis #endif
731b725ae77Skettenis #ifdef B460800
732b725ae77Skettenis   {
733b725ae77Skettenis     460800, B460800
734b725ae77Skettenis   }
735b725ae77Skettenis   ,
736b725ae77Skettenis #endif
737b725ae77Skettenis   {
738b725ae77Skettenis     -1, -1
739b725ae77Skettenis   }
740b725ae77Skettenis   ,
741e93f7393Sniklas };
742e93f7393Sniklas 
743e93f7393Sniklas static int
rate_to_code(int rate)744b725ae77Skettenis rate_to_code (int rate)
745e93f7393Sniklas {
746e93f7393Sniklas   int i;
747e93f7393Sniklas 
748e93f7393Sniklas   for (i = 0; baudtab[i].rate != -1; i++)
749b725ae77Skettenis     {
750b725ae77Skettenis       /* test for perfect macth. */
751e93f7393Sniklas       if (rate == baudtab[i].rate)
752e93f7393Sniklas         return baudtab[i].code;
753b725ae77Skettenis       else
754b725ae77Skettenis         {
755b725ae77Skettenis 	  /* check if it is in between valid values. */
756b725ae77Skettenis           if (rate < baudtab[i].rate)
757b725ae77Skettenis 	    {
758b725ae77Skettenis 	      if (i)
759b725ae77Skettenis 	        {
760b725ae77Skettenis 	          warning ("Invalid baud rate %d.  Closest values are %d and %d.",
761b725ae77Skettenis 	                    rate, baudtab[i - 1].rate, baudtab[i].rate);
762b725ae77Skettenis 		}
763b725ae77Skettenis 	      else
764b725ae77Skettenis 	        {
765b725ae77Skettenis 	          warning ("Invalid baud rate %d.  Minimum value is %d.",
766b725ae77Skettenis 	                    rate, baudtab[0].rate);
767b725ae77Skettenis 		}
768b725ae77Skettenis 	      return -1;
769b725ae77Skettenis 	    }
770b725ae77Skettenis         }
771b725ae77Skettenis     }
772e93f7393Sniklas 
773b725ae77Skettenis   /* The requested speed was too large. */
774b725ae77Skettenis   warning ("Invalid baud rate %d.  Maximum value is %d.",
775b725ae77Skettenis             rate, baudtab[i - 1].rate);
776e93f7393Sniklas   return -1;
777e93f7393Sniklas }
778e93f7393Sniklas 
779e93f7393Sniklas static int
hardwire_setbaudrate(struct serial * scb,int rate)780b725ae77Skettenis hardwire_setbaudrate (struct serial *scb, int rate)
781e93f7393Sniklas {
782e93f7393Sniklas   struct hardwire_ttystate state;
783b725ae77Skettenis   int baud_code = rate_to_code (rate);
784b725ae77Skettenis 
785b725ae77Skettenis   if (baud_code < 0)
786b725ae77Skettenis     {
787b725ae77Skettenis       /* The baud rate was not valid.
788b725ae77Skettenis          A warning has already been issued. */
789b725ae77Skettenis       errno = EINVAL;
790b725ae77Skettenis       return -1;
791b725ae77Skettenis     }
792e93f7393Sniklas 
793e93f7393Sniklas   if (get_tty_state (scb, &state))
794e93f7393Sniklas     return -1;
795e93f7393Sniklas 
796e93f7393Sniklas #ifdef HAVE_TERMIOS
797b725ae77Skettenis   cfsetospeed (&state.termios, baud_code);
798b725ae77Skettenis   cfsetispeed (&state.termios, baud_code);
799e93f7393Sniklas #endif
800e93f7393Sniklas 
801e93f7393Sniklas #ifdef HAVE_TERMIO
802e93f7393Sniklas #ifndef CIBAUD
803e93f7393Sniklas #define CIBAUD CBAUD
804e93f7393Sniklas #endif
805e93f7393Sniklas 
806e93f7393Sniklas   state.termio.c_cflag &= ~(CBAUD | CIBAUD);
807b725ae77Skettenis   state.termio.c_cflag |= baud_code;
808e93f7393Sniklas #endif
809e93f7393Sniklas 
810e93f7393Sniklas #ifdef HAVE_SGTTY
811b725ae77Skettenis   state.sgttyb.sg_ispeed = baud_code;
812b725ae77Skettenis   state.sgttyb.sg_ospeed = baud_code;
813e93f7393Sniklas #endif
814e93f7393Sniklas 
815e93f7393Sniklas   return set_tty_state (scb, &state);
816e93f7393Sniklas }
817e93f7393Sniklas 
818e93f7393Sniklas static int
hardwire_setstopbits(struct serial * scb,int num)819b725ae77Skettenis hardwire_setstopbits (struct serial *scb, int num)
820e93f7393Sniklas {
821e93f7393Sniklas   struct hardwire_ttystate state;
822e93f7393Sniklas   int newbit;
823e93f7393Sniklas 
824e93f7393Sniklas   if (get_tty_state (scb, &state))
825e93f7393Sniklas     return -1;
826e93f7393Sniklas 
827e93f7393Sniklas   switch (num)
828e93f7393Sniklas     {
829e93f7393Sniklas     case SERIAL_1_STOPBITS:
830e93f7393Sniklas       newbit = 0;
831e93f7393Sniklas       break;
832e93f7393Sniklas     case SERIAL_1_AND_A_HALF_STOPBITS:
833e93f7393Sniklas     case SERIAL_2_STOPBITS:
834e93f7393Sniklas       newbit = 1;
835e93f7393Sniklas       break;
836e93f7393Sniklas     default:
837e93f7393Sniklas       return 1;
838e93f7393Sniklas     }
839e93f7393Sniklas 
840e93f7393Sniklas #ifdef HAVE_TERMIOS
841e93f7393Sniklas   if (!newbit)
842e93f7393Sniklas     state.termios.c_cflag &= ~CSTOPB;
843e93f7393Sniklas   else
844e93f7393Sniklas     state.termios.c_cflag |= CSTOPB;	/* two bits */
845e93f7393Sniklas #endif
846e93f7393Sniklas 
847e93f7393Sniklas #ifdef HAVE_TERMIO
848e93f7393Sniklas   if (!newbit)
849e93f7393Sniklas     state.termio.c_cflag &= ~CSTOPB;
850e93f7393Sniklas   else
851e93f7393Sniklas     state.termio.c_cflag |= CSTOPB;	/* two bits */
852e93f7393Sniklas #endif
853e93f7393Sniklas 
854e93f7393Sniklas #ifdef HAVE_SGTTY
855e93f7393Sniklas   return 0;			/* sgtty doesn't support this */
856e93f7393Sniklas #endif
857e93f7393Sniklas 
858e93f7393Sniklas   return set_tty_state (scb, &state);
859e93f7393Sniklas }
860e93f7393Sniklas 
861b725ae77Skettenis static void
hardwire_close(struct serial * scb)862b725ae77Skettenis hardwire_close (struct serial *scb)
863b725ae77Skettenis {
864b725ae77Skettenis   if (scb->fd < 0)
865b725ae77Skettenis     return;
866b725ae77Skettenis 
867b725ae77Skettenis   close (scb->fd);
868b725ae77Skettenis   scb->fd = -1;
869b725ae77Skettenis }
870b725ae77Skettenis 
871b725ae77Skettenis 
872b725ae77Skettenis /* Generic operations used by all UNIX/FD based serial interfaces. */
873b725ae77Skettenis 
874b725ae77Skettenis serial_ttystate
ser_unix_nop_get_tty_state(struct serial * scb)875b725ae77Skettenis ser_unix_nop_get_tty_state (struct serial *scb)
876b725ae77Skettenis {
877b725ae77Skettenis   /* allocate a dummy */
878b725ae77Skettenis   return (serial_ttystate) XMALLOC (int);
879b725ae77Skettenis }
880b725ae77Skettenis 
881b725ae77Skettenis int
ser_unix_nop_set_tty_state(struct serial * scb,serial_ttystate ttystate)882b725ae77Skettenis ser_unix_nop_set_tty_state (struct serial *scb, serial_ttystate ttystate)
883b725ae77Skettenis {
884b725ae77Skettenis   return 0;
885b725ae77Skettenis }
886b725ae77Skettenis 
887b725ae77Skettenis void
ser_unix_nop_raw(struct serial * scb)888b725ae77Skettenis ser_unix_nop_raw (struct serial *scb)
889b725ae77Skettenis {
890b725ae77Skettenis   return;			/* Always in raw mode */
891b725ae77Skettenis }
892b725ae77Skettenis 
893b725ae77Skettenis /* Wait for input on scb, with timeout seconds.  Returns 0 on success,
894b725ae77Skettenis    otherwise SERIAL_TIMEOUT or SERIAL_ERROR. */
895b725ae77Skettenis 
896b725ae77Skettenis int
ser_unix_wait_for(struct serial * scb,int timeout)897b725ae77Skettenis ser_unix_wait_for (struct serial *scb, int timeout)
898b725ae77Skettenis {
899b725ae77Skettenis   while (1)
900b725ae77Skettenis     {
901b725ae77Skettenis       int numfds;
902b725ae77Skettenis       struct timeval tv;
903b725ae77Skettenis       fd_set readfds, exceptfds;
904b725ae77Skettenis 
905b725ae77Skettenis       /* NOTE: Some OS's can scramble the READFDS when the select()
906b725ae77Skettenis          call fails (ex the kernel with Red Hat 5.2).  Initialize all
907b725ae77Skettenis          arguments before each call. */
908b725ae77Skettenis 
909b725ae77Skettenis       tv.tv_sec = timeout;
910b725ae77Skettenis       tv.tv_usec = 0;
911b725ae77Skettenis 
912b725ae77Skettenis       FD_ZERO (&readfds);
913b725ae77Skettenis       FD_ZERO (&exceptfds);
914b725ae77Skettenis       FD_SET (scb->fd, &readfds);
915b725ae77Skettenis       FD_SET (scb->fd, &exceptfds);
916b725ae77Skettenis 
917b725ae77Skettenis       if (timeout >= 0)
918b725ae77Skettenis 	numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv);
919b725ae77Skettenis       else
920b725ae77Skettenis 	numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, 0);
921b725ae77Skettenis 
922b725ae77Skettenis       if (numfds <= 0)
923b725ae77Skettenis 	{
924b725ae77Skettenis 	  if (numfds == 0)
925b725ae77Skettenis 	    return SERIAL_TIMEOUT;
926b725ae77Skettenis 	  else if (errno == EINTR)
927b725ae77Skettenis 	    continue;
928b725ae77Skettenis 	  else
929b725ae77Skettenis 	    return SERIAL_ERROR;	/* Got an error from select or poll */
930b725ae77Skettenis 	}
931b725ae77Skettenis 
932b725ae77Skettenis       return 0;
933b725ae77Skettenis     }
934b725ae77Skettenis }
935b725ae77Skettenis 
936b725ae77Skettenis /* Read a character with user-specified timeout.  TIMEOUT is number of seconds
937b725ae77Skettenis    to wait, or -1 to wait forever.  Use timeout of 0 to effect a poll.  Returns
938b725ae77Skettenis    char if successful.  Returns -2 if timeout expired, EOF if line dropped
939b725ae77Skettenis    dead, or -3 for any other error (see errno in that case). */
940b725ae77Skettenis 
941e93f7393Sniklas static int
do_unix_readchar(struct serial * scb,int timeout)942b725ae77Skettenis do_unix_readchar (struct serial *scb, int timeout)
943b725ae77Skettenis {
944b725ae77Skettenis   int status;
945b725ae77Skettenis   int delta;
946b725ae77Skettenis 
947b725ae77Skettenis   /* We have to be able to keep the GUI alive here, so we break the original
948b725ae77Skettenis      timeout into steps of 1 second, running the "keep the GUI alive" hook
949b725ae77Skettenis      each time through the loop.
950b725ae77Skettenis 
951b725ae77Skettenis      Also, timeout = 0 means to poll, so we just set the delta to 0, so we
952b725ae77Skettenis      will only go through the loop once. */
953b725ae77Skettenis 
954b725ae77Skettenis   delta = (timeout == 0 ? 0 : 1);
955b725ae77Skettenis   while (1)
956b725ae77Skettenis     {
957b725ae77Skettenis 
958b725ae77Skettenis       /* N.B. The UI may destroy our world (for instance by calling
959b725ae77Skettenis          remote_stop,) in which case we want to get out of here as
960b725ae77Skettenis          quickly as possible.  It is not safe to touch scb, since
961*63addd46Skettenis          someone else might have freed it.  The
962*63addd46Skettenis          deprecated_ui_loop_hook signals that we should exit by
963*63addd46Skettenis          returning 1.  */
964b725ae77Skettenis 
965*63addd46Skettenis       if (deprecated_ui_loop_hook)
966b725ae77Skettenis 	{
967*63addd46Skettenis 	  if (deprecated_ui_loop_hook (0))
968b725ae77Skettenis 	    return SERIAL_TIMEOUT;
969b725ae77Skettenis 	}
970b725ae77Skettenis 
971b725ae77Skettenis       status = ser_unix_wait_for (scb, delta);
972b725ae77Skettenis       if (timeout > 0)
973b725ae77Skettenis         timeout -= delta;
974b725ae77Skettenis 
975b725ae77Skettenis       /* If we got a character or an error back from wait_for, then we can
976b725ae77Skettenis          break from the loop before the timeout is completed. */
977b725ae77Skettenis 
978b725ae77Skettenis       if (status != SERIAL_TIMEOUT)
979b725ae77Skettenis 	{
980b725ae77Skettenis 	  break;
981b725ae77Skettenis 	}
982b725ae77Skettenis 
983b725ae77Skettenis       /* If we have exhausted the original timeout, then generate
984b725ae77Skettenis          a SERIAL_TIMEOUT, and pass it out of the loop. */
985b725ae77Skettenis 
986b725ae77Skettenis       else if (timeout == 0)
987b725ae77Skettenis 	{
988b725ae77Skettenis 	  status = SERIAL_TIMEOUT;
989b725ae77Skettenis 	  break;
990b725ae77Skettenis 	}
991b725ae77Skettenis     }
992b725ae77Skettenis 
993b725ae77Skettenis   if (status < 0)
994b725ae77Skettenis     return status;
995b725ae77Skettenis 
996b725ae77Skettenis   while (1)
997b725ae77Skettenis     {
998b725ae77Skettenis       status = read (scb->fd, scb->buf, BUFSIZ);
999b725ae77Skettenis       if (status != -1 || errno != EINTR)
1000b725ae77Skettenis 	break;
1001b725ae77Skettenis     }
1002b725ae77Skettenis 
1003b725ae77Skettenis   if (status <= 0)
1004b725ae77Skettenis     {
1005b725ae77Skettenis       if (status == 0)
1006b725ae77Skettenis 	return SERIAL_TIMEOUT;	/* 0 chars means timeout [may need to
1007b725ae77Skettenis 				   distinguish between EOF & timeouts
1008b725ae77Skettenis 				   someday] */
1009b725ae77Skettenis       else
1010b725ae77Skettenis 	return SERIAL_ERROR;	/* Got an error from read */
1011b725ae77Skettenis     }
1012b725ae77Skettenis 
1013b725ae77Skettenis   scb->bufcnt = status;
1014b725ae77Skettenis   scb->bufcnt--;
1015b725ae77Skettenis   scb->bufp = scb->buf;
1016b725ae77Skettenis   return *scb->bufp++;
1017b725ae77Skettenis }
1018b725ae77Skettenis 
1019b725ae77Skettenis /* Perform operations common to both old and new readchar. */
1020b725ae77Skettenis 
1021b725ae77Skettenis /* Return the next character from the input FIFO.  If the FIFO is
1022b725ae77Skettenis    empty, call the SERIAL specific routine to try and read in more
1023b725ae77Skettenis    characters.
1024b725ae77Skettenis 
1025b725ae77Skettenis    Initially data from the input FIFO is returned (fd_event()
1026b725ae77Skettenis    pre-reads the input into that FIFO.  Once that has been emptied,
1027b725ae77Skettenis    further data is obtained by polling the input FD using the device
1028b725ae77Skettenis    specific readchar() function.  Note: reschedule() is called after
1029b725ae77Skettenis    every read.  This is because there is no guarentee that the lower
1030b725ae77Skettenis    level fd_event() poll_event() code (which also calls reschedule())
1031b725ae77Skettenis    will be called. */
1032b725ae77Skettenis 
1033b725ae77Skettenis static int
generic_readchar(struct serial * scb,int timeout,int (do_readchar)(struct serial * scb,int timeout))1034b725ae77Skettenis generic_readchar (struct serial *scb, int timeout,
1035b725ae77Skettenis 		  int (do_readchar) (struct serial *scb, int timeout))
1036b725ae77Skettenis {
1037b725ae77Skettenis   int ch;
1038b725ae77Skettenis   if (scb->bufcnt > 0)
1039b725ae77Skettenis     {
1040b725ae77Skettenis       ch = *scb->bufp;
1041b725ae77Skettenis       scb->bufcnt--;
1042b725ae77Skettenis       scb->bufp++;
1043b725ae77Skettenis     }
1044b725ae77Skettenis   else if (scb->bufcnt < 0)
1045b725ae77Skettenis     {
1046b725ae77Skettenis       /* Some errors/eof are are sticky. */
1047b725ae77Skettenis       ch = scb->bufcnt;
1048b725ae77Skettenis     }
1049b725ae77Skettenis   else
1050b725ae77Skettenis     {
1051b725ae77Skettenis       ch = do_readchar (scb, timeout);
1052b725ae77Skettenis       if (ch < 0)
1053b725ae77Skettenis 	{
1054b725ae77Skettenis 	  switch ((enum serial_rc) ch)
1055b725ae77Skettenis 	    {
1056b725ae77Skettenis 	    case SERIAL_EOF:
1057b725ae77Skettenis 	    case SERIAL_ERROR:
1058b725ae77Skettenis 	      /* Make the error/eof stick. */
1059b725ae77Skettenis 	      scb->bufcnt = ch;
1060b725ae77Skettenis 	      break;
1061b725ae77Skettenis 	    case SERIAL_TIMEOUT:
1062b725ae77Skettenis 	      scb->bufcnt = 0;
1063b725ae77Skettenis 	      break;
1064b725ae77Skettenis 	    }
1065b725ae77Skettenis 	}
1066b725ae77Skettenis     }
1067b725ae77Skettenis   reschedule (scb);
1068b725ae77Skettenis   return ch;
1069b725ae77Skettenis }
1070b725ae77Skettenis 
1071b725ae77Skettenis int
ser_unix_readchar(struct serial * scb,int timeout)1072b725ae77Skettenis ser_unix_readchar (struct serial *scb, int timeout)
1073b725ae77Skettenis {
1074b725ae77Skettenis   return generic_readchar (scb, timeout, do_unix_readchar);
1075b725ae77Skettenis }
1076b725ae77Skettenis 
1077b725ae77Skettenis int
ser_unix_nop_noflush_set_tty_state(struct serial * scb,serial_ttystate new_ttystate,serial_ttystate old_ttystate)1078b725ae77Skettenis ser_unix_nop_noflush_set_tty_state (struct serial *scb,
1079b725ae77Skettenis 				    serial_ttystate new_ttystate,
1080b725ae77Skettenis 				    serial_ttystate old_ttystate)
1081b725ae77Skettenis {
1082b725ae77Skettenis   return 0;
1083b725ae77Skettenis }
1084b725ae77Skettenis 
1085b725ae77Skettenis void
ser_unix_nop_print_tty_state(struct serial * scb,serial_ttystate ttystate,struct ui_file * stream)1086b725ae77Skettenis ser_unix_nop_print_tty_state (struct serial *scb,
1087b725ae77Skettenis 			      serial_ttystate ttystate,
1088b725ae77Skettenis 			      struct ui_file *stream)
1089b725ae77Skettenis {
1090b725ae77Skettenis   /* Nothing to print.  */
1091b725ae77Skettenis   return;
1092b725ae77Skettenis }
1093b725ae77Skettenis 
1094b725ae77Skettenis int
ser_unix_nop_setbaudrate(struct serial * scb,int rate)1095b725ae77Skettenis ser_unix_nop_setbaudrate (struct serial *scb, int rate)
1096b725ae77Skettenis {
1097b725ae77Skettenis   return 0;			/* Never fails! */
1098b725ae77Skettenis }
1099b725ae77Skettenis 
1100b725ae77Skettenis int
ser_unix_nop_setstopbits(struct serial * scb,int num)1101b725ae77Skettenis ser_unix_nop_setstopbits (struct serial *scb, int num)
1102b725ae77Skettenis {
1103b725ae77Skettenis   return 0;			/* Never fails! */
1104b725ae77Skettenis }
1105b725ae77Skettenis 
1106b725ae77Skettenis int
ser_unix_write(struct serial * scb,const char * str,int len)1107b725ae77Skettenis ser_unix_write (struct serial *scb, const char *str, int len)
1108e93f7393Sniklas {
1109e93f7393Sniklas   int cc;
1110e93f7393Sniklas 
1111e93f7393Sniklas   while (len > 0)
1112e93f7393Sniklas     {
1113e93f7393Sniklas       cc = write (scb->fd, str, len);
1114e93f7393Sniklas 
1115e93f7393Sniklas       if (cc < 0)
1116e93f7393Sniklas 	return 1;
1117e93f7393Sniklas       len -= cc;
1118e93f7393Sniklas       str += cc;
1119e93f7393Sniklas     }
1120e93f7393Sniklas   return 0;
1121e93f7393Sniklas }
1122e93f7393Sniklas 
1123b725ae77Skettenis int
ser_unix_nop_flush_output(struct serial * scb)1124b725ae77Skettenis ser_unix_nop_flush_output (struct serial *scb)
1125e93f7393Sniklas {
1126b725ae77Skettenis   return 0;
1127e93f7393Sniklas }
1128e93f7393Sniklas 
1129b725ae77Skettenis int
ser_unix_flush_input(struct serial * scb)1130b725ae77Skettenis ser_unix_flush_input (struct serial *scb)
1131e93f7393Sniklas {
1132b725ae77Skettenis   if (scb->bufcnt >= 0)
1133b725ae77Skettenis     {
1134b725ae77Skettenis       scb->bufcnt = 0;
1135b725ae77Skettenis       scb->bufp = scb->buf;
1136b725ae77Skettenis       return 0;
1137b725ae77Skettenis     }
1138b725ae77Skettenis   else
1139b725ae77Skettenis     return SERIAL_ERROR;
1140b725ae77Skettenis }
1141b725ae77Skettenis 
1142b725ae77Skettenis int
ser_unix_nop_send_break(struct serial * scb)1143b725ae77Skettenis ser_unix_nop_send_break (struct serial *scb)
1144b725ae77Skettenis {
1145b725ae77Skettenis   return 0;
1146b725ae77Skettenis }
1147b725ae77Skettenis 
1148b725ae77Skettenis int
ser_unix_nop_drain_output(struct serial * scb)1149b725ae77Skettenis ser_unix_nop_drain_output (struct serial *scb)
1150b725ae77Skettenis {
1151b725ae77Skettenis   return 0;
1152b725ae77Skettenis }
1153b725ae77Skettenis 
1154b725ae77Skettenis 
1155b725ae77Skettenis 
1156b725ae77Skettenis /* Event handling for ASYNC serial code.
1157b725ae77Skettenis 
1158b725ae77Skettenis    At any time the SERIAL device either: has an empty FIFO and is
1159b725ae77Skettenis    waiting on a FD event; or has a non-empty FIFO/error condition and
1160b725ae77Skettenis    is constantly scheduling timer events.
1161b725ae77Skettenis 
1162b725ae77Skettenis    ASYNC only stops pestering its client when it is de-async'ed or it
1163b725ae77Skettenis    is told to go away. */
1164b725ae77Skettenis 
1165b725ae77Skettenis /* Value of scb->async_state: */
1166b725ae77Skettenis enum {
1167b725ae77Skettenis   /* >= 0 (TIMER_SCHEDULED) */
1168b725ae77Skettenis   /* The ID of the currently scheduled timer event. This state is
1169b725ae77Skettenis      rarely encountered.  Timer events are one-off so as soon as the
1170b725ae77Skettenis      event is delivered the state is shanged to NOTHING_SCHEDULED. */
1171b725ae77Skettenis   FD_SCHEDULED = -1,
1172b725ae77Skettenis   /* The fd_event() handler is scheduled.  It is called when ever the
1173b725ae77Skettenis      file descriptor becomes ready. */
1174b725ae77Skettenis   NOTHING_SCHEDULED = -2
1175b725ae77Skettenis   /* Either no task is scheduled (just going into ASYNC mode) or a
1176b725ae77Skettenis      timer event has just gone off and the current state has been
1177b725ae77Skettenis      forced into nothing scheduled. */
1178e93f7393Sniklas };
1179e93f7393Sniklas 
1180b725ae77Skettenis /* Identify and schedule the next ASYNC task based on scb->async_state
1181b725ae77Skettenis    and scb->buf* (the input FIFO).  A state machine is used to avoid
1182b725ae77Skettenis    the need to make redundant calls into the event-loop - the next
1183b725ae77Skettenis    scheduled task is only changed when needed. */
1184b725ae77Skettenis 
1185b725ae77Skettenis static void
reschedule(struct serial * scb)1186b725ae77Skettenis reschedule (struct serial *scb)
1187e93f7393Sniklas {
1188b725ae77Skettenis   if (serial_is_async_p (scb))
1189b725ae77Skettenis     {
1190b725ae77Skettenis       int next_state;
1191b725ae77Skettenis       switch (scb->async_state)
1192b725ae77Skettenis 	{
1193b725ae77Skettenis 	case FD_SCHEDULED:
1194b725ae77Skettenis 	  if (scb->bufcnt == 0)
1195b725ae77Skettenis 	    next_state = FD_SCHEDULED;
1196b725ae77Skettenis 	  else
1197b725ae77Skettenis 	    {
1198b725ae77Skettenis 	      delete_file_handler (scb->fd);
1199b725ae77Skettenis 	      next_state = create_timer (0, push_event, scb);
1200b725ae77Skettenis 	    }
1201b725ae77Skettenis 	  break;
1202b725ae77Skettenis 	case NOTHING_SCHEDULED:
1203b725ae77Skettenis 	  if (scb->bufcnt == 0)
1204b725ae77Skettenis 	    {
1205b725ae77Skettenis 	      add_file_handler (scb->fd, fd_event, scb);
1206b725ae77Skettenis 	      next_state = FD_SCHEDULED;
1207b725ae77Skettenis 	    }
1208b725ae77Skettenis 	  else
1209b725ae77Skettenis 	    {
1210b725ae77Skettenis 	      next_state = create_timer (0, push_event, scb);
1211b725ae77Skettenis 	    }
1212b725ae77Skettenis 	  break;
1213b725ae77Skettenis 	default: /* TIMER SCHEDULED */
1214b725ae77Skettenis 	  if (scb->bufcnt == 0)
1215b725ae77Skettenis 	    {
1216b725ae77Skettenis 	      delete_timer (scb->async_state);
1217b725ae77Skettenis 	      add_file_handler (scb->fd, fd_event, scb);
1218b725ae77Skettenis 	      next_state = FD_SCHEDULED;
1219b725ae77Skettenis 	    }
1220b725ae77Skettenis 	  else
1221b725ae77Skettenis 	    next_state = scb->async_state;
1222b725ae77Skettenis 	  break;
1223b725ae77Skettenis 	}
1224b725ae77Skettenis       if (serial_debug_p (scb))
1225b725ae77Skettenis 	{
1226b725ae77Skettenis 	  switch (next_state)
1227b725ae77Skettenis 	    {
1228b725ae77Skettenis 	    case FD_SCHEDULED:
1229b725ae77Skettenis 	      if (scb->async_state != FD_SCHEDULED)
1230b725ae77Skettenis 		fprintf_unfiltered (gdb_stdlog, "[fd%d->fd-scheduled]\n",
1231b725ae77Skettenis 				    scb->fd);
1232b725ae77Skettenis 	      break;
1233b725ae77Skettenis 	    default: /* TIMER SCHEDULED */
1234b725ae77Skettenis 	      if (scb->async_state == FD_SCHEDULED)
1235b725ae77Skettenis 		fprintf_unfiltered (gdb_stdlog, "[fd%d->timer-scheduled]\n",
1236b725ae77Skettenis 				    scb->fd);
1237b725ae77Skettenis 	      break;
1238b725ae77Skettenis 	    }
1239b725ae77Skettenis 	}
1240b725ae77Skettenis       scb->async_state = next_state;
1241b725ae77Skettenis     }
1242b725ae77Skettenis }
1243b725ae77Skettenis 
1244b725ae77Skettenis /* FD_EVENT: This is scheduled when the input FIFO is empty (and there
1245b725ae77Skettenis    is no pending error).  As soon as data arrives, it is read into the
1246b725ae77Skettenis    input FIFO and the client notified.  The client should then drain
1247b725ae77Skettenis    the FIFO using readchar().  If the FIFO isn't immediatly emptied,
1248b725ae77Skettenis    push_event() is used to nag the client until it is. */
1249b725ae77Skettenis 
1250b725ae77Skettenis static void
fd_event(int error,void * context)1251b725ae77Skettenis fd_event (int error, void *context)
1252b725ae77Skettenis {
1253b725ae77Skettenis   struct serial *scb = context;
1254b725ae77Skettenis   if (error != 0)
1255b725ae77Skettenis     {
1256b725ae77Skettenis       scb->bufcnt = SERIAL_ERROR;
1257b725ae77Skettenis     }
1258b725ae77Skettenis   else if (scb->bufcnt == 0)
1259b725ae77Skettenis     {
1260b725ae77Skettenis       /* Prime the input FIFO.  The readchar() function is used to
1261b725ae77Skettenis          pull characters out of the buffer.  See also
1262b725ae77Skettenis          generic_readchar(). */
1263b725ae77Skettenis       int nr;
1264b725ae77Skettenis       do
1265b725ae77Skettenis 	{
1266b725ae77Skettenis 	  nr = read (scb->fd, scb->buf, BUFSIZ);
1267b725ae77Skettenis 	}
1268b725ae77Skettenis       while (nr == -1 && errno == EINTR);
1269b725ae77Skettenis       if (nr == 0)
1270b725ae77Skettenis 	{
1271b725ae77Skettenis 	  scb->bufcnt = SERIAL_EOF;
1272b725ae77Skettenis 	}
1273b725ae77Skettenis       else if (nr > 0)
1274b725ae77Skettenis 	{
1275b725ae77Skettenis 	  scb->bufcnt = nr;
1276b725ae77Skettenis 	  scb->bufp = scb->buf;
1277b725ae77Skettenis 	}
1278b725ae77Skettenis       else
1279b725ae77Skettenis 	{
1280b725ae77Skettenis 	  scb->bufcnt = SERIAL_ERROR;
1281b725ae77Skettenis 	}
1282b725ae77Skettenis     }
1283b725ae77Skettenis   scb->async_handler (scb, scb->async_context);
1284b725ae77Skettenis   reschedule (scb);
1285b725ae77Skettenis }
1286b725ae77Skettenis 
1287b725ae77Skettenis /* PUSH_EVENT: The input FIFO is non-empty (or there is a pending
1288b725ae77Skettenis    error).  Nag the client until all the data has been read.  In the
1289b725ae77Skettenis    case of errors, the client will need to close or de-async the
1290b725ae77Skettenis    device before naging stops. */
1291b725ae77Skettenis 
1292b725ae77Skettenis static void
push_event(void * context)1293b725ae77Skettenis push_event (void *context)
1294b725ae77Skettenis {
1295b725ae77Skettenis   struct serial *scb = context;
1296b725ae77Skettenis   scb->async_state = NOTHING_SCHEDULED; /* Timers are one-off */
1297b725ae77Skettenis   scb->async_handler (scb, scb->async_context);
1298b725ae77Skettenis   /* re-schedule */
1299b725ae77Skettenis   reschedule (scb);
1300b725ae77Skettenis }
1301b725ae77Skettenis 
1302b725ae77Skettenis /* Put the SERIAL device into/out-of ASYNC mode.  */
1303b725ae77Skettenis 
1304b725ae77Skettenis void
ser_unix_async(struct serial * scb,int async_p)1305b725ae77Skettenis ser_unix_async (struct serial *scb,
1306b725ae77Skettenis 		int async_p)
1307b725ae77Skettenis {
1308b725ae77Skettenis   if (async_p)
1309b725ae77Skettenis     {
1310b725ae77Skettenis       /* Force a re-schedule. */
1311b725ae77Skettenis       scb->async_state = NOTHING_SCHEDULED;
1312b725ae77Skettenis       if (serial_debug_p (scb))
1313b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog, "[fd%d->asynchronous]\n",
1314b725ae77Skettenis 			    scb->fd);
1315b725ae77Skettenis       reschedule (scb);
1316b725ae77Skettenis     }
1317b725ae77Skettenis   else
1318b725ae77Skettenis     {
1319b725ae77Skettenis       if (serial_debug_p (scb))
1320b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog, "[fd%d->synchronous]\n",
1321b725ae77Skettenis 			    scb->fd);
1322b725ae77Skettenis       /* De-schedule whatever tasks are currently scheduled. */
1323b725ae77Skettenis       switch (scb->async_state)
1324b725ae77Skettenis 	{
1325b725ae77Skettenis 	case FD_SCHEDULED:
1326b725ae77Skettenis 	  delete_file_handler (scb->fd);
1327b725ae77Skettenis 	  break;
1328b725ae77Skettenis 	case NOTHING_SCHEDULED:
1329b725ae77Skettenis 	  break;
1330b725ae77Skettenis 	default: /* TIMER SCHEDULED */
1331b725ae77Skettenis 	  delete_timer (scb->async_state);
1332b725ae77Skettenis 	  break;
1333b725ae77Skettenis 	}
1334b725ae77Skettenis     }
1335b725ae77Skettenis }
1336b725ae77Skettenis 
1337b725ae77Skettenis void
_initialize_ser_hardwire(void)1338b725ae77Skettenis _initialize_ser_hardwire (void)
1339b725ae77Skettenis {
1340b725ae77Skettenis   struct serial_ops *ops = XMALLOC (struct serial_ops);
1341b725ae77Skettenis   memset (ops, 0, sizeof (struct serial_ops));
1342b725ae77Skettenis   ops->name = "hardwire";
1343b725ae77Skettenis   ops->next = 0;
1344b725ae77Skettenis   ops->open = hardwire_open;
1345b725ae77Skettenis   ops->close = hardwire_close;
1346b725ae77Skettenis   /* FIXME: Don't replace this with the equivalent ser_unix*() until
1347b725ae77Skettenis      the old TERMIOS/SGTTY/... timer code has been flushed. cagney
1348b725ae77Skettenis      1999-09-16. */
1349b725ae77Skettenis   ops->readchar = hardwire_readchar;
1350b725ae77Skettenis   ops->write = ser_unix_write;
1351b725ae77Skettenis   ops->flush_output = hardwire_flush_output;
1352b725ae77Skettenis   ops->flush_input = hardwire_flush_input;
1353b725ae77Skettenis   ops->send_break = hardwire_send_break;
1354b725ae77Skettenis   ops->go_raw = hardwire_raw;
1355b725ae77Skettenis   ops->get_tty_state = hardwire_get_tty_state;
1356b725ae77Skettenis   ops->set_tty_state = hardwire_set_tty_state;
1357b725ae77Skettenis   ops->print_tty_state = hardwire_print_tty_state;
1358b725ae77Skettenis   ops->noflush_set_tty_state = hardwire_noflush_set_tty_state;
1359b725ae77Skettenis   ops->setbaudrate = hardwire_setbaudrate;
1360b725ae77Skettenis   ops->setstopbits = hardwire_setstopbits;
1361b725ae77Skettenis   ops->drain_output = hardwire_drain_output;
1362b725ae77Skettenis   ops->async = ser_unix_async;
1363b725ae77Skettenis   serial_add_interface (ops);
1364e93f7393Sniklas }
1365