bus: use gperf to map error string to errno

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2013-12-15 20:35:22 -05:00
parent 6241164b73
commit 0b6c04bb45
5 changed files with 69 additions and 75 deletions

View File

@ -2024,6 +2024,9 @@ libsystemd_bus_la_SOURCES = \
src/libsystemd-bus/event-util.h \
src/libsystemd-bus/bus-protocol.h
nodist_libsystemd_bus_la_SOURCES = \
src/libsystemd-bus/bus-error-mapping.c
libsystemd_bus_la_LIBADD = \
libsystemd-id128-internal.la \
libsystemd-daemon-internal.la \
@ -2042,6 +2045,7 @@ pkgconfiglib_DATA += \
src/libsystemd-bus/libsystemd-bus.pc
EXTRA_DIST += \
src/libsystemd-bus/bus-error-mapping.gperf \
src/libsystemd-bus/libsystemd-bus.pc.in \
src/libsystemd-bus/DIFFERENCES \
src/libsystemd-bus/GVARIANT-SERIALIZATION
@ -2052,6 +2056,9 @@ lib_LTLIBRARIES += \
libsystemd_bus_internal_la_SOURCES = \
$(libsystemd_bus_la_SOURCES)
nodist_libsystemd_bus_internal_la_SOURCES = \
$(nodist_libsystemd_bus_la_SOURCES)
libsystemd_bus_internal_la_CFLAGS = \
$(libsystemd_bus_la_CFLAGS)

View File

@ -1 +1,2 @@
/libsystemd-bus.pc
/bus-error-mapping.c

View File

@ -0,0 +1,49 @@
%{
#include <errno.h>
#include "bus-error.h"
%}
name_error_mapping;
%null_strings
%language=ANSI-C
%define slot-name name
%define hash-function-name bus_error_mapping_hash
%define lookup-function-name bus_error_mapping_lookup
%readonly-tables
%omit-struct-type
%struct-type
%includes
%%
org.freedesktop.DBus.Error.Failed, EACCES
org.freedesktop.DBus.Error.NoMemory, ENOMEM
org.freedesktop.DBus.Error.ServiceUnknown, EHOSTUNREACH
org.freedesktop.DBus.Error.NameHasNoOwner, ENXIO
org.freedesktop.DBus.Error.NoReply, ETIMEDOUT
org.freedesktop.DBus.Error.IOError, EIO
org.freedesktop.DBus.Error.BadAddress, EADDRNOTAVAIL
org.freedesktop.DBus.Error.NotSupported, ENOTSUP
org.freedesktop.DBus.Error.LimitsExceeded, ENOBUFS
org.freedesktop.DBus.Error.AccessDenied, EACCES
org.freedesktop.DBus.Error.AuthFailed, EACCES
org.freedesktop.DBus.Error.NoServer, EHOSTDOWN
org.freedesktop.DBus.Error.Timeout, ETIMEDOUT
org.freedesktop.DBus.Error.NoNetwork, ENONET
org.freedesktop.DBus.Error.AddressInUse, EADDRINUSE
org.freedesktop.DBus.Error.Disconnected, ECONNRESET
org.freedesktop.DBus.Error.InvalidArgs, EINVAL
org.freedesktop.DBus.Error.FileNotFound, ENOENT
org.freedesktop.DBus.Error.FileExists, EEXIST
org.freedesktop.DBus.Error.UnknownMethod, EBADR
org.freedesktop.DBus.Error.UnknownObject, EBADR
org.freedesktop.DBus.Error.UnknownInterface, EBADR
org.freedesktop.DBus.Error.UnknownProperty, EBADR
org.freedesktop.DBus.Error.PropertyReadOnly, EROFS
org.freedesktop.DBus.Error.UnixProcessIdUnknown, ESRCH
org.freedesktop.DBus.Error.InvalidSignature, EINVAL
org.freedesktop.DBus.Error.InconsistentMessage, EBADMSG
#
org.freedesktop.DBus.Error.TimedOut, ETIMEDOUT
org.freedesktop.DBus.Error.MatchRuleInvalid, EINVAL
org.freedesktop.DBus.Error.InvalidFileContent, EINVAL
org.freedesktop.DBus.Error.MatchRuleNotFound, ENOENT
org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown, ESRCH
org.freedesktop.DBus.Error.ObjectPathInUse, EBUSY

