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