Move implementation of perror_with_name to gdbsupport

gdbsupport/errors.h declares perror_with_name and leaves the
implementation to the clients.

However gdb and gdbserver's implementations are essentially the
same, resulting in unnecessary code duplication.

Fix this by implementing perror_with_name in gdbsupport.  Add an
optional parameter for specifying the errno used to generate the
error message.

Also move the implementation of perror_string to gdbsupport since
perror_with_name requires it.

Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Aaron Merey 2023-02-09 20:28:20 -05:00
parent bad727e2d2
commit 40dfb28b56
4 changed files with 35 additions and 62 deletions

View File

@ -614,42 +614,6 @@ add_internal_problem_command (struct internal_problem *problem)
}
}
/* Return a newly allocated string, containing the PREFIX followed
by the system error message for errno (separated by a colon). */
static std::string
perror_string (const char *prefix)
{
const char *err = safe_strerror (errno);
return std::string (prefix) + ": " + err;
}
/* Print the system error message for errno, and also mention STRING
as the file name for which the error was encountered. Use ERRCODE
for the thrown exception. Then return to command level. */
static void ATTRIBUTE_NORETURN
throw_perror_with_name (enum errors errcode, const char *string)
{
std::string combined = perror_string (string);
/* I understand setting these is a matter of taste. Still, some people
may clear errno but not know about bfd_error. Doing this here is not
unreasonable. */
bfd_set_error (bfd_error_no_error);
errno = 0;
throw_error (errcode, _("%s."), combined.c_str ());
}
/* See throw_perror_with_name, ERRCODE defaults here to GENERIC_ERROR. */
void
perror_with_name (const char *string)
{
throw_perror_with_name (GENERIC_ERROR, string);
}
/* Same as perror_with_name except that it prints a warning instead
of throwing an error. */

View File

@ -51,28 +51,6 @@ malloc_failure (long size)
abort_or_exit ();
}
/* Print the system error message for errno, and also mention STRING
as the file name for which the error was encountered.
Then return to command level. */
void
perror_with_name (const char *string)
{
const char *err;
char *combined;
err = safe_strerror (errno);
if (err == NULL)
err = "unknown error";
combined = (char *) alloca (strlen (err) + strlen (string) + 3);
strcpy (combined, string);
strcat (combined, ": ");
strcat (combined, err);
error ("%s.", combined);
}
/* Print an error message and return to top level. */
void

View File

@ -71,6 +71,30 @@ internal_warning_loc (const char *file, int line, const char *fmt, ...)
va_end (ap);
}
/* See errors.h. */
std::string
perror_string (const char *prefix, int errnum)
{
const char *err;
if (errnum != 0)
err = safe_strerror (errnum);
else
err = safe_strerror (errno);
return std::string (prefix) + ": " + err;
}
/* See errors.h. */
void
perror_with_name (const char *string, int errnum)
{
std::string combined = perror_string (string, errnum);
error (_("%s."), combined.c_str ());
}
#if defined (USE_WIN32API) || defined(__CYGWIN__)
/* See errors.h. */

View File

@ -83,11 +83,18 @@ extern void internal_vwarning (const char *file, int line,
ATTRIBUTE_PRINTF (3, 0);
/* Like "error", but the error message is constructed by combining
STRING with the system error message for errno. This function does
not return. This function must be provided by the client. */
/* Return a newly allocated string, containing the PREFIX followed
by the system error message for errno (separated by a colon).
If ERRNUM is given, then use it in place of errno. */
extern void perror_with_name (const char *string) ATTRIBUTE_NORETURN;
extern std::string perror_string (const char *prefix, int errnum = 0);
/* Like "error", but the error message is constructed by combining
STRING with the system error message for errno. If ERRNUM is given,
then use it in place of errno. This function does not return. */
extern void perror_with_name (const char *string, int errnum = 0)
ATTRIBUTE_NORETURN;
/* Call this function to handle memory allocation failures. This
function does not return. This function must be provided by the