We need to expose errno in QMP, for three reasons: 1. Some error handling functions print errno codes to the user, while it's debatable whether this is good or not from a user perspective, sometimes it's the best we can do because it's what system calls and libraries return
2. Some events (eg. BLOCK_IO_ERROR) will be made even more complete with errno information 3. It's very good for debugging So, we need a way to expose those codes in QMP. We can't just use the codes themselfs because they may vary between systems. The best solution I can think of is to return the string representation of the name. For example, EIO becomes "EIO". This is what get_errno_name() does. Signed-off-by: Luiz Capitulino <lcapitul...@redhat.com> --- qemu-error.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ qemu-error.h | 1 + 2 files changed, 86 insertions(+), 0 deletions(-) diff --git a/qemu-error.c b/qemu-error.c index 5a35e7c..7035417 100644 --- a/qemu-error.c +++ b/qemu-error.c @@ -207,3 +207,88 @@ void error_report(const char *fmt, ...) va_end(ap); error_printf("\n"); } + +/* + * Probably only useful for QMP + */ +const char *get_errno_name(int err) +{ + switch (abs(err)) { + case EPERM: + return "EPERM"; + case ENOENT: + return "ENOENT"; + case ESRCH: + return "ESRCH"; + case EINTR: + return "EINTR"; + case EIO: + return "EIO"; + case ENXIO: + return "ENXIO"; + case E2BIG: + return "E2BIG"; + case ENOEXEC: + return "ENOEXEC"; + case EBADF: + return "EBADF"; + case ECHILD: + return "ECHILD"; + case EAGAIN: + return "EAGAIN"; + case ENOMEM: + return "ENOMEM"; + case EACCES: + return "EACCES"; + case EFAULT: + return "EFAULT"; + case ENOTBLK: + return "ENOTBLK"; + case EBUSY: + return "EBUSY"; + case EEXIST: + return "EEXIST"; + case EXDEV: + return "EXDEV"; + case ENODEV: + return "ENODEV"; + case ENOTDIR: + return "ENOTDIR"; + case EISDIR: + return "EISDIR"; + case EINVAL: + return "EINVAL"; + case ENFILE: + return "ENFILE"; + case EMFILE: + return "EMFILE"; + case ENOTTY: + return "ENOTTY"; + case ETXTBSY: + return "ETXTBSY"; + case EFBIG: + return "EFBIG"; + case ENOSPC: + return "ENOSPC"; + case ESPIPE: + return "ESPIPE"; + case EROFS: + return "EROFS"; + case EMLINK: + return "EMLINK"; + case EPIPE: + return "EPIPE"; + case EDOM: + return "EDOM"; + case ERANGE: + return "ERANGE"; + case ENOMEDIUM: + return "ENOMEDIUM"; + case ENOTSUP: + return "ENOTSUP"; + default: + return "unknown"; + } + + abort(); +} diff --git a/qemu-error.h b/qemu-error.h index a45609f..c5e39b5 100644 --- a/qemu-error.h +++ b/qemu-error.h @@ -38,4 +38,5 @@ void error_print_loc(void); void error_set_progname(const char *argv0); void error_report(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); +const char *get_errno_name(int err); #endif -- 1.7.1.rc1.12.ga6018