]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
libsystemd: use C23 explicit enum types where available
authorLennart Poettering <lennart@poettering.net>
Fri, 12 Jul 2024 14:27:25 +0000 (16:27 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Jul 2024 09:57:32 +0000 (11:57 +0200)
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
src/systemd/sd-device.h
src/systemd/sd-dhcp-lease.h
src/systemd/sd-json.h
src/systemd/sd-lldp-rx.h
src/systemd/sd-lldp-tx.h
src/systemd/sd-ndisc.h
src/systemd/sd-varlink-idl.h
src/systemd/sd-varlink.h

index d4381d90f4a44eb7e232c5139376dc28d6a1ec22..dbe9fa035e7e12ba69373f6baaf041fa30016085 100644 (file)
@@ -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
index d9af181c8a1c1277850ab05e32bd8de17539385c..4a14c39457399ee5e2efd4ca0fa99d438f180b42 100644 (file)
@@ -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,
index 95b0dfef22c098cff5c4c2e57cfcb5e3fb6ec2a9..eb5970e405a8868cecbd053026511272c7924539 100644 (file)
@@ -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,
index 36cc08caa128a23b8d7a0296920b24148e3822ca..fb796f0fa8e5c937372103d1045b6daa94c32e6d 100644 (file)
@@ -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);
index a7e1a9f3762d5666fa9f1a77f299dd6ec6b5b95a..51b9f394820016be1481a77d74b255e5c4ee23d8 100644 (file)
@@ -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,
index 2eeb6b654f055d6e3739f8e16c6a39c7fa3fb0ee..c97684852ee58e0eb92fe58f030773e3a0d9cac8 100644 (file)
@@ -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,
index cce592f9e38d2bda1c85617c925e00a21782e0c9..85fcf6bc030677dcadcf6e26cd5c815a4cb8e6e2 100644 (file)
@@ -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,
index af36f3daf9c49f626e6d461b3aad2888d1ac6968..d1c3764c7bb2078f70b2c6a006adf9917010904b 100644 (file)
@@ -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)
index f93756ef52937dcfa9eff5d6167a9c10d19bc212..4c943d5389d2efb6e88a285c759bafc7e8dc7e2d 100644 (file)
@@ -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)