View File

@ -38,6 +38,7 @@
static int bus_error_name_to_errno(const char *name) {
const char *p;
int r;
const name_error_mapping *m;
if (!name)
return EINVAL;
@ -51,81 +52,9 @@ static int bus_error_name_to_errno(const char *name) {
return r;
}
/* Better replace this with a gperf table */
if (streq(name, SD_BUS_ERROR_NO_MEMORY))
return ENOMEM;
if (streq(name, SD_BUS_ERROR_SERVICE_UNKNOWN))
return EHOSTUNREACH;
if (streq(name, SD_BUS_ERROR_NAME_HAS_NO_OWNER))
return ENXIO;
if (streq(name, SD_BUS_ERROR_NO_REPLY) ||
streq(name, SD_BUS_ERROR_TIMEOUT) ||
streq(name, "org.freedesktop.DBus.Error.TimedOut"))
return ETIMEDOUT;
if (streq(name, SD_BUS_ERROR_IO_ERROR))
return EIO;
if (streq(name, SD_BUS_ERROR_BAD_ADDRESS))
return EADDRNOTAVAIL;
if (streq(name, SD_BUS_ERROR_NOT_SUPPORTED))
return ENOTSUP;
if (streq(name, SD_BUS_ERROR_LIMITS_EXCEEDED))
return ENOBUFS;
if (streq(name, SD_BUS_ERROR_ACCESS_DENIED) ||
streq(name, SD_BUS_ERROR_AUTH_FAILED))
return EACCES;
if (streq(name, SD_BUS_ERROR_NO_SERVER))
return EHOSTDOWN;
if (streq(name, SD_BUS_ERROR_NO_NETWORK))
return ENONET;
if (streq(name, SD_BUS_ERROR_ADDRESS_IN_USE))
return EADDRINUSE;
if (streq(name, SD_BUS_ERROR_DISCONNECTED))
return ECONNRESET;
if (streq(name, SD_BUS_ERROR_INVALID_ARGS) ||
streq(name, SD_BUS_ERROR_INVALID_SIGNATURE) ||
streq(name, "org.freedesktop.DBus.Error.MatchRuleInvalid") ||
streq(name, "org.freedesktop.DBus.Error.InvalidFileContent"))
return EINVAL;
if (streq(name, SD_BUS_ERROR_FILE_NOT_FOUND) ||
streq(name, "org.freedesktop.DBus.Error.MatchRuleNotFound"))
return ENOENT;
if (streq(name, SD_BUS_ERROR_FILE_EXISTS))
return EEXIST;
if (streq(name, SD_BUS_ERROR_UNKNOWN_METHOD) ||
streq(name, SD_BUS_ERROR_UNKNOWN_OBJECT) ||
streq(name, SD_BUS_ERROR_UNKNOWN_INTERFACE) ||
streq(name, SD_BUS_ERROR_UNKNOWN_PROPERTY))
return EBADR;
if (streq(name, SD_BUS_ERROR_PROPERTY_READ_ONLY))
return EROFS;
if (streq(name, SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN) ||
streq(name, "org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown"))
return ESRCH;
if (streq(name, SD_BUS_ERROR_INCONSISTENT_MESSAGE))
return EBADMSG;
if (streq(name, "org.freedesktop.DBus.Error.ObjectPathInUse"))
return EBUSY;
m = bus_error_mapping_lookup(name, strlen(name));
if (m)
return m->code;
return EIO;
}

View File

@ -26,6 +26,14 @@
#include "sd-bus.h"
#include "macro.h"
struct name_error_mapping {
const char* name;
int code;
};
typedef struct name_error_mapping name_error_mapping;
const name_error_mapping* bus_error_mapping_lookup(const char *str, unsigned int len);
bool bus_error_is_dirty(sd_bus_error *e);
const char *bus_error_message(const sd_bus_error *e, int error);