Revert 'Remove unused struct serial::name field'
[deliverable/binutils-gdb.git] / gdb / serial.c
CommitLineData
c906108c 1/* Generic serial interface routines
4fcf66da 2
b811d2c2 3 Copyright (C) 1992-2020 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{
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, "|"))
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. */
431f22cc 213 else if (strchr (name, ':'))
2821caf1 214 ops = serial_interface_lookup ("tcp");
c906108c 215 else
c1168a2f
JD
216 {
217#ifndef USE_WIN32API
218 /* Check to see if name is a socket. If it is, then treat it
219 as such. Otherwise assume that it's a character device. */
220 struct stat sb;
431f22cc 221 if (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK)
c1168a2f
JD
222 ops = serial_interface_lookup ("local");
223 else
224#endif
225 ops = serial_interface_lookup ("hardwire");
226 }
c906108c
SS
227
228 if (!ops)
229 return NULL;
230
00340e1b
PA
231 return serial_open_ops_1 (ops, open_name);
232}
c906108c 233
00340e1b 234/* Open up a serial for OPS, passing OPEN_NAME to the open method. */
c906108c 235
00340e1b
PA
236static struct serial *
237serial_open_ops_1 (const struct serial_ops *ops, const char *open_name)
238{
239 struct serial *scb;
240
241 scb = new_serial (ops);
c906108c 242
766062f6 243 /* `...->open (...)' would get expanded by the open(2) syscall macro. */
652aaa24 244 if ((*scb->ops->open) (scb, open_name))
c906108c 245 {
b8c9b27d 246 xfree (scb);
c906108c
SS
247 return NULL;
248 }
249
4f837581 250 scb->name = open_name != NULL ? xstrdup (open_name) : NULL;
5eb3b062 251 scb->next = scb_base;
5eb3b062 252 scb_base = scb;
c906108c
SS
253
254 if (serial_logfile != NULL)
255 {
d7e74731
PA
256 stdio_file_up file (new stdio_file ());
257
258 if (!file->open (serial_logfile, "w"))
c906108c 259 perror_with_name (serial_logfile);
d7e74731
PA
260
261 serial_logfp = file.release ();
c906108c
SS
262 }
263
264 return scb;
265}
266
00340e1b
PA
267/* See serial.h. */
268
269struct serial *
270serial_open_ops (const struct serial_ops *ops)
271{
272 return serial_open_ops_1 (ops, NULL);
273}
274
58f07bae
PA
275/* Open a new serial stream using a file handle, using serial
276 interface ops OPS. */
277
278static struct serial *
fcd488ca 279serial_fdopen_ops (const int fd, const struct serial_ops *ops)
c906108c 280{
819cc324 281 struct serial *scb;
c906108c 282
0ea3f30e 283 if (!ops)
58f07bae
PA
284 {
285 ops = serial_interface_lookup ("terminal");
286 if (!ops)
287 ops = serial_interface_lookup ("hardwire");
288 }
c906108c
SS
289
290 if (!ops)
291 return NULL;
292
00340e1b 293 scb = new_serial (ops);
c906108c 294
4f837581 295 scb->name = NULL;
5eb3b062 296 scb->next = scb_base;
5eb3b062 297 scb_base = scb;
c906108c 298
58f07bae
PA
299 if ((ops->fdopen) != NULL)
300 (*ops->fdopen) (scb, fd);
301 else
302 scb->fd = fd;
303
c906108c
SS
304 return scb;
305}
306
58f07bae
PA
307struct serial *
308serial_fdopen (const int fd)
309{
310 return serial_fdopen_ops (fd, NULL);
311}
312
c2c6d25f 313static void
819cc324 314do_serial_close (struct serial *scb, int really_close)
c906108c 315{
819cc324 316 struct serial *tmp_scb;
c906108c 317
c906108c
SS
318 if (serial_logfp)
319 {
320 fputs_unfiltered ("\nEnd of log\n", serial_logfp);
321 serial_current_type = 0;
322
c378eb4e 323 /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
d7e74731 324 delete serial_logfp;
c906108c
SS
325 serial_logfp = NULL;
326 }
327
c378eb4e 328 /* ensure that the FD has been taken out of async mode. */
c2c6d25f
JM
329 if (scb->async_handler != NULL)
330 serial_async (scb, NULL, NULL);
331
c906108c
SS
332 if (really_close)
333 scb->ops->close (scb);
334
4f837581
PA
335 xfree (scb->name);
336
ddefb60f
PA
337 /* For serial_is_open. */
338 scb->bufp = NULL;
339
5eb3b062
PA
340 if (scb_base == scb)
341 scb_base = scb_base->next;
342 else
343 for (tmp_scb = scb_base; tmp_scb; tmp_scb = tmp_scb->next)
344 {
345 if (tmp_scb->next != scb)
346 continue;
347
348 tmp_scb->next = tmp_scb->next->next;
349 break;
350 }
351
ddefb60f 352 serial_unref (scb);
c906108c
SS
353}
354
c2c6d25f 355void
819cc324 356serial_close (struct serial *scb)
c2c6d25f
JM
357{
358 do_serial_close (scb, 1);
359}
360
361void
819cc324 362serial_un_fdopen (struct serial *scb)
c2c6d25f
JM
363{
364 do_serial_close (scb, 0);
365}
366
ddefb60f
PA
367int
368serial_is_open (struct serial *scb)
369{
370 return scb->bufp != NULL;
371}
372
373void
374serial_ref (struct serial *scb)
375{
376 scb->refcnt++;
377}
378
379void
380serial_unref (struct serial *scb)
381{
382 --scb->refcnt;
383 if (scb->refcnt == 0)
384 xfree (scb);
385}
386
c2c6d25f 387int
819cc324 388serial_readchar (struct serial *scb, int timeout)
c2c6d25f
JM
389{
390 int ch;
391
2df3850c 392 /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
c378eb4e 393 code is finished. */
2cd58942 394 if (0 && serial_is_async_p (scb) && timeout < 0)
8e65ff28 395 internal_error (__FILE__, __LINE__,
e2e0b3e5 396 _("serial_readchar: blocking read in async mode"));
2df3850c 397
c2c6d25f
JM
398 ch = scb->ops->readchar (scb, timeout);
399 if (serial_logfp != NULL)
400 {
2acceee2 401 serial_logchar (serial_logfp, 'r', ch, timeout);
c2c6d25f
JM
402
403 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 404 in case we are getting ready to dump core or something. */
c2c6d25f
JM
405 gdb_flush (serial_logfp);
406 }
2cd58942 407 if (serial_debug_p (scb))
2acceee2
JM
408 {
409 fprintf_unfiltered (gdb_stdlog, "[");
410 serial_logchar (gdb_stdlog, 'r', ch, timeout);
411 fprintf_unfiltered (gdb_stdlog, "]");
412 gdb_flush (gdb_stdlog);
413 }
c2c6d25f
JM
414
415 return (ch);
416}
417
418int
c628b528 419serial_write (struct serial *scb, const void *buf, size_t count)
c2c6d25f
JM
420{
421 if (serial_logfp != NULL)
422 {
19ba03f4 423 const char *str = (const char *) buf;
c628b528 424 size_t c;
c2c6d25f 425
c628b528
PA
426 for (c = 0; c < count; c++)
427 serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
c2c6d25f
JM
428
429 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 430 in case we are getting ready to dump core or something. */
c2c6d25f
JM
431 gdb_flush (serial_logfp);
432 }
9214d371
DE
433 if (serial_debug_p (scb))
434 {
19ba03f4 435 const char *str = (const char *) buf;
c628b528 436 size_t c;
9214d371 437
c628b528 438 for (c = 0; c < count; c++)
9214d371
DE
439 {
440 fprintf_unfiltered (gdb_stdlog, "[");
0e58ee40 441 serial_logchar (gdb_stdlog, 'w', str[c] & 0xff, 0);
9214d371
DE
442 fprintf_unfiltered (gdb_stdlog, "]");
443 }
444 gdb_flush (gdb_stdlog);
445 }
c2c6d25f 446
c628b528 447 return (scb->ops->write (scb, buf, count));
c2c6d25f
JM
448}
449
450void
467dc1e2 451serial_printf (struct serial *desc, const char *format, ...)
c2c6d25f
JM
452{
453 va_list args;
c2c6d25f
JM
454 va_start (args, format);
455
467dc1e2
SM
456 std::string buf = string_vprintf (format, args);
457 serial_write (desc, buf.c_str (), buf.length ());
c2c6d25f 458
c2c6d25f
JM
459 va_end (args);
460}
461
462int
819cc324 463serial_drain_output (struct serial *scb)
c2c6d25f
JM
464{
465 return scb->ops->drain_output (scb);
466}
467
468int
819cc324 469serial_flush_output (struct serial *scb)
c2c6d25f
JM
470{
471 return scb->ops->flush_output (scb);
472}
473
474int
819cc324 475serial_flush_input (struct serial *scb)
c2c6d25f
JM
476{
477 return scb->ops->flush_input (scb);
478}
479
480int
819cc324 481serial_send_break (struct serial *scb)
c2c6d25f
JM
482{
483 if (serial_logfp != NULL)
2acceee2 484 serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
c2c6d25f
JM
485
486 return (scb->ops->send_break (scb));
487}
488
489void
819cc324 490serial_raw (struct serial *scb)
c2c6d25f
JM
491{
492 scb->ops->go_raw (scb);
493}
494
495serial_ttystate
819cc324 496serial_get_tty_state (struct serial *scb)
c2c6d25f
JM
497{
498 return scb->ops->get_tty_state (scb);
499}
500
1e182ce8
UW
501serial_ttystate
502serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
503{
504 return scb->ops->copy_tty_state (scb, ttystate);
505}
506
c2c6d25f 507int
819cc324 508serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
c2c6d25f
JM
509{
510 return scb->ops->set_tty_state (scb, ttystate);
511}
512
513void
819cc324 514serial_print_tty_state (struct serial *scb,
c2c6d25f 515 serial_ttystate ttystate,
d9fcf2fb 516 struct ui_file *stream)
c2c6d25f
JM
517{
518 scb->ops->print_tty_state (scb, ttystate, stream);
519}
520
c2c6d25f 521int
819cc324 522serial_setbaudrate (struct serial *scb, int rate)
c2c6d25f
JM
523{
524 return scb->ops->setbaudrate (scb, rate);
525}
526
527int
819cc324 528serial_setstopbits (struct serial *scb, int num)
c2c6d25f
JM
529{
530 return scb->ops->setstopbits (scb, num);
531}
532
236af5e3
YG
533/* See serial.h. */
534
535int
536serial_setparity (struct serial *scb, int parity)
537{
538 return scb->ops->setparity (scb, parity);
539}
540
c2c6d25f 541int
819cc324 542serial_can_async_p (struct serial *scb)
c2c6d25f
JM
543{
544 return (scb->ops->async != NULL);
545}
546
547int
819cc324 548serial_is_async_p (struct serial *scb)
c2c6d25f
JM
549{
550 return (scb->ops->async != NULL) && (scb->async_handler != NULL);
551}
552
553void
819cc324 554serial_async (struct serial *scb,
c2c6d25f
JM
555 serial_event_ftype *handler,
556 void *context)
557{
05ce04a4 558 int changed = ((scb->async_handler == NULL) != (handler == NULL));
433759f7 559
c2c6d25f
JM
560 scb->async_handler = handler;
561 scb->async_context = context;
05ce04a4
VP
562 /* Only change mode if there is a need. */
563 if (changed)
564 scb->ops->async (scb, handler != NULL);
c2c6d25f
JM
565}
566
2acceee2 567void
819cc324 568serial_debug (struct serial *scb, int debug_p)
2acceee2
JM
569{
570 scb->debug_p = debug_p;
571}
572
573int
819cc324 574serial_debug_p (struct serial *scb)
2acceee2
JM
575{
576 return scb->debug_p || global_serial_debug_p;
577}
578
0ea3f30e
DJ
579#ifdef USE_WIN32API
580void
581serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
582{
583 if (scb->ops->wait_handle)
584 scb->ops->wait_handle (scb, read, except);
585 else
586 {
587 *read = (HANDLE) _get_osfhandle (scb->fd);
588 *except = NULL;
589 }
590}
c3e2b812
DJ
591
592void
593serial_done_wait_handle (struct serial *scb)
594{
595 if (scb->ops->done_wait_handle)
596 scb->ops->done_wait_handle (scb);
597}
0ea3f30e 598#endif
2acceee2 599
58f07bae
PA
600int
601serial_pipe (struct serial *scbs[2])
602{
fcd488ca 603 const struct serial_ops *ops;
58f07bae
PA
604 int fildes[2];
605
606 ops = serial_interface_lookup ("pipe");
607 if (!ops)
608 {
609 errno = ENOSYS;
610 return -1;
611 }
612
613 if (gdb_pipe (fildes) == -1)
614 return -1;
615
616 scbs[0] = serial_fdopen_ops (fildes[0], ops);
617 scbs[1] = serial_fdopen_ops (fildes[1], ops);
618 return 0;
619}
620
e3abfe1d
AC
621/* Serial set/show framework. */
622
623static struct cmd_list_element *serial_set_cmdlist;
624static struct cmd_list_element *serial_show_cmdlist;
625
626static void
981a3fb3 627serial_set_cmd (const char *args, int from_tty)
e3abfe1d 628{
3e43a32a
MS
629 printf_unfiltered ("\"set serial\" must be followed "
630 "by the name of a command.\n");
635c7e8a 631 help_list (serial_set_cmdlist, "set serial ", all_commands, gdb_stdout);
e3abfe1d
AC
632}
633
634static void
981a3fb3 635serial_show_cmd (const char *args, int from_tty)
e3abfe1d
AC
636{
637 cmd_show_list (serial_show_cmdlist, from_tty, "");
638}
639
0d12017b
JB
640/* Baud rate specified for talking to serial target systems. Default
641 is left as -1, so targets can choose their own defaults. */
642/* FIXME: This means that "show serial baud" and gr_files_info can
643 print -1 or (unsigned int)-1. This is a Bad User Interface. */
644
645int baud_rate = -1;
646
647static void
648serial_baud_show_cmd (struct ui_file *file, int from_tty,
649 struct cmd_list_element *c, const char *value)
650{
651 fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"),
652 value);
653}
e3abfe1d 654
236af5e3
YG
655/* Parity for serial port. */
656
657int serial_parity = GDBPARITY_NONE;
658
659static const char parity_none[] = "none";
660static const char parity_odd[] = "odd";
661static const char parity_even[] = "even";
662static const char *const parity_enums[] =
663 {parity_none, parity_odd, parity_even, NULL};
664static const char *parity = parity_none;
665
666/* Set serial_parity value. */
667
668static void
eb4c3f4a 669set_parity (const char *ignore_args, int from_tty, struct cmd_list_element *c)
236af5e3
YG
670{
671 if (parity == parity_odd)
672 serial_parity = GDBPARITY_ODD;
673 else if (parity == parity_even)
674 serial_parity = GDBPARITY_EVEN;
675 else
676 serial_parity = GDBPARITY_NONE;
677}
678
c906108c 679void
c2c6d25f 680_initialize_serial (void)
c906108c
SS
681{
682#if 0
1bedd215
AC
683 add_com ("connect", class_obscure, connect_command, _("\
684Connect the terminal directly up to the command monitor.\n\
685Use <CR>~. or <CR>~^D to break out."));
c906108c
SS
686#endif /* 0 */
687
1bedd215
AC
688 add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
689Set default serial/parallel port configuration."),
e3abfe1d
AC
690 &serial_set_cmdlist, "set serial ",
691 0/*allow-unknown*/,
692 &setlist);
693
1bedd215
AC
694 add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
695Show default serial/parallel port configuration."),
e3abfe1d
AC
696 &serial_show_cmdlist, "show serial ",
697 0/*allow-unknown*/,
698 &showlist);
699
0d12017b
JB
700 /* If target is open when baud changes, it doesn't take effect until
701 the next open (I think, not sure). */
702 add_setshow_zinteger_cmd ("baud", no_class, &baud_rate, _("\
703Set baud rate for remote serial I/O."), _("\
704Show baud rate for remote serial I/O."), _("\
705This value is used to set the speed of the serial port when debugging\n\
706using remote targets."),
707 NULL,
708 serial_baud_show_cmd,
709 &serial_set_cmdlist, &serial_show_cmdlist);
710
236af5e3
YG
711 add_setshow_enum_cmd ("parity", no_class, parity_enums,
712 &parity, _("\
590042fc
PW
713Set parity for remote serial I/O."), _("\
714Show parity for remote serial I/O."), NULL,
236af5e3
YG
715 set_parity,
716 NULL, /* FIXME: i18n: */
717 &serial_set_cmdlist, &serial_show_cmdlist);
718
f397e303
AC
719 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
720Set filename for remote session recording."), _("\
721Show filename for remote session recording."), _("\
c906108c 722This file is used to record the remote session for future playback\n\
f397e303
AC
723by gdbserver."),
724 NULL,
725 NULL, /* FIXME: i18n: */
726 &setlist, &showlist);
c906108c 727
7ab04401
AC
728 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
729 &serial_logbase, _("\
590042fc
PW
730Set numerical base for remote session logging."), _("\
731Show numerical base for remote session logging."), NULL,
7ab04401
AC
732 NULL,
733 NULL, /* FIXME: i18n: */
734 &setlist, &showlist);
2acceee2 735
ccce17b0
YQ
736 add_setshow_zuinteger_cmd ("serial", class_maintenance,
737 &global_serial_debug_p, _("\
85c07804
AC
738Set serial debugging."), _("\
739Show serial debugging."), _("\
740When non-zero, serial port debugging is enabled."),
ccce17b0
YQ
741 NULL,
742 NULL, /* FIXME: i18n: */
743 &setdebuglist, &showdebuglist);
c906108c 744}
This page took 2.174651 seconds and 4 git commands to generate.