_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
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,
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,
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,
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) */
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;
/* 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? */
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);
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,
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,
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,
* 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,
_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,
_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,
_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,
.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)
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 */
_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)