Rename "set/show remotebaud" command into "set/show serial baud"
[external/binutils.git] / gdb / serial.c
1 /* Generic serial interface routines
2
3    Copyright (C) 1992-2013 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
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
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
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.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include <ctype.h>
22 #include "serial.h"
23 #include "gdb_string.h"
24 #include "gdbcmd.h"
25 #include "cli/cli-utils.h"
26
27 extern void _initialize_serial (void);
28
29 /* Is serial being debugged?  */
30
31 static unsigned int global_serial_debug_p;
32
33 /* Linked list of serial I/O handlers.  */
34
35 static struct serial_ops *serial_ops_list = NULL;
36
37 /* Pointer to list of scb's.  */
38
39 static struct serial *scb_base;
40
41 /* Non-NULL gives filename which contains a recording of the remote session,
42    suitable for playback by gdbserver.  */
43
44 static char *serial_logfile = NULL;
45 static struct ui_file *serial_logfp = NULL;
46
47 static struct serial_ops *serial_interface_lookup (const char *);
48 static void serial_logchar (struct ui_file *stream,
49                             int ch_type, int ch, int timeout);
50 static const char logbase_hex[] = "hex";
51 static const char logbase_octal[] = "octal";
52 static const char logbase_ascii[] = "ascii";
53 static const char *const logbase_enums[] =
54 {logbase_hex, logbase_octal, logbase_ascii, NULL};
55 static const char *serial_logbase = logbase_ascii;
56 \f
57
58 static int serial_current_type = 0;
59
60 /* Log char CH of type CHTYPE, with TIMEOUT.  */
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
66 static void
67 serial_logchar (struct ui_file *stream, int ch_type, int ch, int timeout)
68 {
69   if (ch_type != serial_current_type)
70     {
71       fprintf_unfiltered (stream, "\n%c ", ch_type);
72       serial_current_type = ch_type;
73     }
74
75   if (serial_logbase != logbase_ascii)
76     fputc_unfiltered (' ', stream);
77
78   switch (ch)
79     {
80     case SERIAL_TIMEOUT:
81       fprintf_unfiltered (stream, "<Timeout: %d seconds>", timeout);
82       return;
83     case SERIAL_ERROR:
84       fprintf_unfiltered (stream, "<Error: %s>", safe_strerror (errno));
85       return;
86     case SERIAL_EOF:
87       fputs_unfiltered ("<Eof>", stream);
88       return;
89     case SERIAL_BREAK:
90       fputs_unfiltered ("<Break>", stream);
91       return;
92     default:
93       if (serial_logbase == logbase_hex)
94         fprintf_unfiltered (stream, "%02x", ch & 0xff);
95       else if (serial_logbase == logbase_octal)
96         fprintf_unfiltered (stream, "%03o", ch & 0xff);
97       else
98         switch (ch)
99           {
100           case '\\':
101             fputs_unfiltered ("\\\\", stream);
102             break;
103           case '\b':
104             fputs_unfiltered ("\\b", stream);
105             break;
106           case '\f':
107             fputs_unfiltered ("\\f", stream);
108             break;
109           case '\n':
110             fputs_unfiltered ("\\n", stream);
111             break;
112           case '\r':
113             fputs_unfiltered ("\\r", stream);
114             break;
115           case '\t':
116             fputs_unfiltered ("\\t", stream);
117             break;
118           case '\v':
119             fputs_unfiltered ("\\v", stream);
120             break;
121           default:
122             fprintf_unfiltered (stream,
123                                 isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF);
124             break;
125           }
126     }
127 }
128
129 void
130 serial_log_command (const char *cmd)
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,
141      in case we are getting ready to dump core or something.  */
142   gdb_flush (serial_logfp);
143 }
144
145 \f
146 static struct serial_ops *
147 serial_interface_lookup (const char *name)
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
158 void
159 serial_add_interface (struct serial_ops *optable)
160 {
161   optable->next = serial_ops_list;
162   serial_ops_list = optable;
163 }
164
165 /* Return the open serial device for FD, if found, or NULL if FD is
166    not already opened.  */
167
168 struct serial *
169 serial_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
180 /* Open up a device or a network socket, depending upon the syntax of NAME.  */
181
182 struct serial *
183 serial_open (const char *name)
184 {
185   struct serial *scb;
186   struct serial_ops *ops;
187   const char *open_name = name;
188
189   if (strcmp (name, "pc") == 0)
190     ops = serial_interface_lookup ("pc");
191   else if (strncmp (name, "lpt", 3) == 0)
192     ops = serial_interface_lookup ("parallel");
193   else if (strncmp (name, "|", 1) == 0)
194     {
195       ops = serial_interface_lookup ("pipe");
196       /* Discard ``|'' and any space before the command itself.  */
197       ++open_name;
198       open_name = skip_spaces_const (open_name);
199     }
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");
205   else
206     ops = serial_interface_lookup ("hardwire");
207
208   if (!ops)
209     return NULL;
210
211   scb = XMALLOC (struct serial);
212
213   scb->ops = ops;
214
215   scb->bufcnt = 0;
216   scb->bufp = scb->buf;
217   scb->error_fd = -1;
218   scb->refcnt = 1;
219
220   /* `...->open (...)' would get expanded by the open(2) syscall macro.  */
221   if ((*scb->ops->open) (scb, open_name))
222     {
223       xfree (scb);
224       return NULL;
225     }
226
227   scb->name = xstrdup (name);
228   scb->next = scb_base;
229   scb->debug_p = 0;
230   scb->async_state = 0;
231   scb->async_handler = NULL;
232   scb->async_context = NULL;
233   scb_base = scb;
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
245 /* Open a new serial stream using a file handle, using serial
246    interface ops OPS.  */
247
248 static struct serial *
249 serial_fdopen_ops (const int fd, struct serial_ops *ops)
250 {
251   struct serial *scb;
252
253   if (!ops)
254     {
255       ops = serial_interface_lookup ("terminal");
256       if (!ops)
257         ops = serial_interface_lookup ("hardwire");
258     }
259
260   if (!ops)
261     return NULL;
262
263   scb = XCALLOC (1, struct serial);
264
265   scb->ops = ops;
266
267   scb->bufcnt = 0;
268   scb->bufp = scb->buf;
269   scb->error_fd = -1;
270   scb->refcnt = 1;
271
272   scb->name = NULL;
273   scb->next = scb_base;
274   scb->debug_p = 0;
275   scb->async_state = 0;
276   scb->async_handler = NULL;
277   scb->async_context = NULL;
278   scb_base = scb;
279
280   if ((ops->fdopen) != NULL)
281     (*ops->fdopen) (scb, fd);
282   else
283     scb->fd = fd;
284
285   return scb;
286 }
287
288 struct serial *
289 serial_fdopen (const int fd)
290 {
291   return serial_fdopen_ops (fd, NULL);
292 }
293
294 static void
295 do_serial_close (struct serial *scb, int really_close)
296 {
297   struct serial *tmp_scb;
298
299   if (serial_logfp)
300     {
301       fputs_unfiltered ("\nEnd of log\n", serial_logfp);
302       serial_current_type = 0;
303
304       /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr?  */
305       ui_file_delete (serial_logfp);
306       serial_logfp = NULL;
307     }
308
309   /* ensure that the FD has been taken out of async mode.  */
310   if (scb->async_handler != NULL)
311     serial_async (scb, NULL, NULL);
312
313   if (really_close)
314     scb->ops->close (scb);
315
316   if (scb->name)
317     xfree (scb->name);
318
319   /* For serial_is_open.  */
320   scb->bufp = NULL;
321
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
334   serial_unref (scb);
335 }
336
337 void
338 serial_close (struct serial *scb)
339 {
340   do_serial_close (scb, 1);
341 }
342
343 void
344 serial_un_fdopen (struct serial *scb)
345 {
346   do_serial_close (scb, 0);
347 }
348
349 int
350 serial_is_open (struct serial *scb)
351 {
352   return scb->bufp != NULL;
353 }
354
355 void
356 serial_ref (struct serial *scb)
357 {
358   scb->refcnt++;
359 }
360
361 void
362 serial_unref (struct serial *scb)
363 {
364   --scb->refcnt;
365   if (scb->refcnt == 0)
366     xfree (scb);
367 }
368
369 int
370 serial_readchar (struct serial *scb, int timeout)
371 {
372   int ch;
373
374   /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
375      code is finished.  */
376   if (0 && serial_is_async_p (scb) && timeout < 0)
377     internal_error (__FILE__, __LINE__,
378                     _("serial_readchar: blocking read in async mode"));
379
380   ch = scb->ops->readchar (scb, timeout);
381   if (serial_logfp != NULL)
382     {
383       serial_logchar (serial_logfp, 'r', ch, timeout);
384
385       /* Make sure that the log file is as up-to-date as possible,
386          in case we are getting ready to dump core or something.  */
387       gdb_flush (serial_logfp);
388     }
389   if (serial_debug_p (scb))
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     }
396
397   return (ch);
398 }
399
400 int
401 serial_write (struct serial *scb, const void *buf, size_t count)
402 {
403   if (serial_logfp != NULL)
404     {
405       const char *str = buf;
406       size_t c;
407
408       for (c = 0; c < count; c++)
409         serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
410
411       /* Make sure that the log file is as up-to-date as possible,
412          in case we are getting ready to dump core or something.  */
413       gdb_flush (serial_logfp);
414     }
415   if (serial_debug_p (scb))
416     {
417       const char *str = buf;
418       size_t c;
419
420       for (c = 0; c < count; c++)
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     }
428
429   return (scb->ops->write (scb, buf, count));
430 }
431
432 void
433 serial_printf (struct serial *desc, const char *format,...)
434 {
435   va_list args;
436   char *buf;
437   va_start (args, format);
438
439   buf = xstrvprintf (format, args);
440   serial_write (desc, buf, strlen (buf));
441
442   xfree (buf);
443   va_end (args);
444 }
445
446 int
447 serial_drain_output (struct serial *scb)
448 {
449   return scb->ops->drain_output (scb);
450 }
451
452 int
453 serial_flush_output (struct serial *scb)
454 {
455   return scb->ops->flush_output (scb);
456 }
457
458 int
459 serial_flush_input (struct serial *scb)
460 {
461   return scb->ops->flush_input (scb);
462 }
463
464 int
465 serial_send_break (struct serial *scb)
466 {
467   if (serial_logfp != NULL)
468     serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
469
470   return (scb->ops->send_break (scb));
471 }
472
473 void
474 serial_raw (struct serial *scb)
475 {
476   scb->ops->go_raw (scb);
477 }
478
479 serial_ttystate
480 serial_get_tty_state (struct serial *scb)
481 {
482   return scb->ops->get_tty_state (scb);
483 }
484
485 serial_ttystate
486 serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
487 {
488   return scb->ops->copy_tty_state (scb, ttystate);
489 }
490
491 int
492 serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
493 {
494   return scb->ops->set_tty_state (scb, ttystate);
495 }
496
497 void
498 serial_print_tty_state (struct serial *scb,
499                         serial_ttystate ttystate,
500                         struct ui_file *stream)
501 {
502   scb->ops->print_tty_state (scb, ttystate, stream);
503 }
504
505 int
506 serial_noflush_set_tty_state (struct serial *scb,
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
513 int
514 serial_setbaudrate (struct serial *scb, int rate)
515 {
516   return scb->ops->setbaudrate (scb, rate);
517 }
518
519 int
520 serial_setstopbits (struct serial *scb, int num)
521 {
522   return scb->ops->setstopbits (scb, num);
523 }
524
525 int
526 serial_can_async_p (struct serial *scb)
527 {
528   return (scb->ops->async != NULL);
529 }
530
531 int
532 serial_is_async_p (struct serial *scb)
533 {
534   return (scb->ops->async != NULL) && (scb->async_handler != NULL);
535 }
536
537 void
538 serial_async (struct serial *scb,
539               serial_event_ftype *handler,
540               void *context)
541 {
542   int changed = ((scb->async_handler == NULL) != (handler == NULL));
543
544   scb->async_handler = handler;
545   scb->async_context = context;
546   /* Only change mode if there is a need.  */
547   if (changed)
548     scb->ops->async (scb, handler != NULL);
549 }
550
551 void
552 serial_debug (struct serial *scb, int debug_p)
553 {
554   scb->debug_p = debug_p;
555 }
556
557 int
558 serial_debug_p (struct serial *scb)
559 {
560   return scb->debug_p || global_serial_debug_p;
561 }
562
563 #ifdef USE_WIN32API
564 void
565 serial_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 }
575
576 void
577 serial_done_wait_handle (struct serial *scb)
578 {
579   if (scb->ops->done_wait_handle)
580     scb->ops->done_wait_handle (scb);
581 }
582 #endif
583
584 int
585 serial_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
605 /* Serial set/show framework.  */
606
607 static struct cmd_list_element *serial_set_cmdlist;
608 static struct cmd_list_element *serial_show_cmdlist;
609
610 static void
611 serial_set_cmd (char *args, int from_tty)
612 {
613   printf_unfiltered ("\"set serial\" must be followed "
614                      "by the name of a command.\n");
615   help_list (serial_set_cmdlist, "set serial ", -1, gdb_stdout);
616 }
617
618 static void
619 serial_show_cmd (char *args, int from_tty)
620 {
621   cmd_show_list (serial_show_cmdlist, from_tty, "");
622 }
623
624 /* Baud rate specified for talking to serial target systems.  Default
625    is left as -1, so targets can choose their own defaults.  */
626 /* FIXME: This means that "show serial baud" and gr_files_info can
627    print -1 or (unsigned int)-1.  This is a Bad User Interface.  */
628
629 int baud_rate = -1;
630
631 static void
632 serial_baud_show_cmd (struct ui_file *file, int from_tty,
633                       struct cmd_list_element *c, const char *value)
634 {
635   fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"),
636                     value);
637 }
638
639 void
640 _initialize_serial (void)
641 {
642 #if 0
643   add_com ("connect", class_obscure, connect_command, _("\
644 Connect the terminal directly up to the command monitor.\n\
645 Use <CR>~. or <CR>~^D to break out."));
646 #endif /* 0 */
647
648   add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
649 Set default serial/parallel port configuration."),
650                   &serial_set_cmdlist, "set serial ",
651                   0/*allow-unknown*/,
652                   &setlist);
653
654   add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
655 Show default serial/parallel port configuration."),
656                   &serial_show_cmdlist, "show serial ",
657                   0/*allow-unknown*/,
658                   &showlist);
659
660   /* If target is open when baud changes, it doesn't take effect until
661      the next open (I think, not sure).  */
662   add_setshow_zinteger_cmd ("baud", no_class, &baud_rate, _("\
663 Set baud rate for remote serial I/O."), _("\
664 Show baud rate for remote serial I/O."), _("\
665 This value is used to set the speed of the serial port when debugging\n\
666 using remote targets."),
667                             NULL,
668                             serial_baud_show_cmd,
669                             &serial_set_cmdlist, &serial_show_cmdlist);
670
671   /* The commands "set/show serial baud" used to have a different name.
672      Add aliases to those names to facilitate the transition, and mark
673      them as deprecated, in order to make users aware of the fact that
674      the command names have been changed.  */
675     {
676       const char *cmd_name;
677       struct cmd_list_element *cmd;
678
679       /* FIXME: There is a limitation in the deprecation mechanism,
680          and the warning ends up not being displayed for prefixed
681          aliases.  So use a real command instead of an alias.  */
682       add_setshow_zinteger_cmd ("remotebaud", class_alias, &baud_rate, _("\
683 Set baud rate for remote serial I/O."), _("\
684 Show baud rate for remote serial I/O."), _("\
685 This value is used to set the speed of the serial port when debugging\n\
686 using remote targets."),
687                                 NULL,
688                                 serial_baud_show_cmd,
689                                 &setlist, &showlist);
690       cmd_name = "remotebaud";
691       cmd = lookup_cmd (&cmd_name, setlist, "", -1, 1);
692       deprecate_cmd (cmd, "set serial baud");
693       cmd_name
694         = "remotebaud"; /* needed because lookup_cmd updates the pointer */
695       cmd = lookup_cmd (&cmd_name, showlist, "", -1, 1);
696       deprecate_cmd (cmd, "show serial baud");
697     }
698
699   add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
700 Set filename for remote session recording."), _("\
701 Show filename for remote session recording."), _("\
702 This file is used to record the remote session for future playback\n\
703 by gdbserver."),
704                             NULL,
705                             NULL, /* FIXME: i18n: */
706                             &setlist, &showlist);
707
708   add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
709                         &serial_logbase, _("\
710 Set numerical base for remote session logging"), _("\
711 Show numerical base for remote session logging"), NULL,
712                         NULL,
713                         NULL, /* FIXME: i18n: */
714                         &setlist, &showlist);
715
716   add_setshow_zuinteger_cmd ("serial", class_maintenance,
717                              &global_serial_debug_p, _("\
718 Set serial debugging."), _("\
719 Show serial debugging."), _("\
720 When non-zero, serial port debugging is enabled."),
721                              NULL,
722                              NULL, /* FIXME: i18n: */
723                              &setdebuglist, &showdebuglist);
724 }