* mips-linux-tdep.c: Adjust formatting throughout.
[deliverable/binutils-gdb.git] / gdb / serial.c
CommitLineData
c906108c 1/* Generic serial interface routines
4fcf66da 2
28e7fd62 3 Copyright (C) 1992-2013 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"
23#include "gdb_string.h"
24#include "gdbcmd.h"
529480d0 25#include "cli/cli-utils.h"
c906108c 26
c2c6d25f 27extern void _initialize_serial (void);
392a587b 28
c378eb4e 29/* Is serial being debugged? */
2acceee2 30
ccce17b0 31static unsigned int global_serial_debug_p;
2acceee2 32
c378eb4e 33/* Linked list of serial I/O handlers. */
c906108c
SS
34
35static struct serial_ops *serial_ops_list = NULL;
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
58f07bae 47static 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
c2c6d25f 130serial_log_command (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
c906108c 146static struct serial_ops *
58f07bae 147serial_interface_lookup (const char *name)
c906108c
SS
148{
149 struct serial_ops *ops;
150
151 for (ops = serial_ops_list; ops; ops = ops->next)
152 if (strcmp (name, ops->name) == 0)
153 return ops;
154
155 return NULL;
156}
157
158void
c2c6d25f 159serial_add_interface (struct serial_ops *optable)
c906108c
SS
160{
161 optable->next = serial_ops_list;
162 serial_ops_list = optable;
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
c378eb4e 180/* Open up a device or a network socket, depending upon the syntax of NAME. */
c906108c 181
819cc324 182struct serial *
c2c6d25f 183serial_open (const char *name)
c906108c 184{
819cc324 185 struct serial *scb;
c906108c 186 struct serial_ops *ops;
c2c6d25f 187 const char *open_name = name;
c906108c 188
50a9e2f1 189 if (strcmp (name, "pc") == 0)
c906108c 190 ops = serial_interface_lookup ("pc");
c906108c
SS
191 else if (strncmp (name, "lpt", 3) == 0)
192 ops = serial_interface_lookup ("parallel");
43e526b9 193 else if (strncmp (name, "|", 1) == 0)
c2c6d25f
JM
194 {
195 ops = serial_interface_lookup ("pipe");
8b9e3a15
VP
196 /* Discard ``|'' and any space before the command itself. */
197 ++open_name;
529480d0 198 open_name = skip_spaces_const (open_name);
c2c6d25f 199 }
2821caf1
JB
200 /* Check for a colon, suggesting an IP address/port pair.
201 Do this *after* checking for all the interesting prefixes. We
202 don't want to constrain the syntax of what can follow them. */
203 else if (strchr (name, ':'))
204 ops = serial_interface_lookup ("tcp");
c906108c
SS
205 else
206 ops = serial_interface_lookup ("hardwire");
207
208 if (!ops)
209 return NULL;
210
65e2f740 211 scb = XMALLOC (struct serial);
c906108c
SS
212
213 scb->ops = ops;
214
215 scb->bufcnt = 0;
216 scb->bufp = scb->buf;
65cc4390 217 scb->error_fd = -1;
ddefb60f 218 scb->refcnt = 1;
c906108c 219
766062f6 220 /* `...->open (...)' would get expanded by the open(2) syscall macro. */
652aaa24 221 if ((*scb->ops->open) (scb, open_name))
c906108c 222 {
b8c9b27d 223 xfree (scb);
c906108c
SS
224 return NULL;
225 }
226
4fcf66da 227 scb->name = xstrdup (name);
5eb3b062 228 scb->next = scb_base;
2acceee2
JM
229 scb->debug_p = 0;
230 scb->async_state = 0;
c2c6d25f
JM
231 scb->async_handler = NULL;
232 scb->async_context = NULL;
5eb3b062 233 scb_base = scb;
c906108c
SS
234
235 if (serial_logfile != NULL)
236 {
237 serial_logfp = gdb_fopen (serial_logfile, "w");
238 if (serial_logfp == NULL)
239 perror_with_name (serial_logfile);
240 }
241
242 return scb;
243}
244
58f07bae
PA
245/* Open a new serial stream using a file handle, using serial
246 interface ops OPS. */
247
248static struct serial *
249serial_fdopen_ops (const int fd, struct serial_ops *ops)
c906108c 250{
819cc324 251 struct serial *scb;
c906108c 252
0ea3f30e 253 if (!ops)
58f07bae
PA
254 {
255 ops = serial_interface_lookup ("terminal");
256 if (!ops)
257 ops = serial_interface_lookup ("hardwire");
258 }
c906108c
SS
259
260 if (!ops)
261 return NULL;
262
0ea3f30e 263 scb = XCALLOC (1, struct serial);
c906108c
SS
264
265 scb->ops = ops;
266
267 scb->bufcnt = 0;
268 scb->bufp = scb->buf;
58f07bae 269 scb->error_fd = -1;
ddefb60f 270 scb->refcnt = 1;
c906108c
SS
271
272 scb->name = NULL;
5eb3b062 273 scb->next = scb_base;
2acceee2
JM
274 scb->debug_p = 0;
275 scb->async_state = 0;
c2c6d25f
JM
276 scb->async_handler = NULL;
277 scb->async_context = NULL;
5eb3b062 278 scb_base = scb;
c906108c 279
58f07bae
PA
280 if ((ops->fdopen) != NULL)
281 (*ops->fdopen) (scb, fd);
282 else
283 scb->fd = fd;
284
c906108c
SS
285 return scb;
286}
287
58f07bae
PA
288struct serial *
289serial_fdopen (const int fd)
290{
291 return serial_fdopen_ops (fd, NULL);
292}
293
c2c6d25f 294static void
819cc324 295do_serial_close (struct serial *scb, int really_close)
c906108c 296{
819cc324 297 struct serial *tmp_scb;
c906108c 298
c906108c
SS
299 if (serial_logfp)
300 {
301 fputs_unfiltered ("\nEnd of log\n", serial_logfp);
302 serial_current_type = 0;
303
c378eb4e 304 /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
d9fcf2fb 305 ui_file_delete (serial_logfp);
c906108c
SS
306 serial_logfp = NULL;
307 }
308
c378eb4e 309 /* ensure that the FD has been taken out of async mode. */
c2c6d25f
JM
310 if (scb->async_handler != NULL)
311 serial_async (scb, NULL, NULL);
312
c906108c
SS
313 if (really_close)
314 scb->ops->close (scb);
315
316 if (scb->name)
b8c9b27d 317 xfree (scb->name);
c906108c 318
ddefb60f
PA
319 /* For serial_is_open. */
320 scb->bufp = NULL;
321
5eb3b062
PA
322 if (scb_base == scb)
323 scb_base = scb_base->next;
324 else
325 for (tmp_scb = scb_base; tmp_scb; tmp_scb = tmp_scb->next)
326 {
327 if (tmp_scb->next != scb)
328 continue;
329
330 tmp_scb->next = tmp_scb->next->next;
331 break;
332 }
333
ddefb60f 334 serial_unref (scb);
c906108c
SS
335}
336
c2c6d25f 337void
819cc324 338serial_close (struct serial *scb)
c2c6d25f
JM
339{
340 do_serial_close (scb, 1);
341}
342
343void
819cc324 344serial_un_fdopen (struct serial *scb)
c2c6d25f
JM
345{
346 do_serial_close (scb, 0);
347}
348
ddefb60f
PA
349int
350serial_is_open (struct serial *scb)
351{
352 return scb->bufp != NULL;
353}
354
355void
356serial_ref (struct serial *scb)
357{
358 scb->refcnt++;
359}
360
361void
362serial_unref (struct serial *scb)
363{
364 --scb->refcnt;
365 if (scb->refcnt == 0)
366 xfree (scb);
367}
368
c2c6d25f 369int
819cc324 370serial_readchar (struct serial *scb, int timeout)
c2c6d25f
JM
371{
372 int ch;
373
2df3850c 374 /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
c378eb4e 375 code is finished. */
2cd58942 376 if (0 && serial_is_async_p (scb) && timeout < 0)
8e65ff28 377 internal_error (__FILE__, __LINE__,
e2e0b3e5 378 _("serial_readchar: blocking read in async mode"));
2df3850c 379
c2c6d25f
JM
380 ch = scb->ops->readchar (scb, timeout);
381 if (serial_logfp != NULL)
382 {
2acceee2 383 serial_logchar (serial_logfp, 'r', ch, timeout);
c2c6d25f
JM
384
385 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 386 in case we are getting ready to dump core or something. */
c2c6d25f
JM
387 gdb_flush (serial_logfp);
388 }
2cd58942 389 if (serial_debug_p (scb))
2acceee2
JM
390 {
391 fprintf_unfiltered (gdb_stdlog, "[");
392 serial_logchar (gdb_stdlog, 'r', ch, timeout);
393 fprintf_unfiltered (gdb_stdlog, "]");
394 gdb_flush (gdb_stdlog);
395 }
c2c6d25f
JM
396
397 return (ch);
398}
399
400int
c628b528 401serial_write (struct serial *scb, const void *buf, size_t count)
c2c6d25f
JM
402{
403 if (serial_logfp != NULL)
404 {
c628b528
PA
405 const char *str = buf;
406 size_t c;
c2c6d25f 407
c628b528
PA
408 for (c = 0; c < count; c++)
409 serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
c2c6d25f
JM
410
411 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 412 in case we are getting ready to dump core or something. */
c2c6d25f
JM
413 gdb_flush (serial_logfp);
414 }
9214d371
DE
415 if (serial_debug_p (scb))
416 {
c628b528
PA
417 const char *str = buf;
418 size_t c;
9214d371 419
c628b528 420 for (c = 0; c < count; c++)
9214d371
DE
421 {
422 fprintf_unfiltered (gdb_stdlog, "[");
423 serial_logchar (gdb_stdlog, 'w', str[count] & 0xff, 0);
424 fprintf_unfiltered (gdb_stdlog, "]");
425 }
426 gdb_flush (gdb_stdlog);
427 }
c2c6d25f 428
c628b528 429 return (scb->ops->write (scb, buf, count));
c2c6d25f
JM
430}
431
432void
819cc324 433serial_printf (struct serial *desc, const char *format,...)
c2c6d25f
JM
434{
435 va_list args;
436 char *buf;
437 va_start (args, format);
438
e623b504 439 buf = xstrvprintf (format, args);
2cd58942 440 serial_write (desc, buf, strlen (buf));
c2c6d25f 441
b8c9b27d 442 xfree (buf);
c2c6d25f
JM
443 va_end (args);
444}
445
446int
819cc324 447serial_drain_output (struct serial *scb)
c2c6d25f
JM
448{
449 return scb->ops->drain_output (scb);
450}
451
452int
819cc324 453serial_flush_output (struct serial *scb)
c2c6d25f
JM
454{
455 return scb->ops->flush_output (scb);
456}
457
458int
819cc324 459serial_flush_input (struct serial *scb)
c2c6d25f
JM
460{
461 return scb->ops->flush_input (scb);
462}
463
464int
819cc324 465serial_send_break (struct serial *scb)
c2c6d25f
JM
466{
467 if (serial_logfp != NULL)
2acceee2 468 serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
c2c6d25f
JM
469
470 return (scb->ops->send_break (scb));
471}
472
473void
819cc324 474serial_raw (struct serial *scb)
c2c6d25f
JM
475{
476 scb->ops->go_raw (scb);
477}
478
479serial_ttystate
819cc324 480serial_get_tty_state (struct serial *scb)
c2c6d25f
JM
481{
482 return scb->ops->get_tty_state (scb);
483}
484
1e182ce8
UW
485serial_ttystate
486serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
487{
488 return scb->ops->copy_tty_state (scb, ttystate);
489}
490
c2c6d25f 491int
819cc324 492serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
c2c6d25f
JM
493{
494 return scb->ops->set_tty_state (scb, ttystate);
495}
496
497void
819cc324 498serial_print_tty_state (struct serial *scb,
c2c6d25f 499 serial_ttystate ttystate,
d9fcf2fb 500 struct ui_file *stream)
c2c6d25f
JM
501{
502 scb->ops->print_tty_state (scb, ttystate, stream);
503}
504
505int
819cc324 506serial_noflush_set_tty_state (struct serial *scb,
c2c6d25f
JM
507 serial_ttystate new_ttystate,
508 serial_ttystate old_ttystate)
509{
510 return scb->ops->noflush_set_tty_state (scb, new_ttystate, old_ttystate);
511}
512
513int
819cc324 514serial_setbaudrate (struct serial *scb, int rate)
c2c6d25f
JM
515{
516 return scb->ops->setbaudrate (scb, rate);
517}
518
519int
819cc324 520serial_setstopbits (struct serial *scb, int num)
c2c6d25f
JM
521{
522 return scb->ops->setstopbits (scb, num);
523}
524
525int
819cc324 526serial_can_async_p (struct serial *scb)
c2c6d25f
JM
527{
528 return (scb->ops->async != NULL);
529}
530
531int
819cc324 532serial_is_async_p (struct serial *scb)
c2c6d25f
JM
533{
534 return (scb->ops->async != NULL) && (scb->async_handler != NULL);
535}
536
537void
819cc324 538serial_async (struct serial *scb,
c2c6d25f
JM
539 serial_event_ftype *handler,
540 void *context)
541{
05ce04a4 542 int changed = ((scb->async_handler == NULL) != (handler == NULL));
433759f7 543
c2c6d25f
JM
544 scb->async_handler = handler;
545 scb->async_context = context;
05ce04a4
VP
546 /* Only change mode if there is a need. */
547 if (changed)
548 scb->ops->async (scb, handler != NULL);
c2c6d25f
JM
549}
550
2acceee2 551void
819cc324 552serial_debug (struct serial *scb, int debug_p)
2acceee2
JM
553{
554 scb->debug_p = debug_p;
555}
556
557int
819cc324 558serial_debug_p (struct serial *scb)
2acceee2
JM
559{
560 return scb->debug_p || global_serial_debug_p;
561}
562
0ea3f30e
DJ
563#ifdef USE_WIN32API
564void
565serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
566{
567 if (scb->ops->wait_handle)
568 scb->ops->wait_handle (scb, read, except);
569 else
570 {
571 *read = (HANDLE) _get_osfhandle (scb->fd);
572 *except = NULL;
573 }
574}
c3e2b812
DJ
575
576void
577serial_done_wait_handle (struct serial *scb)
578{
579 if (scb->ops->done_wait_handle)
580 scb->ops->done_wait_handle (scb);
581}
0ea3f30e 582#endif
2acceee2 583
58f07bae
PA
584int
585serial_pipe (struct serial *scbs[2])
586{
587 struct serial_ops *ops;
588 int fildes[2];
589
590 ops = serial_interface_lookup ("pipe");
591 if (!ops)
592 {
593 errno = ENOSYS;
594 return -1;
595 }
596
597 if (gdb_pipe (fildes) == -1)
598 return -1;
599
600 scbs[0] = serial_fdopen_ops (fildes[0], ops);
601 scbs[1] = serial_fdopen_ops (fildes[1], ops);
602 return 0;
603}
604
e3abfe1d
AC
605/* Serial set/show framework. */
606
607static struct cmd_list_element *serial_set_cmdlist;
608static struct cmd_list_element *serial_show_cmdlist;
609
610static void
611serial_set_cmd (char *args, int from_tty)
612{
3e43a32a
MS
613 printf_unfiltered ("\"set serial\" must be followed "
614 "by the name of a command.\n");
e3abfe1d
AC
615 help_list (serial_set_cmdlist, "set serial ", -1, gdb_stdout);
616}
617
618static void
619serial_show_cmd (char *args, int from_tty)
620{
621 cmd_show_list (serial_show_cmdlist, from_tty, "");
622}
623
624
c906108c 625void
c2c6d25f 626_initialize_serial (void)
c906108c
SS
627{
628#if 0
1bedd215
AC
629 add_com ("connect", class_obscure, connect_command, _("\
630Connect the terminal directly up to the command monitor.\n\
631Use <CR>~. or <CR>~^D to break out."));
c906108c
SS
632#endif /* 0 */
633
1bedd215
AC
634 add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
635Set default serial/parallel port configuration."),
e3abfe1d
AC
636 &serial_set_cmdlist, "set serial ",
637 0/*allow-unknown*/,
638 &setlist);
639
1bedd215
AC
640 add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
641Show default serial/parallel port configuration."),
e3abfe1d
AC
642 &serial_show_cmdlist, "show serial ",
643 0/*allow-unknown*/,
644 &showlist);
645
f397e303
AC
646 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
647Set filename for remote session recording."), _("\
648Show filename for remote session recording."), _("\
c906108c 649This file is used to record the remote session for future playback\n\
f397e303
AC
650by gdbserver."),
651 NULL,
652 NULL, /* FIXME: i18n: */
653 &setlist, &showlist);
c906108c 654
7ab04401
AC
655 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
656 &serial_logbase, _("\
657Set numerical base for remote session logging"), _("\
658Show numerical base for remote session logging"), NULL,
659 NULL,
660 NULL, /* FIXME: i18n: */
661 &setlist, &showlist);
2acceee2 662
ccce17b0
YQ
663 add_setshow_zuinteger_cmd ("serial", class_maintenance,
664 &global_serial_debug_p, _("\
85c07804
AC
665Set serial debugging."), _("\
666Show serial debugging."), _("\
667When non-zero, serial port debugging is enabled."),
ccce17b0
YQ
668 NULL,
669 NULL, /* FIXME: i18n: */
670 &setdebuglist, &showdebuglist);
c906108c 671}
This page took 1.973467 seconds and 4 git commands to generate.