error: add error_set_errno and error_setg_errno
These functions help maintaining homogeneous formatting of error messages that include strerror values. Acked-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
da124e62de
commit
680d16dcb7
28
error.c
28
error.c
@ -43,6 +43,34 @@ void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
|
|||||||
*errp = err;
|
*errp = err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void error_set_errno(Error **errp, int os_errno, ErrorClass err_class,
|
||||||
|
const char *fmt, ...)
|
||||||
|
{
|
||||||
|
Error *err;
|
||||||
|
char *msg1;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
if (errp == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
assert(*errp == NULL);
|
||||||
|
|
||||||
|
err = g_malloc0(sizeof(*err));
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
msg1 = g_strdup_vprintf(fmt, ap);
|
||||||
|
if (os_errno != 0) {
|
||||||
|
err->msg = g_strdup_printf("%s: %s", msg1, strerror(os_errno));
|
||||||
|
g_free(msg1);
|
||||||
|
} else {
|
||||||
|
err->msg = msg1;
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
err->err_class = err_class;
|
||||||
|
|
||||||
|
*errp = err;
|
||||||
|
}
|
||||||
|
|
||||||
Error *error_copy(const Error *err)
|
Error *error_copy(const Error *err)
|
||||||
{
|
{
|
||||||
Error *err_new;
|
Error *err_new;
|
||||||
|
9
error.h
9
error.h
@ -29,11 +29,20 @@ typedef struct Error Error;
|
|||||||
*/
|
*/
|
||||||
void error_set(Error **err, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(3, 4);
|
void error_set(Error **err, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(3, 4);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an indirect pointer to an error given a ErrorClass value and a
|
||||||
|
* printf-style human message, followed by a strerror() string if
|
||||||
|
* @os_error is not zero.
|
||||||
|
*/
|
||||||
|
void error_set_errno(Error **err, int os_error, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(4, 5);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Same as error_set(), but sets a generic error
|
* Same as error_set(), but sets a generic error
|
||||||
*/
|
*/
|
||||||
#define error_setg(err, fmt, ...) \
|
#define error_setg(err, fmt, ...) \
|
||||||
error_set(err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
|
error_set(err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
|
||||||
|
#define error_setg_errno(err, os_error, fmt, ...) \
|
||||||
|
error_set_errno(err, os_error, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if an indirect pointer to an error is pointing to a valid
|
* Returns true if an indirect pointer to an error is pointing to a valid
|
||||||
|
Loading…
Reference in New Issue
Block a user