From 92100f14c3b054903053559ed831a1b25033046c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 12 Jul 2024 16:27:25 +0200 Subject: [PATCH] libsystemd: use C23 explicit enum types where available In C23 we can explicitly choose the integer type for an enum. Let's do so to make our requirements for 64bit integers explicitly. Previously, we'd rely on a GNU extension that would size the enum to 64bit if at least one value outside the 32bit range is in the enum. Let's keep that too, for compat with older compilers. (Also, add the support for older compilers to the definition of sd_json_dispatch_flags_t, where it was forgotten so far) --- src/systemd/_sd-common.h | 7 +++++++ src/systemd/sd-device.h | 2 +- src/systemd/sd-dhcp-lease.h | 2 +- src/systemd/sd-json.h | 11 ++++++----- src/systemd/sd-lldp-rx.h | 2 +- src/systemd/sd-lldp-tx.h | 2 +- src/systemd/sd-ndisc.h | 2 +- src/systemd/sd-varlink-idl.h | 10 +++++----- src/systemd/sd-varlink.h | 8 ++++---- 9 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/systemd/_sd-common.h b/src/systemd/_sd-common.h index d4381d90f4a..dbe9fa035e7 100644 --- a/src/systemd/_sd-common.h +++ b/src/systemd/_sd-common.h @@ -105,4 +105,11 @@ typedef void (*_sd_destroy_t)(void *userdata); _SD_##id##_INT64_MIN = INT64_MIN, \ _SD_##id##_INT64_MAX = INT64_MAX +/* In GCC 14 (C23) we can force enums to have the right types, and not solely rely on language extensions anymore */ +#if ((__GNUC__ >= 14) || (__STDC_VERSION__ >= 202311L)) && !defined(__cplusplus) +# define _SD_ENUM_TYPE_S64(id) id : int64_t +#else +# define _SD_ENUM_TYPE_S64(id) id +#endif + #endif diff --git a/src/systemd/sd-device.h b/src/systemd/sd-device.h index d9af181c8a1..4a14c394573 100644 --- a/src/systemd/sd-device.h +++ b/src/systemd/sd-device.h @@ -34,7 +34,7 @@ typedef struct sd_device sd_device; typedef struct sd_device_enumerator sd_device_enumerator; typedef struct sd_device_monitor sd_device_monitor; -__extension__ typedef enum sd_device_action_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_device_action_t) { SD_DEVICE_ADD, SD_DEVICE_REMOVE, SD_DEVICE_CHANGE, diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index 95b0dfef22c..eb5970e405a 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -36,7 +36,7 @@ typedef struct sd_dhcp_route sd_dhcp_route; sd_dhcp_lease *sd_dhcp_lease_ref(sd_dhcp_lease *lease); sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease); -__extension__ typedef enum sd_dhcp_lease_server_type_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_dhcp_lease_server_type_t) { SD_DHCP_LEASE_DNS, SD_DHCP_LEASE_NTP, SD_DHCP_LEASE_SIP, diff --git a/src/systemd/sd-json.h b/src/systemd/sd-json.h index 36cc08caa12..fb796f0fa8e 100644 --- a/src/systemd/sd-json.h +++ b/src/systemd/sd-json.h @@ -58,7 +58,7 @@ _SD_BEGIN_DECLARATIONS; typedef struct sd_json_variant sd_json_variant; -__extension__ typedef enum sd_json_variant_type_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_json_variant_type_t) { SD_JSON_VARIANT_STRING, SD_JSON_VARIANT_INTEGER, SD_JSON_VARIANT_UNSIGNED, @@ -135,7 +135,7 @@ int sd_json_variant_is_sensitive_recursive(sd_json_variant *v); int sd_json_variant_get_source(sd_json_variant *v, const char **ret_source, unsigned *ret_line, unsigned *reterr_column); -__extension__ typedef enum sd_json_format_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_json_format_flags_t) { SD_JSON_FORMAT_NEWLINE = 1 << 0, /* suffix with newline */ SD_JSON_FORMAT_PRETTY = 1 << 1, /* add internal whitespace to appeal to human readers */ SD_JSON_FORMAT_PRETTY_AUTO = 1 << 2, /* same, but only if connected to a tty (and JSON_FORMAT_NEWLINE otherwise) */ @@ -182,7 +182,7 @@ int sd_json_variant_merge_objectb(sd_json_variant **v, ...); int sd_json_variant_sort(sd_json_variant **v); int sd_json_variant_normalize(sd_json_variant **v); -__extension__ typedef enum sd_json_parse_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_json_parse_flags_t) { SD_JSON_PARSE_SENSITIVE = 1 << 0, /* mark variant as "sensitive", i.e. something containing secret key material or such */ _SD_ENUM_FORCE_S64(JSON_PARSE_FLAGS) } sd_json_parse_flags_t; @@ -281,7 +281,7 @@ int sd_json_buildv(sd_json_variant **ret, va_list ap); /* A bitmask of flags used by the dispatch logic. Note that this is a combined bit mask, that is generated * from the bit mask originally passed into sd_json_dispatch() and the individual bitmask associated with the * static sd_json_dispatch_field callout entry */ -typedef enum sd_json_dispatch_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_json_dispatch_flags_t) { SD_JSON_PERMISSIVE = 1 << 0, /* Shall parsing errors be considered fatal for this field or object? */ SD_JSON_MANDATORY = 1 << 1, /* Should existence of this property be mandatory? */ SD_JSON_LOG = 1 << 2, /* Should the dispatcher log about errors? */ @@ -291,7 +291,8 @@ typedef enum sd_json_dispatch_flags_t { SD_JSON_RELAX = 1 << 6, /* Use slightly more relaxed validation than usually (similar, for example: relaxed user name checking in json_dispatch_user_group_name()) */ SD_JSON_ALLOW_EXTENSIONS = 1 << 7, /* Subset of JSON_PERMISSIVE: allow additional fields, but no other permissive handling */ SD_JSON_NULLABLE = 1 << 8, /* Allow both specified type and null for this field */ - SD_JSON_REFUSE_NULL = 1 << 9 /* Never allow null, even if type is otherwise not specified */ + SD_JSON_REFUSE_NULL = 1 << 9, /* Never allow null, even if type is otherwise not specified */ + _SD_ENUM_FORCE_S64(JSON_DISPATCH_FLAGS) } sd_json_dispatch_flags_t; typedef int (*sd_json_dispatch_callback_t)(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata); diff --git a/src/systemd/sd-lldp-rx.h b/src/systemd/sd-lldp-rx.h index a7e1a9f3762..51b9f394820 100644 --- a/src/systemd/sd-lldp-rx.h +++ b/src/systemd/sd-lldp-rx.h @@ -32,7 +32,7 @@ _SD_BEGIN_DECLARATIONS; typedef struct sd_lldp_rx sd_lldp_rx; typedef struct sd_lldp_neighbor sd_lldp_neighbor; -__extension__ typedef enum sd_lldp_rx_event_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_lldp_rx_event_t) { SD_LLDP_RX_EVENT_ADDED, SD_LLDP_RX_EVENT_REMOVED, SD_LLDP_RX_EVENT_UPDATED, diff --git a/src/systemd/sd-lldp-tx.h b/src/systemd/sd-lldp-tx.h index 2eeb6b654f0..c97684852ee 100644 --- a/src/systemd/sd-lldp-tx.h +++ b/src/systemd/sd-lldp-tx.h @@ -31,7 +31,7 @@ _SD_BEGIN_DECLARATIONS; typedef struct sd_lldp_tx sd_lldp_tx; -__extension__ typedef enum sd_lldp_multicast_mode_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_lldp_multicast_mode_t) { SD_LLDP_MULTICAST_MODE_NEAREST_BRIDGE, SD_LLDP_MULTICAST_MODE_NON_TPMR_BRIDGE, SD_LLDP_MULTICAST_MODE_CUSTOMER_BRIDGE, diff --git a/src/systemd/sd-ndisc.h b/src/systemd/sd-ndisc.h index cce592f9e38..85fcf6bc030 100644 --- a/src/systemd/sd-ndisc.h +++ b/src/systemd/sd-ndisc.h @@ -37,7 +37,7 @@ _SD_BEGIN_DECLARATIONS; typedef struct sd_ndisc sd_ndisc; -__extension__ typedef enum sd_ndisc_event_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_ndisc_event_t) { SD_NDISC_EVENT_TIMEOUT, SD_NDISC_EVENT_ROUTER, SD_NDISC_EVENT_NEIGHBOR, diff --git a/src/systemd/sd-varlink-idl.h b/src/systemd/sd-varlink-idl.h index af36f3daf9c..d1c3764c7bb 100644 --- a/src/systemd/sd-varlink-idl.h +++ b/src/systemd/sd-varlink-idl.h @@ -34,7 +34,7 @@ _SD_BEGIN_DECLARATIONS; * format on-the-fly. Can also parse the textual format back to C structures. Validates the interface * definitions for internal consistency and validates JSON objects against the interface definitions. */ -__extension__ typedef enum sd_varlink_symbol_type_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_symbol_type_t) { SD_VARLINK_ENUM_TYPE, SD_VARLINK_STRUCT_TYPE, SD_VARLINK_METHOD, @@ -46,7 +46,7 @@ __extension__ typedef enum sd_varlink_symbol_type_t { _SD_ENUM_FORCE_S64(SD_VARLINK_SYMBOL) } sd_varlink_symbol_type_t; -__extension__ typedef enum sd_varlink_field_type_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_field_type_t) { _SD_VARLINK_FIELD_TYPE_END_MARKER = 0, /* zero type means: this is the last entry in the fields[] array of VarlinkSymbol */ SD_VARLINK_STRUCT, SD_VARLINK_ENUM, @@ -63,7 +63,7 @@ __extension__ typedef enum sd_varlink_field_type_t { _SD_ENUM_FORCE_S64(SD_VARLINK_FIELD) } sd_varlink_field_type_t; -__extension__ typedef enum sd_varlink_field_direction_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_field_direction_t) { SD_VARLINK_REGULAR, SD_VARLINK_INPUT, SD_VARLINK_OUTPUT, @@ -72,7 +72,7 @@ __extension__ typedef enum sd_varlink_field_direction_t { _SD_ENUM_FORCE_S64(SD_VARLINK_FIELD_DIRECTION) } sd_varlink_field_direction_t; -__extension__ typedef enum sd_varlink_field_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_field_flags_t) { SD_VARLINK_ARRAY = 1 << 0, SD_VARLINK_MAP = 1 << 1, SD_VARLINK_NULLABLE = 1 << 2, @@ -189,7 +189,7 @@ struct sd_varlink_interface { .symbol_type = _SD_VARLINK_INTERFACE_COMMENT, \ } -__extension__ typedef enum sd_varlink_idl_format_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_idl_format_flags_t) { SD_VARLINK_IDL_FORMAT_COLOR = 1 << 0, SD_VARLINK_IDL_FORMAT_COLOR_AUTO = 1 << 1, _SD_ENUM_FORCE_S64(SD_VARLINK_IDL_FORMAT) diff --git a/src/systemd/sd-varlink.h b/src/systemd/sd-varlink.h index f93756ef529..4c943d5389d 100644 --- a/src/systemd/sd-varlink.h +++ b/src/systemd/sd-varlink.h @@ -51,20 +51,20 @@ _SD_BEGIN_DECLARATIONS; typedef struct sd_varlink sd_varlink; typedef struct sd_varlink_server sd_varlink_server; -__extension__ typedef enum sd_varlink_reply_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_reply_flags_t) { SD_VARLINK_REPLY_ERROR = 1 << 0, SD_VARLINK_REPLY_CONTINUES = 1 << 1, SD_VARLINK_REPLY_LOCAL = 1 << 2, _SD_ENUM_FORCE_S64(SD_VARLINK_REPLY) } sd_varlink_reply_flags_t; -__extension__ typedef enum sd_varlink_method_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_method_flags_t) { SD_VARLINK_METHOD_ONEWAY = 1 << 0, SD_VARLINK_METHOD_MORE = 1 << 1, _SD_ENUM_FORCE_S64(SD_VARLINK_METHOD) } sd_varlink_method_flags_t; -__extension__ typedef enum sd_varlink_server_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_server_flags_t) { SD_VARLINK_SERVER_ROOT_ONLY = 1 << 0, /* Only accessible by root */ SD_VARLINK_SERVER_MYSELF_ONLY = 1 << 1, /* Only accessible by our own UID */ SD_VARLINK_SERVER_ACCOUNT_UID = 1 << 2, /* Do per user accounting */ @@ -73,7 +73,7 @@ __extension__ typedef enum sd_varlink_server_flags_t { _SD_ENUM_FORCE_S64(SD_VARLINK_SERVER) } sd_varlink_server_flags_t; -__extension__ typedef enum sd_varlink_invocation_flags_t { +__extension__ typedef enum _SD_ENUM_TYPE_S64(sd_varlink_invocation_flags_t) { SD_VARLINK_ALLOW_LISTEN = 1 << 0, SD_VARLINK_ALLOW_ACCEPT = 1 << 1, _SD_ENUM_FORCE_S64(SD_VARLINK_INVOCATION) -- 2.47.3