Merge branch 'vendor/OPENSSH'
[dragonfly.git] / contrib / gdb-7 / gdb / serial.c
1 /* Generic serial interface routines
2
3    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4    2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
5    Free Software Foundation, Inc.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22 #include "defs.h"
23 #include <ctype.h>
24 #include "serial.h"
25 #include "gdb_string.h"
26 #include "gdbcmd.h"
27
28 extern void _initialize_serial (void);
29
30 /* Is serial being debugged?  */
31
32 static int global_serial_debug_p;
33
34 /* Linked list of serial I/O handlers.  */
35
36 static struct serial_ops *serial_ops_list = NULL;
37
38 /* This is the last serial stream opened.  Used by connect command.  */
39
40 static struct serial *last_serial_opened = NULL;
41
42 /* Pointer to list of scb's.  */
43
44 static struct serial *scb_base;
45
46 /* Non-NULL gives filename which contains a recording of the remote session,
47    suitable for playback by gdbserver.  */
48
49 static char *serial_logfile = NULL;
50 static struct ui_file *serial_logfp = NULL;
51
52 static struct serial_ops *serial_interface_lookup (const char *);
53 static void serial_logchar (struct ui_file *stream,
54                             int ch_type, int ch, int timeout);
55 static const char logbase_hex[] = "hex";
56 static const char logbase_octal[] = "octal";
57 static const char logbase_ascii[] = "ascii";
58 static const char *logbase_enums[] =
59 {logbase_hex, logbase_octal, logbase_ascii, NULL};
60 static const char *serial_logbase = logbase_ascii;
61 \f
62
63 static 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
71 static void
72 serial_logchar (struct ui_file *stream, int ch_type, int ch, int timeout)
73 {
74   if (ch_type != serial_current_type)
75     {
76       fprintf_unfiltered (stream, "\n%c ", ch_type);
77       serial_current_type = ch_type;
78     }
79
80   if (serial_logbase != logbase_ascii)
81     fputc_unfiltered (' ', stream);
82
83   switch (ch)
84     {
85     case SERIAL_TIMEOUT:
86       fprintf_unfiltered (stream, "<Timeout: %d seconds>", timeout);
87       return;
88     case SERIAL_ERROR:
89       fprintf_unfiltered (stream, "<Error: %s>", safe_strerror (errno));
90       return;
91     case SERIAL_EOF:
92       fputs_unfiltered ("<Eof>", stream);
93       return;
94     case SERIAL_BREAK:
95       fputs_unfiltered ("<Break>", stream);
96       return;
97     default:
98       if (serial_logbase == logbase_hex)
99         fprintf_unfiltered (stream, "%02x", ch & 0xff);
100       else if (serial_logbase == logbase_octal)
101         fprintf_unfiltered (stream, "%03o", ch & 0xff);
102       else
103         switch (ch)
104           {
105           case '\\':
106             fputs_unfiltered ("\\\\", stream);
107             break;
108           case '\b':
109             fputs_unfiltered ("\\b", stream);
110             break;
111           case '\f':
112             fputs_unfiltered ("\\f", stream);
113             break;
114           case '\n':
115             fputs_unfiltered ("\\n", stream);
116             break;
117           case '\r':
118             fputs_unfiltered ("\\r", stream);
119             break;
120           case '\t':
121             fputs_unfiltered ("\\t", stream);
122             break;
123           case '\v':
124             fputs_unfiltered ("\\v", stream);
125             break;
126           default:
127             fprintf_unfiltered (stream,
128                                 isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF);
129             break;
130           }
131     }
132 }
133
134 void
135 serial_log_command (const char *cmd)
136 {
137   if (!serial_logfp)
138     return;
139
140   serial_current_type = 'c';
141
142   fputs_unfiltered ("\nc ", serial_logfp);
143   fputs_unfiltered (cmd, serial_logfp);
144
145   /* Make sure that the log file is as up-to-date as possible,
146      in case we are getting ready to dump core or something.  */
147   gdb_flush (serial_logfp);
148 }
149
150 \f
151 static struct serial_ops *
152 serial_interface_lookup (const char *name)
153 {
154   struct serial_ops *ops;
155
156   for (ops = serial_ops_list; ops; ops = ops->next)
157     if (strcmp (name, ops->name) == 0)
158       return ops;
159
160   return NULL;
161 }
162
163 void
164 serial_add_interface (struct serial_ops *optable)
165 {
166   optable->next = serial_ops_list;
167   serial_ops_list = optable;
168 }
169
170 /* Open up a device or a network socket, depending upon the syntax of NAME.  */
171
172 struct serial *
173 serial_open (const char *name)
174 {
175   struct serial *scb;
176   struct serial_ops *ops;
177   const char *open_name = name;
178
179   for (scb = scb_base; scb; scb = scb->next)
180     if (scb->name && strcmp (scb->name, name) == 0)
181       {
182         scb->refcnt++;
183         return scb;
184       }
185
186   if (strcmp (name, "pc") == 0)
187     ops = serial_interface_lookup ("pc");
188   else if (strncmp (name, "lpt", 3) == 0)
189     ops = serial_interface_lookup ("parallel");
190   else if (strncmp (name, "|", 1) == 0)
191     {
192       ops = serial_interface_lookup ("pipe");
193       /* Discard ``|'' and any space before the command itself.  */
194       ++open_name;
195       while (isspace (*open_name))
196         ++open_name;
197     }
198   /* Check for a colon, suggesting an IP address/port pair.
199      Do this *after* checking for all the interesting prefixes.  We
200      don't want to constrain the syntax of what can follow them.  */
201   else if (strchr (name, ':'))
202     ops = serial_interface_lookup ("tcp");
203   else
204     ops = serial_interface_lookup ("hardwire");
205
206   if (!ops)
207     return NULL;
208
209   scb = XMALLOC (struct serial);
210
211   scb->ops = ops;
212
213   scb->bufcnt = 0;
214   scb->bufp = scb->buf;
215   scb->error_fd = -1;
216
217   /* `...->open (...)' would get expanded by the open(2) syscall macro.  */
218   if ((*scb->ops->open) (scb, open_name))
219     {
220       xfree (scb);
221       return NULL;
222     }
223
224   scb->name = xstrdup (name);
225   scb->next = scb_base;
226   scb->refcnt = 1;
227   scb->debug_p = 0;
228   scb->async_state = 0;
229   scb->async_handler = NULL;
230   scb->async_context = NULL;
231   scb_base = scb;
232
233   last_serial_opened = 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 /* Return the open serial device for FD, if found, or NULL if FD
246    is not already opened.  */
247
248 struct serial *
249 serial_for_fd (int fd)
250 {
251   struct serial *scb;
252
253   for (scb = scb_base; scb; scb = scb->next)
254     if (scb->fd == fd)
255       return scb;
256
257   return NULL;
258 }
259
260 /* Open a new serial stream using a file handle, using serial
261    interface ops OPS.  */
262
263 static struct serial *
264 serial_fdopen_ops (const int fd, struct serial_ops *ops)
265 {
266   struct serial *scb;
267
268   scb = serial_for_fd (fd);
269   if (scb)
270     {
271       scb->refcnt++;
272       return scb;
273     }
274
275   if (!ops)
276     {
277       ops = serial_interface_lookup ("terminal");
278       if (!ops)
279         ops = serial_interface_lookup ("hardwire");
280     }
281
282   if (!ops)
283     return NULL;
284
285   scb = XCALLOC (1, struct serial);
286
287   scb->ops = ops;
288
289   scb->bufcnt = 0;
290   scb->bufp = scb->buf;
291   scb->error_fd = -1;
292
293   scb->name = NULL;
294   scb->next = scb_base;
295   scb->refcnt = 1;
296   scb->debug_p = 0;
297   scb->async_state = 0;
298   scb->async_handler = NULL;
299   scb->async_context = NULL;
300   scb_base = scb;
301
302   if ((ops->fdopen) != NULL)
303     (*ops->fdopen) (scb, fd);
304   else
305     scb->fd = fd;
306
307   last_serial_opened = scb;
308
309   return scb;
310 }
311
312 struct serial *
313 serial_fdopen (const int fd)
314 {
315   return serial_fdopen_ops (fd, NULL);
316 }
317
318 static void
319 do_serial_close (struct serial *scb, int really_close)
320 {
321   struct serial *tmp_scb;
322
323   last_serial_opened = NULL;
324
325   if (serial_logfp)
326     {
327       fputs_unfiltered ("\nEnd of log\n", serial_logfp);
328       serial_current_type = 0;
329
330       /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr?  */
331       ui_file_delete (serial_logfp);
332       serial_logfp = NULL;
333     }
334
335 /* This is bogus.  It's not our fault if you pass us a bad scb...!  Rob, you
336    should fix your code instead.  */
337
338   if (!scb)
339     return;
340
341   scb->refcnt--;
342   if (scb->refcnt > 0)
343     return;
344
345   /* ensure that the FD has been taken out of async mode.  */
346   if (scb->async_handler != NULL)
347     serial_async (scb, NULL, NULL);
348
349   if (really_close)
350     scb->ops->close (scb);
351
352   if (scb->name)
353     xfree (scb->name);
354
355   if (scb_base == scb)
356     scb_base = scb_base->next;
357   else
358     for (tmp_scb = scb_base; tmp_scb; tmp_scb = tmp_scb->next)
359       {
360         if (tmp_scb->next != scb)
361           continue;
362
363         tmp_scb->next = tmp_scb->next->next;
364         break;
365       }
366
367   xfree (scb);
368 }
369
370 void
371 serial_close (struct serial *scb)
372 {
373   do_serial_close (scb, 1);
374 }
375
376 void
377 serial_un_fdopen (struct serial *scb)
378 {
379   do_serial_close (scb, 0);
380 }
381
382 int
383 serial_readchar (struct serial *scb, int timeout)
384 {
385   int ch;
386
387   /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
388      code is finished.  */
389   if (0 && serial_is_async_p (scb) && timeout < 0)
390     internal_error (__FILE__, __LINE__,
391                     _("serial_readchar: blocking read in async mode"));
392
393   ch = scb->ops->readchar (scb, timeout);
394   if (serial_logfp != NULL)
395     {
396       serial_logchar (serial_logfp, 'r', ch, timeout);
397
398       /* Make sure that the log file is as up-to-date as possible,
399          in case we are getting ready to dump core or something.  */
400       gdb_flush (serial_logfp);
401     }
402   if (serial_debug_p (scb))
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     }
409
410   return (ch);
411 }
412
413 int
414 serial_write (struct serial *scb, const char *str, int len)
415 {
416   if (serial_logfp != NULL)
417     {
418       int count;
419
420       for (count = 0; count < len; count++)
421         serial_logchar (serial_logfp, 'w', str[count] & 0xff, 0);
422
423       /* Make sure that the log file is as up-to-date as possible,
424          in case we are getting ready to dump core or something.  */
425       gdb_flush (serial_logfp);
426     }
427   if (serial_debug_p (scb))
428     {
429       int count;
430
431       for (count = 0; count < len; count++)
432         {
433           fprintf_unfiltered (gdb_stdlog, "[");
434           serial_logchar (gdb_stdlog, 'w', str[count] & 0xff, 0);
435           fprintf_unfiltered (gdb_stdlog, "]");
436         }
437       gdb_flush (gdb_stdlog);
438     }
439
440   return (scb->ops->write (scb, str, len));
441 }
442
443 void
444 serial_printf (struct serial *desc, const char *format,...)
445 {
446   va_list args;
447   char *buf;
448   va_start (args, format);
449
450   buf = xstrvprintf (format, args);
451   serial_write (desc, buf, strlen (buf));
452
453   xfree (buf);
454   va_end (args);
455 }
456
457 int
458 serial_drain_output (struct serial *scb)
459 {
460   return scb->ops->drain_output (scb);
461 }
462
463 int
464 serial_flush_output (struct serial *scb)
465 {
466   return scb->ops->flush_output (scb);
467 }
468
469 int
470 serial_flush_input (struct serial *scb)
471 {
472   return scb->ops->flush_input (scb);
473 }
474
475 int
476 serial_send_break (struct serial *scb)
477 {
478   if (serial_logfp != NULL)
479     serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
480
481   return (scb->ops->send_break (scb));
482 }
483
484 void
485 serial_raw (struct serial *scb)
486 {
487   scb->ops->go_raw (scb);
488 }
489
490 serial_ttystate
491 serial_get_tty_state (struct serial *scb)
492 {
493   return scb->ops->get_tty_state (scb);
494 }
495
496 serial_ttystate
497 serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
498 {
499   return scb->ops->copy_tty_state (scb, ttystate);
500 }
501
502 int
503 serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
504 {
505   return scb->ops->set_tty_state (scb, ttystate);
506 }
507
508 void
509 serial_print_tty_state (struct serial *scb,
510                         serial_ttystate ttystate,
511                         struct ui_file *stream)
512 {
513   scb->ops->print_tty_state (scb, ttystate, stream);
514 }
515
516 int
517 serial_noflush_set_tty_state (struct serial *scb,
518                               serial_ttystate new_ttystate,
519                               serial_ttystate old_ttystate)
520 {
521   return scb->ops->noflush_set_tty_state (scb, new_ttystate, old_ttystate);
522 }
523
524 int
525 serial_setbaudrate (struct serial *scb, int rate)
526 {
527   return scb->ops->setbaudrate (scb, rate);
528 }
529
530 int
531 serial_setstopbits (struct serial *scb, int num)
532 {
533   return scb->ops->setstopbits (scb, num);
534 }
535
536 int
537 serial_can_async_p (struct serial *scb)
538 {
539   return (scb->ops->async != NULL);
540 }
541
542 int
543 serial_is_async_p (struct serial *scb)
544 {
545   return (scb->ops->async != NULL) && (scb->async_handler != NULL);
546 }
547
548 void
549 serial_async (struct serial *scb,
550               serial_event_ftype *handler,
551               void *context)
552 {
553   int changed = ((scb->async_handler == NULL) != (handler == NULL));
554
555   scb->async_handler = handler;
556   scb->async_context = context;
557   /* Only change mode if there is a need.  */
558   if (changed)
559     scb->ops->async (scb, handler != NULL);
560 }
561
562 int
563 deprecated_serial_fd (struct serial *scb)
564 {
565   /* FIXME: should this output a warning that deprecated code is being
566      called?  */
567   if (scb->fd < 0)
568     {
569       internal_error (__FILE__, __LINE__,
570                       _("serial: FD not valid"));
571     }
572   return scb->fd; /* sigh */
573 }
574
575 void
576 serial_debug (struct serial *scb, int debug_p)
577 {
578   scb->debug_p = debug_p;
579 }
580
581 int
582 serial_debug_p (struct serial *scb)
583 {
584   return scb->debug_p || global_serial_debug_p;
585 }
586
587 #ifdef USE_WIN32API
588 void
589 serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
590 {
591   if (scb->ops->wait_handle)
592     scb->ops->wait_handle (scb, read, except);
593   else
594     {
595       *read = (HANDLE) _get_osfhandle (scb->fd);
596       *except = NULL;
597     }
598 }
599
600 void
601 serial_done_wait_handle (struct serial *scb)
602 {
603   if (scb->ops->done_wait_handle)
604     scb->ops->done_wait_handle (scb);
605 }
606 #endif
607
608 int
609 serial_pipe (struct serial *scbs[2])
610 {
611   struct serial_ops *ops;
612   int fildes[2];
613
614   ops = serial_interface_lookup ("pipe");
615   if (!ops)
616     {
617       errno = ENOSYS;
618       return -1;
619     }
620
621   if (gdb_pipe (fildes) == -1)
622     return -1;
623
624   scbs[0] = serial_fdopen_ops (fildes[0], ops);
625   scbs[1] = serial_fdopen_ops (fildes[1], ops);
626   return 0;
627 }
628
629 #if 0
630 /* The connect command is #if 0 because I hadn't thought of an elegant
631    way to wait for I/O on two `struct serial *'s simultaneously.  Two
632    solutions came to mind:
633
634    1) Fork, and have have one fork handle the to user direction,
635    and have the other hand the to target direction.  This
636    obviously won't cut it for MSDOS.
637
638    2) Use something like select.  This assumes that stdin and
639    the target side can both be waited on via the same
640    mechanism.  This may not be true for DOS, if GDB is
641    talking to the target via a TCP socket.
642    -grossman, 8 Jun 93 */
643
644 /* Connect the user directly to the remote system.  This command acts just like
645    the 'cu' or 'tip' command.  Use <CR>~. or <CR>~^D to break out.  */
646
647 static struct serial *tty_desc; /* Controlling terminal */
648
649 static void
650 cleanup_tty (serial_ttystate ttystate)
651 {
652   printf_unfiltered ("\r\n[Exiting connect mode]\r\n");
653   serial_set_tty_state (tty_desc, ttystate);
654   xfree (ttystate);
655   serial_close (tty_desc);
656 }
657
658 static void
659 connect_command (char *args, int fromtty)
660 {
661   int c;
662   char cur_esc = 0;
663   serial_ttystate ttystate;
664   struct serial *port_desc;             /* TTY port */
665
666   dont_repeat ();
667
668   if (args)
669     fprintf_unfiltered (gdb_stderr,
670                         "This command takes no args.  "
671                         "They have been ignored.\n");
672
673   printf_unfiltered ("[Entering connect mode.  Use ~. or ~^D to escape]\n");
674
675   tty_desc = serial_fdopen (0);
676   port_desc = last_serial_opened;
677
678   ttystate = serial_get_tty_state (tty_desc);
679
680   serial_raw (tty_desc);
681   serial_raw (port_desc);
682
683   make_cleanup (cleanup_tty, ttystate);
684
685   while (1)
686     {
687       int mask;
688
689       mask = serial_wait_2 (tty_desc, port_desc, -1);
690
691       if (mask & 2)
692         {                       /* tty input */
693           char cx;
694
695           while (1)
696             {
697               c = serial_readchar (tty_desc, 0);
698
699               if (c == SERIAL_TIMEOUT)
700                 break;
701
702               if (c < 0)
703                 perror_with_name (_("connect"));
704
705               cx = c;
706               serial_write (port_desc, &cx, 1);
707
708               switch (cur_esc)
709                 {
710                 case 0:
711                   if (c == '\r')
712                     cur_esc = c;
713                   break;
714                 case '\r':
715                   if (c == '~')
716                     cur_esc = c;
717                   else
718                     cur_esc = 0;
719                   break;
720                 case '~':
721                   if (c == '.' || c == '\004')
722                     return;
723                   else
724                     cur_esc = 0;
725                 }
726             }
727         }
728
729       if (mask & 1)
730         {                       /* Port input */
731           char cx;
732
733           while (1)
734             {
735               c = serial_readchar (port_desc, 0);
736
737               if (c == SERIAL_TIMEOUT)
738                 break;
739
740               if (c < 0)
741                 perror_with_name (_("connect"));
742
743               cx = c;
744
745               serial_write (tty_desc, &cx, 1);
746             }
747         }
748     }
749 }
750 #endif /* 0 */
751
752 /* Serial set/show framework.  */
753
754 static struct cmd_list_element *serial_set_cmdlist;
755 static struct cmd_list_element *serial_show_cmdlist;
756
757 static void
758 serial_set_cmd (char *args, int from_tty)
759 {
760   printf_unfiltered ("\"set serial\" must be followed "
761                      "by the name of a command.\n");
762   help_list (serial_set_cmdlist, "set serial ", -1, gdb_stdout);
763 }
764
765 static void
766 serial_show_cmd (char *args, int from_tty)
767 {
768   cmd_show_list (serial_show_cmdlist, from_tty, "");
769 }
770
771
772 void
773 _initialize_serial (void)
774 {
775 #if 0
776   add_com ("connect", class_obscure, connect_command, _("\
777 Connect the terminal directly up to the command monitor.\n\
778 Use <CR>~. or <CR>~^D to break out."));
779 #endif /* 0 */
780
781   add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
782 Set default serial/parallel port configuration."),
783                   &serial_set_cmdlist, "set serial ",
784                   0/*allow-unknown*/,
785                   &setlist);
786
787   add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
788 Show default serial/parallel port configuration."),
789                   &serial_show_cmdlist, "show serial ",
790                   0/*allow-unknown*/,
791                   &showlist);
792
793   add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
794 Set filename for remote session recording."), _("\
795 Show filename for remote session recording."), _("\
796 This file is used to record the remote session for future playback\n\
797 by gdbserver."),
798                             NULL,
799                             NULL, /* FIXME: i18n: */
800                             &setlist, &showlist);
801
802   add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
803                         &serial_logbase, _("\
804 Set numerical base for remote session logging"), _("\
805 Show numerical base for remote session logging"), NULL,
806                         NULL,
807                         NULL, /* FIXME: i18n: */
808                         &setlist, &showlist);
809
810   add_setshow_zinteger_cmd ("serial", class_maintenance,
811                             &global_serial_debug_p, _("\
812 Set serial debugging."), _("\
813 Show serial debugging."), _("\
814 When non-zero, serial port debugging is enabled."),
815                             NULL,
816                             NULL, /* FIXME: i18n: */
817                             &setdebuglist, &showdebuglist);
818 }