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