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