mirror of
https://github.com/systemd/systemd.git
synced 2024-12-17 22:23:39 +08:00
bus: use gperf to map error string to errno
This commit is contained in:
parent
6241164b73
commit
0b6c04bb45
@ -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)
|
||||
|
||||
|
1
src/libsystemd-bus/.gitignore
vendored
1
src/libsystemd-bus/.gitignore
vendored
@ -1 +1,2 @@
|
||||
/libsystemd-bus.pc
|
||||
/bus-error-mapping.c
|
||||
|
49
src/libsystemd-bus/bus-error-mapping.gperf
Normal file
49
src/libsystemd-bus/bus-error-mapping.gperf
Normal 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
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user