Update copyright year range in all GDB files
[deliverable/binutils-gdb.git] / gdb / serial.c
CommitLineData
c906108c 1/* Generic serial interface routines
4fcf66da 2
e2882c85 3 Copyright (C) 1992-2018 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include <ctype.h>
22#include "serial.h"
c906108c 23#include "gdbcmd.h"
529480d0 24#include "cli/cli-utils.h"
c906108c 25
c378eb4e 26/* Is serial being debugged? */
2acceee2 27
ccce17b0 28static unsigned int global_serial_debug_p;
2acceee2 29
fcd488ca
TT
30typedef const struct serial_ops *serial_ops_p;
31DEF_VEC_P (serial_ops_p);
c906108c 32
fcd488ca
TT
33/* Serial I/O handlers. */
34
35VEC (serial_ops_p) *serial_ops_list = NULL;
c906108c 36
5eb3b062
PA
37/* Pointer to list of scb's. */
38
39static struct serial *scb_base;
40
c906108c 41/* Non-NULL gives filename which contains a recording of the remote session,
c378eb4e 42 suitable for playback by gdbserver. */
c906108c
SS
43
44static char *serial_logfile = NULL;
d9fcf2fb 45static struct ui_file *serial_logfp = NULL;
c906108c 46
fcd488ca 47static const struct serial_ops *serial_interface_lookup (const char *);
3e43a32a
MS
48static void serial_logchar (struct ui_file *stream,
49 int ch_type, int ch, int timeout);
53904c9e
AC
50static const char logbase_hex[] = "hex";
51static const char logbase_octal[] = "octal";
52static const char logbase_ascii[] = "ascii";
40478521 53static const char *const logbase_enums[] =
c5aa993b 54{logbase_hex, logbase_octal, logbase_ascii, NULL};
53904c9e 55static const char *serial_logbase = logbase_ascii;
c906108c 56\f
c5aa993b 57
c906108c
SS
58static int serial_current_type = 0;
59
c378eb4e 60/* Log char CH of type CHTYPE, with TIMEOUT. */
c906108c
SS
61
62/* Define bogus char to represent a BREAK. Should be careful to choose a value
63 that can't be confused with a normal char, or an error code. */
64#define SERIAL_BREAK 1235
65
66static void
d9fcf2fb 67serial_logchar (struct ui_file *stream, int ch_type, int ch, int timeout)
c906108c
SS
68{
69 if (ch_type != serial_current_type)
70 {
2acceee2 71 fprintf_unfiltered (stream, "\n%c ", ch_type);
c906108c
SS
72 serial_current_type = ch_type;
73 }
74
75 if (serial_logbase != logbase_ascii)
2acceee2 76 fputc_unfiltered (' ', stream);
c906108c
SS
77
78 switch (ch)
79 {
80 case SERIAL_TIMEOUT:
2acceee2 81 fprintf_unfiltered (stream, "<Timeout: %d seconds>", timeout);
c906108c
SS
82 return;
83 case SERIAL_ERROR:
2acceee2 84 fprintf_unfiltered (stream, "<Error: %s>", safe_strerror (errno));
c906108c
SS
85 return;
86 case SERIAL_EOF:
2acceee2 87 fputs_unfiltered ("<Eof>", stream);
c906108c
SS
88 return;
89 case SERIAL_BREAK:
2acceee2 90 fputs_unfiltered ("<Break>", stream);
c906108c
SS
91 return;
92 default:
93 if (serial_logbase == logbase_hex)
2acceee2 94 fprintf_unfiltered (stream, "%02x", ch & 0xff);
c906108c 95 else if (serial_logbase == logbase_octal)
2acceee2 96 fprintf_unfiltered (stream, "%03o", ch & 0xff);
c906108c
SS
97 else
98 switch (ch)
99 {
c5aa993b 100 case '\\':
2acceee2 101 fputs_unfiltered ("\\\\", stream);
c5aa993b
JM
102 break;
103 case '\b':
2acceee2 104 fputs_unfiltered ("\\b", stream);
c5aa993b
JM
105 break;
106 case '\f':
2acceee2 107 fputs_unfiltered ("\\f", stream);
c5aa993b
JM
108 break;
109 case '\n':
2acceee2 110 fputs_unfiltered ("\\n", stream);
c5aa993b
JM
111 break;
112 case '\r':
2acceee2 113 fputs_unfiltered ("\\r", stream);
c5aa993b
JM
114 break;
115 case '\t':
2acceee2 116 fputs_unfiltered ("\\t", stream);
c5aa993b
JM
117 break;
118 case '\v':
2acceee2 119 fputs_unfiltered ("\\v", stream);
c5aa993b
JM
120 break;
121 default:
3e43a32a
MS
122 fprintf_unfiltered (stream,
123 isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF);
c5aa993b 124 break;
c906108c
SS
125 }
126 }
127}
128
129void
4ab76ea3 130serial_log_command (struct target_ops *self, const char *cmd)
c906108c
SS
131{
132 if (!serial_logfp)
133 return;
134
135 serial_current_type = 'c';
136
137 fputs_unfiltered ("\nc ", serial_logfp);
138 fputs_unfiltered (cmd, serial_logfp);
139
140 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 141 in case we are getting ready to dump core or something. */
c906108c
SS
142 gdb_flush (serial_logfp);
143}
144
c2c6d25f 145\f
fcd488ca 146static const struct serial_ops *
58f07bae 147serial_interface_lookup (const char *name)
c906108c 148{
fcd488ca
TT
149 const struct serial_ops *ops;
150 int i;
c906108c 151
fcd488ca 152 for (i = 0; VEC_iterate (serial_ops_p, serial_ops_list, i, ops); ++i)
c906108c
SS
153 if (strcmp (name, ops->name) == 0)
154 return ops;
155
156 return NULL;
157}
158
159void
fcd488ca 160serial_add_interface (const struct serial_ops *optable)
c906108c 161{
fcd488ca 162 VEC_safe_push (serial_ops_p, serial_ops_list, optable);
c906108c
SS
163}
164
5eb3b062
PA
165/* Return the open serial device for FD, if found, or NULL if FD is
166 not already opened. */
167
168struct serial *
169serial_for_fd (int fd)
170{
171 struct serial *scb;
172
173 for (scb = scb_base; scb; scb = scb->next)
174 if (scb->fd == fd)
175 return scb;
176
177 return NULL;
178}
179
00340e1b
PA
180/* Create a new serial for OPS. */
181
182static struct serial *
183new_serial (const struct serial_ops *ops)
184{
185 struct serial *scb;
186
187 scb = XCNEW (struct serial);
188
189 scb->ops = ops;
190
191 scb->bufp = scb->buf;
192 scb->error_fd = -1;
193 scb->refcnt = 1;
194
195 return scb;
196}
197
198static struct serial *serial_open_ops_1 (const struct serial_ops *ops,
199 const char *open_name);
200
c378eb4e 201/* Open up a device or a network socket, depending upon the syntax of NAME. */
c906108c 202
819cc324 203struct serial *
c2c6d25f 204serial_open (const char *name)
c906108c 205{
fcd488ca 206 const struct serial_ops *ops;
c2c6d25f 207 const char *open_name = name;
c906108c 208
ca1ca08b 209 if (startswith (name, "|"))
c2c6d25f
JM
210 {
211 ops = serial_interface_lookup ("pipe");
8b9e3a15
VP
212 /* Discard ``|'' and any space before the command itself. */
213 ++open_name;
f1735a53 214 open_name = skip_spaces (open_name);
c2c6d25f 215 }
2821caf1
JB
216 /* Check for a colon, suggesting an IP address/port pair.
217 Do this *after* checking for all the interesting prefixes. We
218 don't want to constrain the syntax of what can follow them. */
219 else if (strchr (name, ':'))
220 ops = serial_interface_lookup ("tcp");
c906108c
SS
221 else
222 ops = serial_interface_lookup ("hardwire");
223
224 if (!ops)
225 return NULL;
226
00340e1b
PA
227 return serial_open_ops_1 (ops, open_name);
228}
c906108c 229
00340e1b 230/* Open up a serial for OPS, passing OPEN_NAME to the open method. */
c906108c 231
00340e1b
PA
232static struct serial *
233serial_open_ops_1 (const struct serial_ops *ops, const char *open_name)
234{
235 struct serial *scb;
236
237 scb = new_serial (ops);
c906108c 238
766062f6 239 /* `...->open (...)' would get expanded by the open(2) syscall macro. */
652aaa24 240 if ((*scb->ops->open) (scb, open_name))
c906108c 241 {
b8c9b27d 242 xfree (scb);
c906108c
SS
243 return NULL;
244 }
245
5eb3b062 246 scb->next = scb_base;
5eb3b062 247 scb_base = scb;
c906108c
SS
248
249 if (serial_logfile != NULL)
250 {
d7e74731
PA
251 stdio_file_up file (new stdio_file ());
252
253 if (!file->open (serial_logfile, "w"))
c906108c 254 perror_with_name (serial_logfile);
d7e74731
PA
255
256 serial_logfp = file.release ();
c906108c
SS
257 }
258
259 return scb;
260}
261
00340e1b
PA
262/* See serial.h. */
263
264struct serial *
265serial_open_ops (const struct serial_ops *ops)
266{
267 return serial_open_ops_1 (ops, NULL);
268}
269
58f07bae
PA
270/* Open a new serial stream using a file handle, using serial
271 interface ops OPS. */
272
273static struct serial *
fcd488ca 274serial_fdopen_ops (const int fd, const struct serial_ops *ops)
c906108c 275{
819cc324 276 struct serial *scb;
c906108c 277
0ea3f30e 278 if (!ops)
58f07bae
PA
279 {
280 ops = serial_interface_lookup ("terminal");
281 if (!ops)
282 ops = serial_interface_lookup ("hardwire");
283 }
c906108c
SS
284
285 if (!ops)
286 return NULL;
287
00340e1b 288 scb = new_serial (ops);
c906108c 289
5eb3b062 290 scb->next = scb_base;
5eb3b062 291 scb_base = scb;
c906108c 292
58f07bae
PA
293 if ((ops->fdopen) != NULL)
294 (*ops->fdopen) (scb, fd);
295 else
296 scb->fd = fd;
297
c906108c
SS
298 return scb;
299}
300
58f07bae
PA
301struct serial *
302serial_fdopen (const int fd)
303{
304 return serial_fdopen_ops (fd, NULL);
305}
306
c2c6d25f 307static void
819cc324 308do_serial_close (struct serial *scb, int really_close)
c906108c 309{
819cc324 310 struct serial *tmp_scb;
c906108c 311
c906108c
SS
312 if (serial_logfp)
313 {
314 fputs_unfiltered ("\nEnd of log\n", serial_logfp);
315 serial_current_type = 0;
316
c378eb4e 317 /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
d7e74731 318 delete serial_logfp;
c906108c
SS
319 serial_logfp = NULL;
320 }
321
c378eb4e 322 /* ensure that the FD has been taken out of async mode. */
c2c6d25f
JM
323 if (scb->async_handler != NULL)
324 serial_async (scb, NULL, NULL);
325
c906108c
SS
326 if (really_close)
327 scb->ops->close (scb);
328
ddefb60f
PA
329 /* For serial_is_open. */
330 scb->bufp = NULL;
331
5eb3b062
PA
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
ddefb60f 344 serial_unref (scb);
c906108c
SS
345}
346
c2c6d25f 347void
819cc324 348serial_close (struct serial *scb)
c2c6d25f
JM
349{
350 do_serial_close (scb, 1);
351}
352
353void
819cc324 354serial_un_fdopen (struct serial *scb)
c2c6d25f
JM
355{
356 do_serial_close (scb, 0);
357}
358
ddefb60f
PA
359int
360serial_is_open (struct serial *scb)
361{
362 return scb->bufp != NULL;
363}
364
365void
366serial_ref (struct serial *scb)
367{
368 scb->refcnt++;
369}
370
371void
372serial_unref (struct serial *scb)
373{
374 --scb->refcnt;
375 if (scb->refcnt == 0)
376 xfree (scb);
377}
378
c2c6d25f 379int
819cc324 380serial_readchar (struct serial *scb, int timeout)
c2c6d25f
JM
381{
382 int ch;
383
2df3850c 384 /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
c378eb4e 385 code is finished. */
2cd58942 386 if (0 && serial_is_async_p (scb) && timeout < 0)
8e65ff28 387 internal_error (__FILE__, __LINE__,
e2e0b3e5 388 _("serial_readchar: blocking read in async mode"));
2df3850c 389
c2c6d25f
JM
390 ch = scb->ops->readchar (scb, timeout);
391 if (serial_logfp != NULL)
392 {
2acceee2 393 serial_logchar (serial_logfp, 'r', ch, timeout);
c2c6d25f
JM
394
395 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 396 in case we are getting ready to dump core or something. */
c2c6d25f
JM
397 gdb_flush (serial_logfp);
398 }
2cd58942 399 if (serial_debug_p (scb))
2acceee2
JM
400 {
401 fprintf_unfiltered (gdb_stdlog, "[");
402 serial_logchar (gdb_stdlog, 'r', ch, timeout);
403 fprintf_unfiltered (gdb_stdlog, "]");
404 gdb_flush (gdb_stdlog);
405 }
c2c6d25f
JM
406
407 return (ch);
408}
409
410int
c628b528 411serial_write (struct serial *scb, const void *buf, size_t count)
c2c6d25f
JM
412{
413 if (serial_logfp != NULL)
414 {
19ba03f4 415 const char *str = (const char *) buf;
c628b528 416 size_t c;
c2c6d25f 417
c628b528
PA
418 for (c = 0; c < count; c++)
419 serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
c2c6d25f
JM
420
421 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 422 in case we are getting ready to dump core or something. */
c2c6d25f
JM
423 gdb_flush (serial_logfp);
424 }
9214d371
DE
425 if (serial_debug_p (scb))
426 {
19ba03f4 427 const char *str = (const char *) buf;
c628b528 428 size_t c;
9214d371 429
c628b528 430 for (c = 0; c < count; c++)
9214d371
DE
431 {
432 fprintf_unfiltered (gdb_stdlog, "[");
0e58ee40 433 serial_logchar (gdb_stdlog, 'w', str[c] & 0xff, 0);
9214d371
DE
434 fprintf_unfiltered (gdb_stdlog, "]");
435 }
436 gdb_flush (gdb_stdlog);
437 }
c2c6d25f 438
c628b528 439 return (scb->ops->write (scb, buf, count));
c2c6d25f
JM
440}
441
442void
819cc324 443serial_printf (struct serial *desc, const char *format,...)
c2c6d25f
JM
444{
445 va_list args;
446 char *buf;
447 va_start (args, format);
448
e623b504 449 buf = xstrvprintf (format, args);
2cd58942 450 serial_write (desc, buf, strlen (buf));
c2c6d25f 451
b8c9b27d 452 xfree (buf);
c2c6d25f
JM
453 va_end (args);
454}
455
456int
819cc324 457serial_drain_output (struct serial *scb)
c2c6d25f
JM
458{
459 return scb->ops->drain_output (scb);
460}
461
462int
819cc324 463serial_flush_output (struct serial *scb)
c2c6d25f
JM
464{
465 return scb->ops->flush_output (scb);
466}
467
468int
819cc324 469serial_flush_input (struct serial *scb)
c2c6d25f
JM
470{
471 return scb->ops->flush_input (scb);
472}
473
474int
819cc324 475serial_send_break (struct serial *scb)
c2c6d25f
JM
476{
477 if (serial_logfp != NULL)
2acceee2 478 serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
c2c6d25f
JM
479
480 return (scb->ops->send_break (scb));
481}
482
483void
819cc324 484serial_raw (struct serial *scb)
c2c6d25f
JM
485{
486 scb->ops->go_raw (scb);
487}
488
489serial_ttystate
819cc324 490serial_get_tty_state (struct serial *scb)
c2c6d25f
JM
491{
492 return scb->ops->get_tty_state (scb);
493}
494
1e182ce8
UW
495serial_ttystate
496serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
497{
498 return scb->ops->copy_tty_state (scb, ttystate);
499}
500
c2c6d25f 501int
819cc324 502serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
c2c6d25f
JM
503{
504 return scb->ops->set_tty_state (scb, ttystate);
505}
506
507void
819cc324 508serial_print_tty_state (struct serial *scb,
c2c6d25f 509 serial_ttystate ttystate,
d9fcf2fb 510 struct ui_file *stream)
c2c6d25f
JM
511{
512 scb->ops->print_tty_state (scb, ttystate, stream);
513}
514
c2c6d25f 515int
819cc324 516serial_setbaudrate (struct serial *scb, int rate)
c2c6d25f
JM
517{
518 return scb->ops->setbaudrate (scb, rate);
519}
520
521int
819cc324 522serial_setstopbits (struct serial *scb, int num)
c2c6d25f
JM
523{
524 return scb->ops->setstopbits (scb, num);
525}
526
236af5e3
YG
527/* See serial.h. */
528
529int
530serial_setparity (struct serial *scb, int parity)
531{
532 return scb->ops->setparity (scb, parity);
533}
534
c2c6d25f 535int
819cc324 536serial_can_async_p (struct serial *scb)
c2c6d25f
JM
537{
538 return (scb->ops->async != NULL);
539}
540
541int
819cc324 542serial_is_async_p (struct serial *scb)
c2c6d25f
JM
543{
544 return (scb->ops->async != NULL) && (scb->async_handler != NULL);
545}
546
547void
819cc324 548serial_async (struct serial *scb,
c2c6d25f
JM
549 serial_event_ftype *handler,
550 void *context)
551{
05ce04a4 552 int changed = ((scb->async_handler == NULL) != (handler == NULL));
433759f7 553
c2c6d25f
JM
554 scb->async_handler = handler;
555 scb->async_context = context;
05ce04a4
VP
556 /* Only change mode if there is a need. */
557 if (changed)
558 scb->ops->async (scb, handler != NULL);
c2c6d25f
JM
559}
560
2acceee2 561void
819cc324 562serial_debug (struct serial *scb, int debug_p)
2acceee2
JM
563{
564 scb->debug_p = debug_p;
565}
566
567int
819cc324 568serial_debug_p (struct serial *scb)
2acceee2
JM
569{
570 return scb->debug_p || global_serial_debug_p;
571}
572
0ea3f30e
DJ
573#ifdef USE_WIN32API
574void
575serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
576{
577 if (scb->ops->wait_handle)
578 scb->ops->wait_handle (scb, read, except);
579 else
580 {
581 *read = (HANDLE) _get_osfhandle (scb->fd);
582 *except = NULL;
583 }
584}
c3e2b812
DJ
585
586void
587serial_done_wait_handle (struct serial *scb)
588{
589 if (scb->ops->done_wait_handle)
590 scb->ops->done_wait_handle (scb);
591}
0ea3f30e 592#endif
2acceee2 593
58f07bae
PA
594int
595serial_pipe (struct serial *scbs[2])
596{
fcd488ca 597 const struct serial_ops *ops;
58f07bae
PA
598 int fildes[2];
599
600 ops = serial_interface_lookup ("pipe");
601 if (!ops)
602 {
603 errno = ENOSYS;
604 return -1;
605 }
606
607 if (gdb_pipe (fildes) == -1)
608 return -1;
609
610 scbs[0] = serial_fdopen_ops (fildes[0], ops);
611 scbs[1] = serial_fdopen_ops (fildes[1], ops);
612 return 0;
613}
614
e3abfe1d
AC
615/* Serial set/show framework. */
616
617static struct cmd_list_element *serial_set_cmdlist;
618static struct cmd_list_element *serial_show_cmdlist;
619
620static void
981a3fb3 621serial_set_cmd (const char *args, int from_tty)
e3abfe1d 622{
3e43a32a
MS
623 printf_unfiltered ("\"set serial\" must be followed "
624 "by the name of a command.\n");
635c7e8a 625 help_list (serial_set_cmdlist, "set serial ", all_commands, gdb_stdout);
e3abfe1d
AC
626}
627
628static void
981a3fb3 629serial_show_cmd (const char *args, int from_tty)
e3abfe1d
AC
630{
631 cmd_show_list (serial_show_cmdlist, from_tty, "");
632}
633
0d12017b
JB
634/* Baud rate specified for talking to serial target systems. Default
635 is left as -1, so targets can choose their own defaults. */
636/* FIXME: This means that "show serial baud" and gr_files_info can
637 print -1 or (unsigned int)-1. This is a Bad User Interface. */
638
639int baud_rate = -1;
640
641static void
642serial_baud_show_cmd (struct ui_file *file, int from_tty,
643 struct cmd_list_element *c, const char *value)
644{
645 fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"),
646 value);
647}
e3abfe1d 648
236af5e3
YG
649/* Parity for serial port. */
650
651int serial_parity = GDBPARITY_NONE;
652
653static const char parity_none[] = "none";
654static const char parity_odd[] = "odd";
655static const char parity_even[] = "even";
656static const char *const parity_enums[] =
657 {parity_none, parity_odd, parity_even, NULL};
658static const char *parity = parity_none;
659
660/* Set serial_parity value. */
661
662static void
eb4c3f4a 663set_parity (const char *ignore_args, int from_tty, struct cmd_list_element *c)
236af5e3
YG
664{
665 if (parity == parity_odd)
666 serial_parity = GDBPARITY_ODD;
667 else if (parity == parity_even)
668 serial_parity = GDBPARITY_EVEN;
669 else
670 serial_parity = GDBPARITY_NONE;
671}
672
c906108c 673void
c2c6d25f 674_initialize_serial (void)
c906108c
SS
675{
676#if 0
1bedd215
AC
677 add_com ("connect", class_obscure, connect_command, _("\
678Connect the terminal directly up to the command monitor.\n\
679Use <CR>~. or <CR>~^D to break out."));
c906108c
SS
680#endif /* 0 */
681
1bedd215
AC
682 add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
683Set default serial/parallel port configuration."),
e3abfe1d
AC
684 &serial_set_cmdlist, "set serial ",
685 0/*allow-unknown*/,
686 &setlist);
687
1bedd215
AC
688 add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
689Show default serial/parallel port configuration."),
e3abfe1d
AC
690 &serial_show_cmdlist, "show serial ",
691 0/*allow-unknown*/,
692 &showlist);
693
0d12017b
JB
694 /* If target is open when baud changes, it doesn't take effect until
695 the next open (I think, not sure). */
696 add_setshow_zinteger_cmd ("baud", no_class, &baud_rate, _("\
697Set baud rate for remote serial I/O."), _("\
698Show baud rate for remote serial I/O."), _("\
699This value is used to set the speed of the serial port when debugging\n\
700using remote targets."),
701 NULL,
702 serial_baud_show_cmd,
703 &serial_set_cmdlist, &serial_show_cmdlist);
704
236af5e3
YG
705 add_setshow_enum_cmd ("parity", no_class, parity_enums,
706 &parity, _("\
707Set parity for remote serial I/O"), _("\
708Show parity for remote serial I/O"), NULL,
709 set_parity,
710 NULL, /* FIXME: i18n: */
711 &serial_set_cmdlist, &serial_show_cmdlist);
712
f397e303
AC
713 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
714Set filename for remote session recording."), _("\
715Show filename for remote session recording."), _("\
c906108c 716This file is used to record the remote session for future playback\n\
f397e303
AC
717by gdbserver."),
718 NULL,
719 NULL, /* FIXME: i18n: */
720 &setlist, &showlist);
c906108c 721
7ab04401
AC
722 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
723 &serial_logbase, _("\
724Set numerical base for remote session logging"), _("\
725Show numerical base for remote session logging"), NULL,
726 NULL,
727 NULL, /* FIXME: i18n: */
728 &setlist, &showlist);
2acceee2 729
ccce17b0
YQ
730 add_setshow_zuinteger_cmd ("serial", class_maintenance,
731 &global_serial_debug_p, _("\
85c07804
AC
732Set serial debugging."), _("\
733Show serial debugging."), _("\
734When non-zero, serial port debugging is enabled."),
ccce17b0
YQ
735 NULL,
736 NULL, /* FIXME: i18n: */
737 &setdebuglist, &showdebuglist);
c906108c 738}
This page took 1.976449 seconds and 4 git commands to generate.