* NEWS: Mention native Windows support.
[deliverable/binutils-gdb.git] / gdb / serial.c
1 /* Generic serial interface routines
2
3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
22
23 #include "defs.h"
24 #include <ctype.h>
25 #include "serial.h"
26 #include "gdb_string.h"
27 #include "gdbcmd.h"
28
29 extern void _initialize_serial (void);
30
31 /* Is serial being debugged? */
32
33 static int global_serial_debug_p;
34
35 /* Linked list of serial I/O handlers */
36
37 static struct serial_ops *serial_ops_list = NULL;
38
39 /* This is the last serial stream opened. Used by connect command. */
40
41 static struct serial *last_serial_opened = NULL;
42
43 /* Pointer to list of scb's. */
44
45 static struct serial *scb_base;
46
47 /* Non-NULL gives filename which contains a recording of the remote session,
48 suitable for playback by gdbserver. */
49
50 static char *serial_logfile = NULL;
51 static struct ui_file *serial_logfp = NULL;
52
53 static struct serial_ops *serial_interface_lookup (char *);
54 static void serial_logchar (struct ui_file *stream, int ch_type, int ch, int timeout);
55 static const char logbase_hex[] = "hex";
56 static const char logbase_octal[] = "octal";
57 static const char logbase_ascii[] = "ascii";
58 static const char *logbase_enums[] =
59 {logbase_hex, logbase_octal, logbase_ascii, NULL};
60 static const char *serial_logbase = logbase_ascii;
61 \f
62
63 static int serial_current_type = 0;
64
65 /* Log char CH of type CHTYPE, with TIMEOUT */
66
67 /* Define bogus char to represent a BREAK. Should be careful to choose a value
68 that can't be confused with a normal char, or an error code. */
69 #define SERIAL_BREAK 1235
70
71 static void
72 serial_logchar (struct ui_file *stream, int ch_type, int ch, int timeout)
73 {
74 if (ch_type != serial_current_type)
75 {
76 fprintf_unfiltered (stream, "\n%c ", ch_type);
77 serial_current_type = ch_type;
78 }
79
80 if (serial_logbase != logbase_ascii)
81 fputc_unfiltered (' ', stream);
82
83 switch (ch)
84 {
85 case SERIAL_TIMEOUT:
86 fprintf_unfiltered (stream, "<Timeout: %d seconds>", timeout);
87 return;
88 case SERIAL_ERROR:
89 fprintf_unfiltered (stream, "<Error: %s>", safe_strerror (errno));
90 return;
91 case SERIAL_EOF:
92 fputs_unfiltered ("<Eof>", stream);
93 return;
94 case SERIAL_BREAK:
95 fputs_unfiltered ("<Break>", stream);
96 return;
97 default:
98 if (serial_logbase == logbase_hex)
99 fprintf_unfiltered (stream, "%02x", ch & 0xff);
100 else if (serial_logbase == logbase_octal)
101 fprintf_unfiltered (stream, "%03o", ch & 0xff);
102 else
103 switch (ch)
104 {
105 case '\\':
106 fputs_unfiltered ("\\\\", stream);
107 break;
108 case '\b':
109 fputs_unfiltered ("\\b", stream);
110 break;
111 case '\f':
112 fputs_unfiltered ("\\f", stream);
113 break;
114 case '\n':
115 fputs_unfiltered ("\\n", stream);
116 break;
117 case '\r':
118 fputs_unfiltered ("\\r", stream);
119 break;
120 case '\t':
121 fputs_unfiltered ("\\t", stream);
122 break;
123 case '\v':
124 fputs_unfiltered ("\\v", stream);
125 break;
126 default:
127 fprintf_unfiltered (stream, isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF);
128 break;
129 }
130 }
131 }
132
133 void
134 serial_log_command (const char *cmd)
135 {
136 if (!serial_logfp)
137 return;
138
139 serial_current_type = 'c';
140
141 fputs_unfiltered ("\nc ", serial_logfp);
142 fputs_unfiltered (cmd, serial_logfp);
143
144 /* Make sure that the log file is as up-to-date as possible,
145 in case we are getting ready to dump core or something. */
146 gdb_flush (serial_logfp);
147 }
148
149 \f
150 static struct serial_ops *
151 serial_interface_lookup (char *name)
152 {
153 struct serial_ops *ops;
154
155 for (ops = serial_ops_list; ops; ops = ops->next)
156 if (strcmp (name, ops->name) == 0)
157 return ops;
158
159 return NULL;
160 }
161
162 void
163 serial_add_interface (struct serial_ops *optable)
164 {
165 optable->next = serial_ops_list;
166 serial_ops_list = optable;
167 }
168
169 /* Open up a device or a network socket, depending upon the syntax of NAME. */
170
171 struct serial *
172 serial_open (const char *name)
173 {
174 struct serial *scb;
175 struct serial_ops *ops;
176 const char *open_name = name;
177
178 for (scb = scb_base; scb; scb = scb->next)
179 if (scb->name && strcmp (scb->name, name) == 0)
180 {
181 scb->refcnt++;
182 return scb;
183 }
184
185 if (strcmp (name, "pc") == 0)
186 ops = serial_interface_lookup ("pc");
187 else if (strchr (name, ':'))
188 ops = serial_interface_lookup ("tcp");
189 else if (strncmp (name, "lpt", 3) == 0)
190 ops = serial_interface_lookup ("parallel");
191 else if (strncmp (name, "|", 1) == 0)
192 {
193 ops = serial_interface_lookup ("pipe");
194 open_name = name + 1; /* discard ``|'' */
195 }
196 else
197 ops = serial_interface_lookup ("hardwire");
198
199 if (!ops)
200 return NULL;
201
202 scb = XMALLOC (struct serial);
203
204 scb->ops = ops;
205
206 scb->bufcnt = 0;
207 scb->bufp = scb->buf;
208
209 if (scb->ops->open (scb, open_name))
210 {
211 xfree (scb);
212 return NULL;
213 }
214
215 scb->name = xstrdup (name);
216 scb->next = scb_base;
217 scb->refcnt = 1;
218 scb->debug_p = 0;
219 scb->async_state = 0;
220 scb->async_handler = NULL;
221 scb->async_context = NULL;
222 scb_base = scb;
223
224 last_serial_opened = scb;
225
226 if (serial_logfile != NULL)
227 {
228 serial_logfp = gdb_fopen (serial_logfile, "w");
229 if (serial_logfp == NULL)
230 perror_with_name (serial_logfile);
231 }
232
233 return scb;
234 }
235
236 /* Return the open serial device for FD, if found, or NULL if FD
237 is not already opened. */
238
239 struct serial *
240 serial_for_fd (int fd)
241 {
242 struct serial *scb;
243 struct serial_ops *ops;
244
245 for (scb = scb_base; scb; scb = scb->next)
246 if (scb->fd == fd)
247 return scb;
248
249 return NULL;
250 }
251
252 struct serial *
253 serial_fdopen (const int fd)
254 {
255 struct serial *scb;
256 struct serial_ops *ops;
257
258 for (scb = scb_base; scb; scb = scb->next)
259 if (scb->fd == fd)
260 {
261 scb->refcnt++;
262 return scb;
263 }
264
265 ops = serial_interface_lookup ("terminal");
266 if (!ops)
267 ops = serial_interface_lookup ("hardwire");
268
269 if (!ops)
270 return NULL;
271
272 scb = XCALLOC (1, struct serial);
273
274 scb->ops = ops;
275
276 scb->bufcnt = 0;
277 scb->bufp = scb->buf;
278
279 scb->fd = fd;
280
281 scb->name = NULL;
282 scb->next = scb_base;
283 scb->refcnt = 1;
284 scb->debug_p = 0;
285 scb->async_state = 0;
286 scb->async_handler = NULL;
287 scb->async_context = NULL;
288 scb_base = scb;
289
290 last_serial_opened = scb;
291
292 return scb;
293 }
294
295 static void
296 do_serial_close (struct serial *scb, int really_close)
297 {
298 struct serial *tmp_scb;
299
300 last_serial_opened = NULL;
301
302 if (serial_logfp)
303 {
304 fputs_unfiltered ("\nEnd of log\n", serial_logfp);
305 serial_current_type = 0;
306
307 /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
308 ui_file_delete (serial_logfp);
309 serial_logfp = NULL;
310 }
311
312 /* This is bogus. It's not our fault if you pass us a bad scb...! Rob, you
313 should fix your code instead. */
314
315 if (!scb)
316 return;
317
318 scb->refcnt--;
319 if (scb->refcnt > 0)
320 return;
321
322 /* ensure that the FD has been taken out of async mode */
323 if (scb->async_handler != NULL)
324 serial_async (scb, NULL, NULL);
325
326 if (really_close)
327 scb->ops->close (scb);
328
329 if (scb->name)
330 xfree (scb->name);
331
332 if (scb_base == scb)
333 scb_base = scb_base->next;
334 else
335 for (tmp_scb = scb_base; tmp_scb; tmp_scb = tmp_scb->next)
336 {
337 if (tmp_scb->next != scb)
338 continue;
339
340 tmp_scb->next = tmp_scb->next->next;
341 break;
342 }
343
344 xfree (scb);
345 }
346
347 void
348 serial_close (struct serial *scb)
349 {
350 do_serial_close (scb, 1);
351 }
352
353 void
354 serial_un_fdopen (struct serial *scb)
355 {
356 do_serial_close (scb, 0);
357 }
358
359 int
360 serial_readchar (struct serial *scb, int timeout)
361 {
362 int ch;
363
364 /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
365 code is finished. */
366 if (0 && serial_is_async_p (scb) && timeout < 0)
367 internal_error (__FILE__, __LINE__,
368 _("serial_readchar: blocking read in async mode"));
369
370 ch = scb->ops->readchar (scb, timeout);
371 if (serial_logfp != NULL)
372 {
373 serial_logchar (serial_logfp, 'r', ch, timeout);
374
375 /* Make sure that the log file is as up-to-date as possible,
376 in case we are getting ready to dump core or something. */
377 gdb_flush (serial_logfp);
378 }
379 if (serial_debug_p (scb))
380 {
381 fprintf_unfiltered (gdb_stdlog, "[");
382 serial_logchar (gdb_stdlog, 'r', ch, timeout);
383 fprintf_unfiltered (gdb_stdlog, "]");
384 gdb_flush (gdb_stdlog);
385 }
386
387 return (ch);
388 }
389
390 int
391 serial_write (struct serial *scb, const char *str, int len)
392 {
393 if (serial_logfp != NULL)
394 {
395 int count;
396
397 for (count = 0; count < len; count++)
398 serial_logchar (serial_logfp, 'w', str[count] & 0xff, 0);
399
400 /* Make sure that the log file is as up-to-date as possible,
401 in case we are getting ready to dump core or something. */
402 gdb_flush (serial_logfp);
403 }
404
405 return (scb->ops->write (scb, str, len));
406 }
407
408 void
409 serial_printf (struct serial *desc, const char *format,...)
410 {
411 va_list args;
412 char *buf;
413 va_start (args, format);
414
415 buf = xstrvprintf (format, args);
416 serial_write (desc, buf, strlen (buf));
417
418 xfree (buf);
419 va_end (args);
420 }
421
422 int
423 serial_drain_output (struct serial *scb)
424 {
425 return scb->ops->drain_output (scb);
426 }
427
428 int
429 serial_flush_output (struct serial *scb)
430 {
431 return scb->ops->flush_output (scb);
432 }
433
434 int
435 serial_flush_input (struct serial *scb)
436 {
437 return scb->ops->flush_input (scb);
438 }
439
440 int
441 serial_send_break (struct serial *scb)
442 {
443 if (serial_logfp != NULL)
444 serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
445
446 return (scb->ops->send_break (scb));
447 }
448
449 void
450 serial_raw (struct serial *scb)
451 {
452 scb->ops->go_raw (scb);
453 }
454
455 serial_ttystate
456 serial_get_tty_state (struct serial *scb)
457 {
458 return scb->ops->get_tty_state (scb);
459 }
460
461 int
462 serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
463 {
464 return scb->ops->set_tty_state (scb, ttystate);
465 }
466
467 void
468 serial_print_tty_state (struct serial *scb,
469 serial_ttystate ttystate,
470 struct ui_file *stream)
471 {
472 scb->ops->print_tty_state (scb, ttystate, stream);
473 }
474
475 int
476 serial_noflush_set_tty_state (struct serial *scb,
477 serial_ttystate new_ttystate,
478 serial_ttystate old_ttystate)
479 {
480 return scb->ops->noflush_set_tty_state (scb, new_ttystate, old_ttystate);
481 }
482
483 int
484 serial_setbaudrate (struct serial *scb, int rate)
485 {
486 return scb->ops->setbaudrate (scb, rate);
487 }
488
489 int
490 serial_setstopbits (struct serial *scb, int num)
491 {
492 return scb->ops->setstopbits (scb, num);
493 }
494
495 int
496 serial_can_async_p (struct serial *scb)
497 {
498 return (scb->ops->async != NULL);
499 }
500
501 int
502 serial_is_async_p (struct serial *scb)
503 {
504 return (scb->ops->async != NULL) && (scb->async_handler != NULL);
505 }
506
507 void
508 serial_async (struct serial *scb,
509 serial_event_ftype *handler,
510 void *context)
511 {
512 /* Only change mode if there is a need. */
513 if ((scb->async_handler == NULL)
514 != (handler == NULL))
515 scb->ops->async (scb, handler != NULL);
516 scb->async_handler = handler;
517 scb->async_context = context;
518 }
519
520 int
521 deprecated_serial_fd (struct serial *scb)
522 {
523 /* FIXME: should this output a warning that deprecated code is being
524 called? */
525 if (scb->fd < 0)
526 {
527 internal_error (__FILE__, __LINE__,
528 _("serial: FD not valid"));
529 }
530 return scb->fd; /* sigh */
531 }
532
533 void
534 serial_debug (struct serial *scb, int debug_p)
535 {
536 scb->debug_p = debug_p;
537 }
538
539 int
540 serial_debug_p (struct serial *scb)
541 {
542 return scb->debug_p || global_serial_debug_p;
543 }
544
545 #ifdef USE_WIN32API
546 void
547 serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
548 {
549 if (scb->ops->wait_handle)
550 scb->ops->wait_handle (scb, read, except);
551 else
552 {
553 *read = (HANDLE) _get_osfhandle (scb->fd);
554 *except = NULL;
555 }
556 }
557 #endif
558
559 #if 0
560 /* The connect command is #if 0 because I hadn't thought of an elegant
561 way to wait for I/O on two `struct serial *'s simultaneously. Two
562 solutions came to mind:
563
564 1) Fork, and have have one fork handle the to user direction,
565 and have the other hand the to target direction. This
566 obviously won't cut it for MSDOS.
567
568 2) Use something like select. This assumes that stdin and
569 the target side can both be waited on via the same
570 mechanism. This may not be true for DOS, if GDB is
571 talking to the target via a TCP socket.
572 -grossman, 8 Jun 93 */
573
574 /* Connect the user directly to the remote system. This command acts just like
575 the 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
576
577 static struct serial *tty_desc; /* Controlling terminal */
578
579 static void
580 cleanup_tty (serial_ttystate ttystate)
581 {
582 printf_unfiltered ("\r\n[Exiting connect mode]\r\n");
583 serial_set_tty_state (tty_desc, ttystate);
584 xfree (ttystate);
585 serial_close (tty_desc);
586 }
587
588 static void
589 connect_command (char *args, int fromtty)
590 {
591 int c;
592 char cur_esc = 0;
593 serial_ttystate ttystate;
594 struct serial *port_desc; /* TTY port */
595
596 dont_repeat ();
597
598 if (args)
599 fprintf_unfiltered (gdb_stderr, "This command takes no args. They have been ignored.\n");
600
601 printf_unfiltered ("[Entering connect mode. Use ~. or ~^D to escape]\n");
602
603 tty_desc = serial_fdopen (0);
604 port_desc = last_serial_opened;
605
606 ttystate = serial_get_tty_state (tty_desc);
607
608 serial_raw (tty_desc);
609 serial_raw (port_desc);
610
611 make_cleanup (cleanup_tty, ttystate);
612
613 while (1)
614 {
615 int mask;
616
617 mask = serial_wait_2 (tty_desc, port_desc, -1);
618
619 if (mask & 2)
620 { /* tty input */
621 char cx;
622
623 while (1)
624 {
625 c = serial_readchar (tty_desc, 0);
626
627 if (c == SERIAL_TIMEOUT)
628 break;
629
630 if (c < 0)
631 perror_with_name (_("connect"));
632
633 cx = c;
634 serial_write (port_desc, &cx, 1);
635
636 switch (cur_esc)
637 {
638 case 0:
639 if (c == '\r')
640 cur_esc = c;
641 break;
642 case '\r':
643 if (c == '~')
644 cur_esc = c;
645 else
646 cur_esc = 0;
647 break;
648 case '~':
649 if (c == '.' || c == '\004')
650 return;
651 else
652 cur_esc = 0;
653 }
654 }
655 }
656
657 if (mask & 1)
658 { /* Port input */
659 char cx;
660
661 while (1)
662 {
663 c = serial_readchar (port_desc, 0);
664
665 if (c == SERIAL_TIMEOUT)
666 break;
667
668 if (c < 0)
669 perror_with_name (_("connect"));
670
671 cx = c;
672
673 serial_write (tty_desc, &cx, 1);
674 }
675 }
676 }
677 }
678 #endif /* 0 */
679
680 /* Serial set/show framework. */
681
682 static struct cmd_list_element *serial_set_cmdlist;
683 static struct cmd_list_element *serial_show_cmdlist;
684
685 static void
686 serial_set_cmd (char *args, int from_tty)
687 {
688 printf_unfiltered ("\"set serial\" must be followed by the name of a command.\n");
689 help_list (serial_set_cmdlist, "set serial ", -1, gdb_stdout);
690 }
691
692 static void
693 serial_show_cmd (char *args, int from_tty)
694 {
695 cmd_show_list (serial_show_cmdlist, from_tty, "");
696 }
697
698
699 void
700 _initialize_serial (void)
701 {
702 #if 0
703 add_com ("connect", class_obscure, connect_command, _("\
704 Connect the terminal directly up to the command monitor.\n\
705 Use <CR>~. or <CR>~^D to break out."));
706 #endif /* 0 */
707
708 add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
709 Set default serial/parallel port configuration."),
710 &serial_set_cmdlist, "set serial ",
711 0/*allow-unknown*/,
712 &setlist);
713
714 add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
715 Show default serial/parallel port configuration."),
716 &serial_show_cmdlist, "show serial ",
717 0/*allow-unknown*/,
718 &showlist);
719
720 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
721 Set filename for remote session recording."), _("\
722 Show filename for remote session recording."), _("\
723 This file is used to record the remote session for future playback\n\
724 by gdbserver."),
725 NULL,
726 NULL, /* FIXME: i18n: */
727 &setlist, &showlist);
728
729 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
730 &serial_logbase, _("\
731 Set numerical base for remote session logging"), _("\
732 Show numerical base for remote session logging"), NULL,
733 NULL,
734 NULL, /* FIXME: i18n: */
735 &setlist, &showlist);
736
737 add_setshow_zinteger_cmd ("serial", class_maintenance,
738 &global_serial_debug_p, _("\
739 Set serial debugging."), _("\
740 Show serial debugging."), _("\
741 When non-zero, serial port debugging is enabled."),
742 NULL,
743 NULL, /* FIXME: i18n: */
744 &setdebuglist, &showdebuglist);
745 }
This page took 0.045905 seconds and 4 git commands to generate.