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