Luiz Capitulino <lcapitul...@redhat.com> writes: > 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 EDOM: > + return "EDOM"; > + case ERANGE: > + return "ERANGE"; > + case ENOMEDIUM: > + return "ENOMEDIUM"; > + case ENOTSUP: > + return "ENOTSUP"; > + default: > + return "unknown";
How did you choose the codes to implement? POSIX has many more... > + } > + > + 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