mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-31 14:11:36 +08:00
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:
parent
bad727e2d2
commit
40dfb28b56
36
gdb/utils.c
36
gdb/utils.c
@ -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. */
|
||||
|
||||
|
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user