2011-05-23 Pedro Alves <pedro@codesourcery.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
1e182ce8
UW
496serial_ttystate
497serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
498{
499 return scb->ops->copy_tty_state (scb, ttystate);
500}
501
c2c6d25f 502int
819cc324 503serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
c2c6d25f
JM
504{
505 return scb->ops->set_tty_state (scb, ttystate);
506}
507
508void
819cc324 509serial_print_tty_state (struct serial *scb,
c2c6d25f 510 serial_ttystate ttystate,
d9fcf2fb 511 struct ui_file *stream)
c2c6d25f
JM
512{
513 scb->ops->print_tty_state (scb, ttystate, stream);
514}
515
516int
819cc324 517serial_noflush_set_tty_state (struct serial *scb,
c2c6d25f
JM
518 serial_ttystate new_ttystate,
519 serial_ttystate old_ttystate)
520{
521 return scb->ops->noflush_set_tty_state (scb, new_ttystate, old_ttystate);
522}
523
524int
819cc324 525serial_setbaudrate (struct serial *scb, int rate)
c2c6d25f
JM
526{
527 return scb->ops->setbaudrate (scb, rate);
528}
529
530int
819cc324 531serial_setstopbits (struct serial *scb, int num)
c2c6d25f
JM
532{
533 return scb->ops->setstopbits (scb, num);
534}
535
536int
819cc324 537serial_can_async_p (struct serial *scb)
c2c6d25f
JM
538{
539 return (scb->ops->async != NULL);
540}
541
542int
819cc324 543serial_is_async_p (struct serial *scb)
c2c6d25f
JM
544{
545 return (scb->ops->async != NULL) && (scb->async_handler != NULL);
546}
547
548void
819cc324 549serial_async (struct serial *scb,
c2c6d25f
JM
550 serial_event_ftype *handler,
551 void *context)
552{
05ce04a4 553 int changed = ((scb->async_handler == NULL) != (handler == NULL));
433759f7 554
c2c6d25f
JM
555 scb->async_handler = handler;
556 scb->async_context = context;
05ce04a4
VP
557 /* Only change mode if there is a need. */
558 if (changed)
559 scb->ops->async (scb, handler != NULL);
c2c6d25f
JM
560}
561
562int
819cc324 563deprecated_serial_fd (struct serial *scb)
c2c6d25f
JM
564{
565 /* FIXME: should this output a warning that deprecated code is being
c378eb4e 566 called? */
c2c6d25f
JM
567 if (scb->fd < 0)
568 {
8e65ff28 569 internal_error (__FILE__, __LINE__,
e2e0b3e5 570 _("serial: FD not valid"));
c2c6d25f
JM
571 }
572 return scb->fd; /* sigh */
573}
574
2acceee2 575void
819cc324 576serial_debug (struct serial *scb, int debug_p)
2acceee2
JM
577{
578 scb->debug_p = debug_p;
579}
580
581int
819cc324 582serial_debug_p (struct serial *scb)
2acceee2
JM
583{
584 return scb->debug_p || global_serial_debug_p;
585}
586
0ea3f30e
DJ
587#ifdef USE_WIN32API
588void
589serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
590{
591 if (scb->ops->wait_handle)
592 scb->ops->wait_handle (scb, read, except);
593 else
594 {
595 *read = (HANDLE) _get_osfhandle (scb->fd);
596 *except = NULL;
597 }
598}
c3e2b812
DJ
599
600void
601serial_done_wait_handle (struct serial *scb)
602{
603 if (scb->ops->done_wait_handle)
604 scb->ops->done_wait_handle (scb);
605}
0ea3f30e 606#endif
2acceee2 607
58f07bae
PA
608int
609serial_pipe (struct serial *scbs[2])
610{
611 struct serial_ops *ops;
612 int fildes[2];
613
614 ops = serial_interface_lookup ("pipe");
615 if (!ops)
616 {
617 errno = ENOSYS;
618 return -1;
619 }
620
621 if (gdb_pipe (fildes) == -1)
622 return -1;
623
624 scbs[0] = serial_fdopen_ops (fildes[0], ops);
625 scbs[1] = serial_fdopen_ops (fildes[1], ops);
626 return 0;
627}
628
c906108c 629#if 0
819cc324
AC
630/* The connect command is #if 0 because I hadn't thought of an elegant
631 way to wait for I/O on two `struct serial *'s simultaneously. Two
632 solutions came to mind:
c906108c 633
c5aa993b
JM
634 1) Fork, and have have one fork handle the to user direction,
635 and have the other hand the to target direction. This
636 obviously won't cut it for MSDOS.
c906108c 637
c5aa993b
JM
638 2) Use something like select. This assumes that stdin and
639 the target side can both be waited on via the same
640 mechanism. This may not be true for DOS, if GDB is
641 talking to the target via a TCP socket.
819cc324 642 -grossman, 8 Jun 93 */
c906108c
SS
643
644/* Connect the user directly to the remote system. This command acts just like
645 the 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
646
819cc324 647static struct serial *tty_desc; /* Controlling terminal */
c906108c
SS
648
649static void
c2c6d25f 650cleanup_tty (serial_ttystate ttystate)
c906108c
SS
651{
652 printf_unfiltered ("\r\n[Exiting connect mode]\r\n");
2cd58942 653 serial_set_tty_state (tty_desc, ttystate);
b8c9b27d 654 xfree (ttystate);
2cd58942 655 serial_close (tty_desc);
c906108c
SS
656}
657
658static void
c2c6d25f 659connect_command (char *args, int fromtty)
c906108c
SS
660{
661 int c;
662 char cur_esc = 0;
663 serial_ttystate ttystate;
819cc324 664 struct serial *port_desc; /* TTY port */
c906108c 665
c5aa993b 666 dont_repeat ();
c906108c
SS
667
668 if (args)
3e43a32a
MS
669 fprintf_unfiltered (gdb_stderr,
670 "This command takes no args. "
671 "They have been ignored.\n");
c5aa993b
JM
672
673 printf_unfiltered ("[Entering connect mode. Use ~. or ~^D to escape]\n");
c906108c 674
2cd58942 675 tty_desc = serial_fdopen (0);
c906108c
SS
676 port_desc = last_serial_opened;
677
2cd58942 678 ttystate = serial_get_tty_state (tty_desc);
c906108c 679
2cd58942
AC
680 serial_raw (tty_desc);
681 serial_raw (port_desc);
c906108c
SS
682
683 make_cleanup (cleanup_tty, ttystate);
684
685 while (1)
686 {
687 int mask;
688
2cd58942 689 mask = serial_wait_2 (tty_desc, port_desc, -1);
c906108c
SS
690
691 if (mask & 2)
692 { /* tty input */
693 char cx;
694
695 while (1)
696 {
2cd58942 697 c = serial_readchar (tty_desc, 0);
c906108c
SS
698
699 if (c == SERIAL_TIMEOUT)
c5aa993b 700 break;
c906108c
SS
701
702 if (c < 0)
e2e0b3e5 703 perror_with_name (_("connect"));
c906108c
SS
704
705 cx = c;
2cd58942 706 serial_write (port_desc, &cx, 1);
c906108c
SS
707
708 switch (cur_esc)
709 {
710 case 0:
711 if (c == '\r')
712 cur_esc = c;
713 break;
714 case '\r':
715 if (c == '~')
716 cur_esc = c;
717 else
718 cur_esc = 0;
719 break;
720 case '~':
721 if (c == '.' || c == '\004')
722 return;
723 else
724 cur_esc = 0;
725 }
726 }
727 }
728
729 if (mask & 1)
730 { /* Port input */
731 char cx;
732
733 while (1)
734 {
2cd58942 735 c = serial_readchar (port_desc, 0);
c906108c
SS
736
737 if (c == SERIAL_TIMEOUT)
c5aa993b 738 break;
c906108c
SS
739
740 if (c < 0)
e2e0b3e5 741 perror_with_name (_("connect"));
c906108c
SS
742
743 cx = c;
744
2cd58942 745 serial_write (tty_desc, &cx, 1);
c906108c
SS
746 }
747 }
748 }
749}
750#endif /* 0 */
751
e3abfe1d
AC
752/* Serial set/show framework. */
753
754static struct cmd_list_element *serial_set_cmdlist;
755static struct cmd_list_element *serial_show_cmdlist;
756
757static void
758serial_set_cmd (char *args, int from_tty)
759{
3e43a32a
MS
760 printf_unfiltered ("\"set serial\" must be followed "
761 "by the name of a command.\n");
e3abfe1d
AC
762 help_list (serial_set_cmdlist, "set serial ", -1, gdb_stdout);
763}
764
765static void
766serial_show_cmd (char *args, int from_tty)
767{
768 cmd_show_list (serial_show_cmdlist, from_tty, "");
769}
770
771
c906108c 772void
c2c6d25f 773_initialize_serial (void)
c906108c
SS
774{
775#if 0
1bedd215
AC
776 add_com ("connect", class_obscure, connect_command, _("\
777Connect the terminal directly up to the command monitor.\n\
778Use <CR>~. or <CR>~^D to break out."));
c906108c
SS
779#endif /* 0 */
780
1bedd215
AC
781 add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
782Set default serial/parallel port configuration."),
e3abfe1d
AC
783 &serial_set_cmdlist, "set serial ",
784 0/*allow-unknown*/,
785 &setlist);
786
1bedd215
AC
787 add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
788Show default serial/parallel port configuration."),
e3abfe1d
AC
789 &serial_show_cmdlist, "show serial ",
790 0/*allow-unknown*/,
791 &showlist);
792
f397e303
AC
793 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
794Set filename for remote session recording."), _("\
795Show filename for remote session recording."), _("\
c906108c 796This file is used to record the remote session for future playback\n\
f397e303
AC
797by gdbserver."),
798 NULL,
799 NULL, /* FIXME: i18n: */
800 &setlist, &showlist);
c906108c 801
7ab04401
AC
802 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
803 &serial_logbase, _("\
804Set numerical base for remote session logging"), _("\
805Show numerical base for remote session logging"), NULL,
806 NULL,
807 NULL, /* FIXME: i18n: */
808 &setlist, &showlist);
2acceee2 809
85c07804
AC
810 add_setshow_zinteger_cmd ("serial", class_maintenance,
811 &global_serial_debug_p, _("\
812Set serial debugging."), _("\
813Show serial debugging."), _("\
814When non-zero, serial port debugging is enabled."),
815 NULL,
816 NULL, /* FIXME: i18n: */
817 &setdebuglist, &showdebuglist);
c906108c 818}
This page took 1.168806 seconds and 4 git commands to generate.