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