]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/serial.c
Unify gdb puts functions
[thirdparty/binutils-gdb.git] / gdb / serial.c
CommitLineData
c906108c 1/* Generic serial interface routines
4fcf66da 2
4a94e368 3 Copyright (C) 1992-2022 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 40
e0700ba4 41static std::string serial_logfile;
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:
0426ad51 84 gdb_puts ("<Eof>", stream);
c906108c
SS
85 return;
86 case SERIAL_BREAK:
0426ad51 87 gdb_puts ("<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 '\\':
0426ad51 98 gdb_puts ("\\\\", stream);
c5aa993b
JM
99 break;
100 case '\b':
0426ad51 101 gdb_puts ("\\b", stream);
c5aa993b
JM
102 break;
103 case '\f':
0426ad51 104 gdb_puts ("\\f", stream);
c5aa993b
JM
105 break;
106 case '\n':
0426ad51 107 gdb_puts ("\\n", stream);
c5aa993b
JM
108 break;
109 case '\r':
0426ad51 110 gdb_puts ("\\r", stream);
c5aa993b
JM
111 break;
112 case '\t':
0426ad51 113 gdb_puts ("\\t", stream);
c5aa993b
JM
114 break;
115 case '\v':
0426ad51 116 gdb_puts ("\\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
0426ad51
TT
134 gdb_puts ("\nc ", serial_logfp);
135 gdb_puts (cmd, serial_logfp);
c906108c
SS
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{
71b73764 146 for (const 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, "|"))
cced7cac 204 ops = serial_interface_lookup ("pipe");
2821caf1
JB
205 /* Check for a colon, suggesting an IP address/port pair.
206 Do this *after* checking for all the interesting prefixes. We
207 don't want to constrain the syntax of what can follow them. */
431f22cc 208 else if (strchr (name, ':'))
2821caf1 209 ops = serial_interface_lookup ("tcp");
c906108c 210 else
c1168a2f
JD
211 {
212#ifndef USE_WIN32API
213 /* Check to see if name is a socket. If it is, then treat it
dda83cd7 214 as such. Otherwise assume that it's a character device. */
c1168a2f 215 struct stat sb;
431f22cc 216 if (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK)
c1168a2f
JD
217 ops = serial_interface_lookup ("local");
218 else
219#endif
220 ops = serial_interface_lookup ("hardwire");
221 }
c906108c
SS
222
223 if (!ops)
224 return NULL;
225
00340e1b
PA
226 return serial_open_ops_1 (ops, open_name);
227}
c906108c 228
00340e1b 229/* Open up a serial for OPS, passing OPEN_NAME to the open method. */
c906108c 230
00340e1b
PA
231static struct serial *
232serial_open_ops_1 (const struct serial_ops *ops, const char *open_name)
233{
234 struct serial *scb;
235
236 scb = new_serial (ops);
c906108c 237
766062f6 238 /* `...->open (...)' would get expanded by the open(2) syscall macro. */
652aaa24 239 if ((*scb->ops->open) (scb, open_name))
c906108c 240 {
b8c9b27d 241 xfree (scb);
c906108c
SS
242 return NULL;
243 }
244
4f837581 245 scb->name = open_name != NULL ? xstrdup (open_name) : NULL;
5eb3b062 246 scb->next = scb_base;
5eb3b062 247 scb_base = scb;
c906108c 248
e0700ba4 249 if (!serial_logfile.empty ())
c906108c 250 {
d7e74731
PA
251 stdio_file_up file (new stdio_file ());
252
e0700ba4
SM
253 if (!file->open (serial_logfile.c_str (), "w"))
254 perror_with_name (serial_logfile.c_str ());
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)
24b21115 282 ops = serial_interface_lookup ("hardwire");
58f07bae 283 }
c906108c
SS
284
285 if (!ops)
286 return NULL;
287
00340e1b 288 scb = new_serial (ops);
c906108c 289
4f837581 290 scb->name = NULL;
5eb3b062 291 scb->next = scb_base;
5eb3b062 292 scb_base = scb;
c906108c 293
58f07bae
PA
294 if ((ops->fdopen) != NULL)
295 (*ops->fdopen) (scb, fd);
296 else
297 scb->fd = fd;
298
c906108c
SS
299 return scb;
300}
301
58f07bae
PA
302struct serial *
303serial_fdopen (const int fd)
304{
305 return serial_fdopen_ops (fd, NULL);
306}
307
c2c6d25f 308static void
819cc324 309do_serial_close (struct serial *scb, int really_close)
c906108c 310{
819cc324 311 struct serial *tmp_scb;
c906108c 312
c906108c
SS
313 if (serial_logfp)
314 {
0426ad51 315 gdb_puts ("\nEnd of log\n", serial_logfp);
c906108c
SS
316 serial_current_type = 0;
317
c378eb4e 318 /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
d7e74731 319 delete serial_logfp;
c906108c
SS
320 serial_logfp = NULL;
321 }
322
c378eb4e 323 /* ensure that the FD has been taken out of async mode. */
c2c6d25f
JM
324 if (scb->async_handler != NULL)
325 serial_async (scb, NULL, NULL);
326
c906108c
SS
327 if (really_close)
328 scb->ops->close (scb);
329
4f837581
PA
330 xfree (scb->name);
331
ddefb60f
PA
332 /* For serial_is_open. */
333 scb->bufp = NULL;
334
5eb3b062
PA
335 if (scb_base == scb)
336 scb_base = scb_base->next;
337 else
338 for (tmp_scb = scb_base; tmp_scb; tmp_scb = tmp_scb->next)
339 {
340 if (tmp_scb->next != scb)
341 continue;
342
343 tmp_scb->next = tmp_scb->next->next;
344 break;
345 }
346
ddefb60f 347 serial_unref (scb);
c906108c
SS
348}
349
c2c6d25f 350void
819cc324 351serial_close (struct serial *scb)
c2c6d25f
JM
352{
353 do_serial_close (scb, 1);
354}
355
356void
819cc324 357serial_un_fdopen (struct serial *scb)
c2c6d25f
JM
358{
359 do_serial_close (scb, 0);
360}
361
ddefb60f
PA
362int
363serial_is_open (struct serial *scb)
364{
365 return scb->bufp != NULL;
366}
367
368void
369serial_ref (struct serial *scb)
370{
371 scb->refcnt++;
372}
373
374void
375serial_unref (struct serial *scb)
376{
377 --scb->refcnt;
378 if (scb->refcnt == 0)
379 xfree (scb);
380}
381
c2c6d25f 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,
dda83cd7 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
c628b528 414serial_write (struct serial *scb, const void *buf, size_t count)
c2c6d25f
JM
415{
416 if (serial_logfp != NULL)
417 {
19ba03f4 418 const char *str = (const char *) buf;
c628b528 419 size_t c;
c2c6d25f 420
c628b528
PA
421 for (c = 0; c < count; c++)
422 serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
c2c6d25f
JM
423
424 /* Make sure that the log file is as up-to-date as possible,
dda83cd7 425 in case we are getting ready to dump core or something. */
c2c6d25f
JM
426 gdb_flush (serial_logfp);
427 }
9214d371
DE
428 if (serial_debug_p (scb))
429 {
19ba03f4 430 const char *str = (const char *) buf;
c628b528 431 size_t c;
9214d371 432
c628b528 433 for (c = 0; c < count; c++)
9214d371
DE
434 {
435 fprintf_unfiltered (gdb_stdlog, "[");
0e58ee40 436 serial_logchar (gdb_stdlog, 'w', str[c] & 0xff, 0);
9214d371
DE
437 fprintf_unfiltered (gdb_stdlog, "]");
438 }
439 gdb_flush (gdb_stdlog);
440 }
c2c6d25f 441
c628b528 442 return (scb->ops->write (scb, buf, count));
c2c6d25f
JM
443}
444
445void
467dc1e2 446serial_printf (struct serial *desc, const char *format, ...)
c2c6d25f
JM
447{
448 va_list args;
c2c6d25f
JM
449 va_start (args, format);
450
467dc1e2
SM
451 std::string buf = string_vprintf (format, args);
452 serial_write (desc, buf.c_str (), buf.length ());
c2c6d25f 453
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
c2c6d25f 516int
819cc324 517serial_setbaudrate (struct serial *scb, int rate)
c2c6d25f
JM
518{
519 return scb->ops->setbaudrate (scb, rate);
520}
521
522int
819cc324 523serial_setstopbits (struct serial *scb, int num)
c2c6d25f
JM
524{
525 return scb->ops->setstopbits (scb, num);
526}
527
236af5e3
YG
528/* See serial.h. */
529
530int
531serial_setparity (struct serial *scb, int parity)
532{
533 return scb->ops->setparity (scb, parity);
534}
535
c2c6d25f 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
2acceee2 562void
819cc324 563serial_debug (struct serial *scb, int debug_p)
2acceee2
JM
564{
565 scb->debug_p = debug_p;
566}
567
568int
819cc324 569serial_debug_p (struct serial *scb)
2acceee2
JM
570{
571 return scb->debug_p || global_serial_debug_p;
572}
573
0ea3f30e
DJ
574#ifdef USE_WIN32API
575void
576serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
577{
578 if (scb->ops->wait_handle)
579 scb->ops->wait_handle (scb, read, except);
580 else
581 {
582 *read = (HANDLE) _get_osfhandle (scb->fd);
583 *except = NULL;
584 }
585}
c3e2b812
DJ
586
587void
588serial_done_wait_handle (struct serial *scb)
589{
590 if (scb->ops->done_wait_handle)
591 scb->ops->done_wait_handle (scb);
592}
0ea3f30e 593#endif
2acceee2 594
58f07bae
PA
595int
596serial_pipe (struct serial *scbs[2])
597{
fcd488ca 598 const struct serial_ops *ops;
58f07bae
PA
599 int fildes[2];
600
601 ops = serial_interface_lookup ("pipe");
602 if (!ops)
603 {
604 errno = ENOSYS;
605 return -1;
606 }
607
608 if (gdb_pipe (fildes) == -1)
609 return -1;
610
611 scbs[0] = serial_fdopen_ops (fildes[0], ops);
612 scbs[1] = serial_fdopen_ops (fildes[1], ops);
613 return 0;
614}
615
e3abfe1d
AC
616/* Serial set/show framework. */
617
618static struct cmd_list_element *serial_set_cmdlist;
619static struct cmd_list_element *serial_show_cmdlist;
620
16e9019e 621/* See serial.h. */
0d12017b
JB
622
623int baud_rate = -1;
624
625static void
626serial_baud_show_cmd (struct ui_file *file, int from_tty,
627 struct cmd_list_element *c, const char *value)
628{
629 fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"),
630 value);
631}
e3abfe1d 632
16e9019e 633/* See serial.h. */
236af5e3
YG
634
635int serial_parity = GDBPARITY_NONE;
636
637static const char parity_none[] = "none";
638static const char parity_odd[] = "odd";
639static const char parity_even[] = "even";
640static const char *const parity_enums[] =
641 {parity_none, parity_odd, parity_even, NULL};
642static const char *parity = parity_none;
643
644/* Set serial_parity value. */
645
646static void
eb4c3f4a 647set_parity (const char *ignore_args, int from_tty, struct cmd_list_element *c)
236af5e3
YG
648{
649 if (parity == parity_odd)
650 serial_parity = GDBPARITY_ODD;
651 else if (parity == parity_even)
652 serial_parity = GDBPARITY_EVEN;
653 else
654 serial_parity = GDBPARITY_NONE;
655}
656
6c265988 657void _initialize_serial ();
c906108c 658void
6c265988 659_initialize_serial ()
c906108c
SS
660{
661#if 0
1bedd215
AC
662 add_com ("connect", class_obscure, connect_command, _("\
663Connect the terminal directly up to the command monitor.\n\
664Use <CR>~. or <CR>~^D to break out."));
c906108c
SS
665#endif /* 0 */
666
f54bdb6d
SM
667 add_setshow_prefix_cmd ("serial", class_maintenance,
668 _("Set default serial/parallel port configuration."),
669 _("Show default serial/parallel port configuration."),
670 &serial_set_cmdlist, &serial_show_cmdlist,
671 &setlist, &showlist);
e3abfe1d 672
0d12017b
JB
673 /* If target is open when baud changes, it doesn't take effect until
674 the next open (I think, not sure). */
675 add_setshow_zinteger_cmd ("baud", no_class, &baud_rate, _("\
676Set baud rate for remote serial I/O."), _("\
677Show baud rate for remote serial I/O."), _("\
678This value is used to set the speed of the serial port when debugging\n\
679using remote targets."),
680 NULL,
681 serial_baud_show_cmd,
682 &serial_set_cmdlist, &serial_show_cmdlist);
683
236af5e3 684 add_setshow_enum_cmd ("parity", no_class, parity_enums,
dda83cd7 685 &parity, _("\
590042fc
PW
686Set parity for remote serial I/O."), _("\
687Show parity for remote serial I/O."), NULL,
dda83cd7
SM
688 set_parity,
689 NULL, /* FIXME: i18n: */
690 &serial_set_cmdlist, &serial_show_cmdlist);
236af5e3 691
f397e303
AC
692 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
693Set filename for remote session recording."), _("\
694Show filename for remote session recording."), _("\
c906108c 695This file is used to record the remote session for future playback\n\
f397e303
AC
696by gdbserver."),
697 NULL,
698 NULL, /* FIXME: i18n: */
699 &setlist, &showlist);
c906108c 700
7ab04401
AC
701 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
702 &serial_logbase, _("\
590042fc
PW
703Set numerical base for remote session logging."), _("\
704Show numerical base for remote session logging."), NULL,
7ab04401
AC
705 NULL,
706 NULL, /* FIXME: i18n: */
707 &setlist, &showlist);
2acceee2 708
ccce17b0
YQ
709 add_setshow_zuinteger_cmd ("serial", class_maintenance,
710 &global_serial_debug_p, _("\
85c07804
AC
711Set serial debugging."), _("\
712Show serial debugging."), _("\
713When non-zero, serial port debugging is enabled."),
ccce17b0
YQ
714 NULL,
715 NULL, /* FIXME: i18n: */
716 &setdebuglist, &showdebuglist);
c906108c 717}