X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fserial.c;h=0a8c7abf615e721e1ea4be0527671e943208f821;hb=62ec8e6dad018082e33e7dcb0633f28332f3520c;hp=a2895d26e8434474d12924ea9083e90aaca15e07;hpb=eb4c3f4aaae2ee1b27c210e951260a7e699133b4;p=binutils-gdb.git diff --git a/gdb/serial.c b/gdb/serial.c index a2895d26e84..0a8c7abf615 100644 --- a/gdb/serial.c +++ b/gdb/serial.c @@ -1,6 +1,6 @@ /* Generic serial interface routines - Copyright (C) 1992-2017 Free Software Foundation, Inc. + Copyright (C) 1992-2022 Free Software Foundation, Inc. This file is part of GDB. @@ -27,12 +27,9 @@ static unsigned int global_serial_debug_p; -typedef const struct serial_ops *serial_ops_p; -DEF_VEC_P (serial_ops_p); - /* Serial I/O handlers. */ -VEC (serial_ops_p) *serial_ops_list = NULL; +static std::vector serial_ops_list; /* Pointer to list of scb's. */ @@ -41,7 +38,7 @@ static struct serial *scb_base; /* Non-NULL gives filename which contains a recording of the remote session, suitable for playback by gdbserver. */ -static char *serial_logfile = NULL; +static std::string serial_logfile; static struct ui_file *serial_logfp = NULL; static const struct serial_ops *serial_interface_lookup (const char *); @@ -68,59 +65,59 @@ serial_logchar (struct ui_file *stream, int ch_type, int ch, int timeout) { if (ch_type != serial_current_type) { - fprintf_unfiltered (stream, "\n%c ", ch_type); + gdb_printf (stream, "\n%c ", ch_type); serial_current_type = ch_type; } if (serial_logbase != logbase_ascii) - fputc_unfiltered (' ', stream); + gdb_putc (' ', stream); switch (ch) { case SERIAL_TIMEOUT: - fprintf_unfiltered (stream, "", timeout); + gdb_printf (stream, "", timeout); return; case SERIAL_ERROR: - fprintf_unfiltered (stream, "", safe_strerror (errno)); + gdb_printf (stream, "", safe_strerror (errno)); return; case SERIAL_EOF: - fputs_unfiltered ("", stream); + gdb_puts ("", stream); return; case SERIAL_BREAK: - fputs_unfiltered ("", stream); + gdb_puts ("", stream); return; default: if (serial_logbase == logbase_hex) - fprintf_unfiltered (stream, "%02x", ch & 0xff); + gdb_printf (stream, "%02x", ch & 0xff); else if (serial_logbase == logbase_octal) - fprintf_unfiltered (stream, "%03o", ch & 0xff); + gdb_printf (stream, "%03o", ch & 0xff); else switch (ch) { case '\\': - fputs_unfiltered ("\\\\", stream); + gdb_puts ("\\\\", stream); break; case '\b': - fputs_unfiltered ("\\b", stream); + gdb_puts ("\\b", stream); break; case '\f': - fputs_unfiltered ("\\f", stream); + gdb_puts ("\\f", stream); break; case '\n': - fputs_unfiltered ("\\n", stream); + gdb_puts ("\\n", stream); break; case '\r': - fputs_unfiltered ("\\r", stream); + gdb_puts ("\\r", stream); break; case '\t': - fputs_unfiltered ("\\t", stream); + gdb_puts ("\\t", stream); break; case '\v': - fputs_unfiltered ("\\v", stream); + gdb_puts ("\\v", stream); break; default: - fprintf_unfiltered (stream, - isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF); + gdb_printf (stream, + isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF); break; } } @@ -134,8 +131,8 @@ serial_log_command (struct target_ops *self, const char *cmd) serial_current_type = 'c'; - fputs_unfiltered ("\nc ", serial_logfp); - fputs_unfiltered (cmd, serial_logfp); + gdb_puts ("\nc ", serial_logfp); + gdb_puts (cmd, serial_logfp); /* Make sure that the log file is as up-to-date as possible, in case we are getting ready to dump core or something. */ @@ -146,10 +143,7 @@ serial_log_command (struct target_ops *self, const char *cmd) static const struct serial_ops * serial_interface_lookup (const char *name) { - const struct serial_ops *ops; - int i; - - for (i = 0; VEC_iterate (serial_ops_p, serial_ops_list, i, ops); ++i) + for (const serial_ops *ops : serial_ops_list) if (strcmp (name, ops->name) == 0) return ops; @@ -159,7 +153,7 @@ serial_interface_lookup (const char *name) void serial_add_interface (const struct serial_ops *optable) { - VEC_safe_push (serial_ops_p, serial_ops_list, optable); + serial_ops_list.push_back (optable); } /* Return the open serial device for FD, if found, or NULL if FD is @@ -203,24 +197,28 @@ static struct serial *serial_open_ops_1 (const struct serial_ops *ops, struct serial * serial_open (const char *name) { - struct serial *scb; const struct serial_ops *ops; const char *open_name = name; if (startswith (name, "|")) - { - ops = serial_interface_lookup ("pipe"); - /* Discard ``|'' and any space before the command itself. */ - ++open_name; - open_name = skip_spaces (open_name); - } + ops = serial_interface_lookup ("pipe"); /* Check for a colon, suggesting an IP address/port pair. Do this *after* checking for all the interesting prefixes. We don't want to constrain the syntax of what can follow them. */ else if (strchr (name, ':')) ops = serial_interface_lookup ("tcp"); else - ops = serial_interface_lookup ("hardwire"); + { +#ifndef USE_WIN32API + /* Check to see if name is a socket. If it is, then treat it + as such. Otherwise assume that it's a character device. */ + struct stat sb; + if (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK) + ops = serial_interface_lookup ("local"); + else +#endif + ops = serial_interface_lookup ("hardwire"); + } if (!ops) return NULL; @@ -244,15 +242,16 @@ serial_open_ops_1 (const struct serial_ops *ops, const char *open_name) return NULL; } + scb->name = open_name != NULL ? xstrdup (open_name) : NULL; scb->next = scb_base; scb_base = scb; - if (serial_logfile != NULL) + if (!serial_logfile.empty ()) { stdio_file_up file (new stdio_file ()); - if (!file->open (serial_logfile, "w")) - perror_with_name (serial_logfile); + if (!file->open (serial_logfile.c_str (), "w")) + perror_with_name (serial_logfile.c_str ()); serial_logfp = file.release (); } @@ -280,7 +279,7 @@ serial_fdopen_ops (const int fd, const struct serial_ops *ops) { ops = serial_interface_lookup ("terminal"); if (!ops) - ops = serial_interface_lookup ("hardwire"); + ops = serial_interface_lookup ("hardwire"); } if (!ops) @@ -288,6 +287,7 @@ serial_fdopen_ops (const int fd, const struct serial_ops *ops) scb = new_serial (ops); + scb->name = NULL; scb->next = scb_base; scb_base = scb; @@ -312,7 +312,7 @@ do_serial_close (struct serial *scb, int really_close) if (serial_logfp) { - fputs_unfiltered ("\nEnd of log\n", serial_logfp); + gdb_puts ("\nEnd of log\n", serial_logfp); serial_current_type = 0; /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */ @@ -327,6 +327,8 @@ do_serial_close (struct serial *scb, int really_close) if (really_close) scb->ops->close (scb); + xfree (scb->name); + /* For serial_is_open. */ scb->bufp = NULL; @@ -394,14 +396,14 @@ serial_readchar (struct serial *scb, int timeout) serial_logchar (serial_logfp, 'r', ch, timeout); /* Make sure that the log file is as up-to-date as possible, - in case we are getting ready to dump core or something. */ + in case we are getting ready to dump core or something. */ gdb_flush (serial_logfp); } if (serial_debug_p (scb)) { - fprintf_unfiltered (gdb_stdlog, "["); + gdb_printf (gdb_stdlog, "["); serial_logchar (gdb_stdlog, 'r', ch, timeout); - fprintf_unfiltered (gdb_stdlog, "]"); + gdb_printf (gdb_stdlog, "]"); gdb_flush (gdb_stdlog); } @@ -420,7 +422,7 @@ serial_write (struct serial *scb, const void *buf, size_t count) serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0); /* Make sure that the log file is as up-to-date as possible, - in case we are getting ready to dump core or something. */ + in case we are getting ready to dump core or something. */ gdb_flush (serial_logfp); } if (serial_debug_p (scb)) @@ -430,9 +432,9 @@ serial_write (struct serial *scb, const void *buf, size_t count) for (c = 0; c < count; c++) { - fprintf_unfiltered (gdb_stdlog, "["); + gdb_printf (gdb_stdlog, "["); serial_logchar (gdb_stdlog, 'w', str[c] & 0xff, 0); - fprintf_unfiltered (gdb_stdlog, "]"); + gdb_printf (gdb_stdlog, "]"); } gdb_flush (gdb_stdlog); } @@ -441,16 +443,14 @@ serial_write (struct serial *scb, const void *buf, size_t count) } void -serial_printf (struct serial *desc, const char *format,...) +serial_printf (struct serial *desc, const char *format, ...) { va_list args; - char *buf; va_start (args, format); - buf = xstrvprintf (format, args); - serial_write (desc, buf, strlen (buf)); + std::string buf = string_vprintf (format, args); + serial_write (desc, buf.c_str (), buf.length ()); - xfree (buf); va_end (args); } @@ -618,24 +618,7 @@ serial_pipe (struct serial *scbs[2]) static struct cmd_list_element *serial_set_cmdlist; static struct cmd_list_element *serial_show_cmdlist; -static void -serial_set_cmd (const char *args, int from_tty) -{ - printf_unfiltered ("\"set serial\" must be followed " - "by the name of a command.\n"); - help_list (serial_set_cmdlist, "set serial ", all_commands, gdb_stdout); -} - -static void -serial_show_cmd (const char *args, int from_tty) -{ - cmd_show_list (serial_show_cmdlist, from_tty, ""); -} - -/* Baud rate specified for talking to serial target systems. Default - is left as -1, so targets can choose their own defaults. */ -/* FIXME: This means that "show serial baud" and gr_files_info can - print -1 or (unsigned int)-1. This is a Bad User Interface. */ +/* See serial.h. */ int baud_rate = -1; @@ -643,11 +626,11 @@ static void serial_baud_show_cmd (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"), - value); + gdb_printf (file, _("Baud rate for remote serial I/O is %s.\n"), + value); } -/* Parity for serial port. */ +/* See serial.h. */ int serial_parity = GDBPARITY_NONE; @@ -671,8 +654,9 @@ set_parity (const char *ignore_args, int from_tty, struct cmd_list_element *c) serial_parity = GDBPARITY_NONE; } +void _initialize_serial (); void -_initialize_serial (void) +_initialize_serial () { #if 0 add_com ("connect", class_obscure, connect_command, _("\ @@ -680,17 +664,11 @@ Connect the terminal directly up to the command monitor.\n\ Use ~. or ~^D to break out.")); #endif /* 0 */ - add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\ -Set default serial/parallel port configuration."), - &serial_set_cmdlist, "set serial ", - 0/*allow-unknown*/, - &setlist); - - add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\ -Show default serial/parallel port configuration."), - &serial_show_cmdlist, "show serial ", - 0/*allow-unknown*/, - &showlist); + add_setshow_prefix_cmd ("serial", class_maintenance, + _("Set default serial/parallel port configuration."), + _("Show default serial/parallel port configuration."), + &serial_set_cmdlist, &serial_show_cmdlist, + &setlist, &showlist); /* If target is open when baud changes, it doesn't take effect until the next open (I think, not sure). */ @@ -704,12 +682,12 @@ using remote targets."), &serial_set_cmdlist, &serial_show_cmdlist); add_setshow_enum_cmd ("parity", no_class, parity_enums, - &parity, _("\ -Set parity for remote serial I/O"), _("\ -Show parity for remote serial I/O"), NULL, - set_parity, - NULL, /* FIXME: i18n: */ - &serial_set_cmdlist, &serial_show_cmdlist); + &parity, _("\ +Set parity for remote serial I/O."), _("\ +Show parity for remote serial I/O."), NULL, + set_parity, + NULL, /* FIXME: i18n: */ + &serial_set_cmdlist, &serial_show_cmdlist); add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\ Set filename for remote session recording."), _("\ @@ -722,8 +700,8 @@ by gdbserver."), add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums, &serial_logbase, _("\ -Set numerical base for remote session logging"), _("\ -Show numerical base for remote session logging"), NULL, +Set numerical base for remote session logging."), _("\ +Show numerical base for remote session logging."), NULL, NULL, NULL, /* FIXME: i18n: */ &setlist, &showlist);