shared/json: use int64_t instead of intmax_t
We were already asserting that the intmax_t and uintmax_t types are the same as int64_t and uint64_t. Pretty much everywhere in the code base we use the latter types. In principle intmax_t could be something different on some new architecture, and then the code would fail to compile or behave differently. We actually do not want the code to behave differently on those architectures, because that'd break interoperability. So let's just use int64_t/uint64_t since that's what we indend to use.
This commit is contained in:
@@ -12,8 +12,8 @@ typedef union JsonValue {
|
||||
/* Encodes a simple value. This structure is generally 8 bytes wide (as double is 64bit). */
|
||||
bool boolean;
|
||||
double real;
|
||||
intmax_t integer;
|
||||
uintmax_t unsig;
|
||||
int64_t integer;
|
||||
uint64_t unsig;
|
||||
} JsonValue;
|
||||
|
||||
/* Let's protect us against accidental structure size changes on our most relevant arch */
|
||||
|
||||
+41
-41
@@ -305,7 +305,7 @@ static int json_variant_new(JsonVariant **ret, JsonVariantType type, size_t spac
|
||||
return 0;
|
||||
}
|
||||
|
||||
int json_variant_new_integer(JsonVariant **ret, intmax_t i) {
|
||||
int json_variant_new_integer(JsonVariant **ret, int64_t i) {
|
||||
JsonVariant *v;
|
||||
int r;
|
||||
|
||||
@@ -326,7 +326,7 @@ int json_variant_new_integer(JsonVariant **ret, intmax_t i) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int json_variant_new_unsigned(JsonVariant **ret, uintmax_t u) {
|
||||
int json_variant_new_unsigned(JsonVariant **ret, uint64_t u) {
|
||||
JsonVariant *v;
|
||||
int r;
|
||||
|
||||
@@ -751,10 +751,10 @@ static size_t json_variant_size(JsonVariant* v) {
|
||||
return offsetof(JsonVariant, value) + sizeof(double);
|
||||
|
||||
case JSON_VARIANT_UNSIGNED:
|
||||
return offsetof(JsonVariant, value) + sizeof(uintmax_t);
|
||||
return offsetof(JsonVariant, value) + sizeof(uint64_t);
|
||||
|
||||
case JSON_VARIANT_INTEGER:
|
||||
return offsetof(JsonVariant, value) + sizeof(intmax_t);
|
||||
return offsetof(JsonVariant, value) + sizeof(int64_t);
|
||||
|
||||
case JSON_VARIANT_BOOLEAN:
|
||||
return offsetof(JsonVariant, value) + sizeof(bool);
|
||||
@@ -895,7 +895,7 @@ mismatch:
|
||||
return false;
|
||||
}
|
||||
|
||||
intmax_t json_variant_integer(JsonVariant *v) {
|
||||
int64_t json_variant_integer(JsonVariant *v) {
|
||||
if (!v)
|
||||
goto mismatch;
|
||||
if (v == JSON_VARIANT_MAGIC_ZERO_INTEGER ||
|
||||
@@ -913,16 +913,16 @@ intmax_t json_variant_integer(JsonVariant *v) {
|
||||
return v->value.integer;
|
||||
|
||||
case JSON_VARIANT_UNSIGNED:
|
||||
if (v->value.unsig <= INTMAX_MAX)
|
||||
return (intmax_t) v->value.unsig;
|
||||
if (v->value.unsig <= INT64_MAX)
|
||||
return (int64_t) v->value.unsig;
|
||||
|
||||
log_debug("Unsigned integer %ju requested as signed integer and out of range, returning 0.", v->value.unsig);
|
||||
return 0;
|
||||
|
||||
case JSON_VARIANT_REAL: {
|
||||
intmax_t converted;
|
||||
int64_t converted;
|
||||
|
||||
converted = (intmax_t) v->value.real;
|
||||
converted = (int64_t) v->value.real;
|
||||
|
||||
DISABLE_WARNING_FLOAT_EQUAL;
|
||||
if ((double) converted == v->value.real)
|
||||
@@ -942,7 +942,7 @@ mismatch:
|
||||
return 0;
|
||||
}
|
||||
|
||||
uintmax_t json_variant_unsigned(JsonVariant *v) {
|
||||
uint64_t json_variant_unsigned(JsonVariant *v) {
|
||||
if (!v)
|
||||
goto mismatch;
|
||||
if (v == JSON_VARIANT_MAGIC_ZERO_INTEGER ||
|
||||
@@ -958,7 +958,7 @@ uintmax_t json_variant_unsigned(JsonVariant *v) {
|
||||
|
||||
case JSON_VARIANT_INTEGER:
|
||||
if (v->value.integer >= 0)
|
||||
return (uintmax_t) v->value.integer;
|
||||
return (uint64_t) v->value.integer;
|
||||
|
||||
log_debug("Signed integer %ju requested as unsigned integer and out of range, returning 0.", v->value.integer);
|
||||
return 0;
|
||||
@@ -967,9 +967,9 @@ uintmax_t json_variant_unsigned(JsonVariant *v) {
|
||||
return v->value.unsig;
|
||||
|
||||
case JSON_VARIANT_REAL: {
|
||||
uintmax_t converted;
|
||||
uint64_t converted;
|
||||
|
||||
converted = (uintmax_t) v->value.real;
|
||||
converted = (uint64_t) v->value.real;
|
||||
|
||||
DISABLE_WARNING_FLOAT_EQUAL;
|
||||
if ((double) converted == v->value.real)
|
||||
@@ -1009,7 +1009,7 @@ double json_variant_real(JsonVariant *v) {
|
||||
case JSON_VARIANT_INTEGER: {
|
||||
double converted = (double) v->value.integer;
|
||||
|
||||
if ((intmax_t) converted == v->value.integer)
|
||||
if ((int64_t) converted == v->value.integer)
|
||||
return converted;
|
||||
|
||||
log_debug("Signed integer %ji requested as real, and cannot be converted losslessly, returning 0.", v->value.integer);
|
||||
@@ -1019,7 +1019,7 @@ double json_variant_real(JsonVariant *v) {
|
||||
case JSON_VARIANT_UNSIGNED: {
|
||||
double converted = (double) v->value.unsig;
|
||||
|
||||
if ((uintmax_t) converted == v->value.unsig)
|
||||
if ((uint64_t) converted == v->value.unsig)
|
||||
return converted;
|
||||
|
||||
log_debug("Unsigned integer %ju requested as real, and cannot be converted losslessly, returning 0.", v->value.unsig);
|
||||
@@ -1155,21 +1155,21 @@ bool json_variant_has_type(JsonVariant *v, JsonVariantType type) {
|
||||
if (rt == JSON_VARIANT_INTEGER && type == JSON_VARIANT_UNSIGNED)
|
||||
return v->value.integer >= 0;
|
||||
if (rt == JSON_VARIANT_UNSIGNED && type == JSON_VARIANT_INTEGER)
|
||||
return v->value.unsig <= INTMAX_MAX;
|
||||
return v->value.unsig <= INT64_MAX;
|
||||
|
||||
/* Any integer that can be converted lossley to a real and back may also be considered a real */
|
||||
if (rt == JSON_VARIANT_INTEGER && type == JSON_VARIANT_REAL)
|
||||
return (intmax_t) (double) v->value.integer == v->value.integer;
|
||||
return (int64_t) (double) v->value.integer == v->value.integer;
|
||||
if (rt == JSON_VARIANT_UNSIGNED && type == JSON_VARIANT_REAL)
|
||||
return (uintmax_t) (double) v->value.unsig == v->value.unsig;
|
||||
return (uint64_t) (double) v->value.unsig == v->value.unsig;
|
||||
|
||||
DISABLE_WARNING_FLOAT_EQUAL;
|
||||
|
||||
/* Any real that can be converted losslessly to an integer and back may also be considered an integer */
|
||||
if (rt == JSON_VARIANT_REAL && type == JSON_VARIANT_INTEGER)
|
||||
return (double) (intmax_t) v->value.real == v->value.real;
|
||||
return (double) (int64_t) v->value.real == v->value.real;
|
||||
if (rt == JSON_VARIANT_REAL && type == JSON_VARIANT_UNSIGNED)
|
||||
return (double) (uintmax_t) v->value.real == v->value.real;
|
||||
return (double) (uint64_t) v->value.real == v->value.real;
|
||||
|
||||
REENABLE_WARNING;
|
||||
|
||||
@@ -1961,7 +1961,7 @@ int json_variant_set_field_string(JsonVariant **v, const char *field, const char
|
||||
return json_variant_set_field(v, field, m);
|
||||
}
|
||||
|
||||
int json_variant_set_field_integer(JsonVariant **v, const char *field, intmax_t i) {
|
||||
int json_variant_set_field_integer(JsonVariant **v, const char *field, int64_t i) {
|
||||
_cleanup_(json_variant_unrefp) JsonVariant *m = NULL;
|
||||
int r;
|
||||
|
||||
@@ -1972,7 +1972,7 @@ int json_variant_set_field_integer(JsonVariant **v, const char *field, intmax_t
|
||||
return json_variant_set_field(v, field, m);
|
||||
}
|
||||
|
||||
int json_variant_set_field_unsigned(JsonVariant **v, const char *field, uintmax_t u) {
|
||||
int json_variant_set_field_unsigned(JsonVariant **v, const char *field, uint64_t u) {
|
||||
_cleanup_(json_variant_unrefp) JsonVariant *m = NULL;
|
||||
int r;
|
||||
|
||||
@@ -2189,13 +2189,13 @@ static int json_variant_copy(JsonVariant **nv, JsonVariant *v) {
|
||||
t = json_variant_type(v);
|
||||
switch (t) {
|
||||
case JSON_VARIANT_INTEGER:
|
||||
k = sizeof(intmax_t);
|
||||
k = sizeof(int64_t);
|
||||
value.integer = json_variant_integer(v);
|
||||
source = &value;
|
||||
break;
|
||||
|
||||
case JSON_VARIANT_UNSIGNED:
|
||||
k = sizeof(uintmax_t);
|
||||
k = sizeof(uint64_t);
|
||||
value.unsig = json_variant_unsigned(v);
|
||||
source = &value;
|
||||
break;
|
||||
@@ -2525,8 +2525,8 @@ static int json_parse_string(const char **p, char **ret) {
|
||||
static int json_parse_number(const char **p, JsonValue *ret) {
|
||||
bool negative = false, exponent_negative = false, is_real = false;
|
||||
double x = 0.0, y = 0.0, exponent = 0.0, shift = 1.0;
|
||||
intmax_t i = 0;
|
||||
uintmax_t u = 0;
|
||||
int64_t i = 0;
|
||||
uint64_t u = 0;
|
||||
const char *c;
|
||||
|
||||
assert(p);
|
||||
@@ -2550,23 +2550,23 @@ static int json_parse_number(const char **p, JsonValue *ret) {
|
||||
if (!is_real) {
|
||||
if (negative) {
|
||||
|
||||
if (i < INTMAX_MIN / 10) /* overflow */
|
||||
if (i < INT64_MIN / 10) /* overflow */
|
||||
is_real = true;
|
||||
else {
|
||||
intmax_t t = 10 * i;
|
||||
int64_t t = 10 * i;
|
||||
|
||||
if (t < INTMAX_MIN + (*c - '0')) /* overflow */
|
||||
if (t < INT64_MIN + (*c - '0')) /* overflow */
|
||||
is_real = true;
|
||||
else
|
||||
i = t - (*c - '0');
|
||||
}
|
||||
} else {
|
||||
if (u > UINTMAX_MAX / 10) /* overflow */
|
||||
if (u > UINT64_MAX / 10) /* overflow */
|
||||
is_real = true;
|
||||
else {
|
||||
uintmax_t t = 10 * u;
|
||||
uint64_t t = 10 * u;
|
||||
|
||||
if (t > UINTMAX_MAX - (*c - '0')) /* overflow */
|
||||
if (t > UINT64_MAX - (*c - '0')) /* overflow */
|
||||
is_real = true;
|
||||
else
|
||||
u = t + (*c - '0');
|
||||
@@ -3288,14 +3288,14 @@ int json_buildv(JsonVariant **ret, va_list ap) {
|
||||
}
|
||||
|
||||
case _JSON_BUILD_INTEGER: {
|
||||
intmax_t j;
|
||||
int64_t j;
|
||||
|
||||
if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) {
|
||||
r = -EINVAL;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
j = va_arg(ap, intmax_t);
|
||||
j = va_arg(ap, int64_t);
|
||||
|
||||
if (current->n_suppress == 0) {
|
||||
r = json_variant_new_integer(&add, j);
|
||||
@@ -3316,14 +3316,14 @@ int json_buildv(JsonVariant **ret, va_list ap) {
|
||||
}
|
||||
|
||||
case _JSON_BUILD_UNSIGNED: {
|
||||
uintmax_t j;
|
||||
uint64_t j;
|
||||
|
||||
if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) {
|
||||
r = -EINVAL;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
j = va_arg(ap, uintmax_t);
|
||||
j = va_arg(ap, uint64_t);
|
||||
|
||||
if (current->n_suppress == 0) {
|
||||
r = json_variant_new_unsigned(&add, j);
|
||||
@@ -4064,8 +4064,8 @@ int json_dispatch_tristate(const char *name, JsonVariant *variant, JsonDispatchF
|
||||
return 0;
|
||||
}
|
||||
|
||||
int json_dispatch_intmax(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
intmax_t *i = userdata;
|
||||
int json_dispatch_int64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
int64_t *i = userdata;
|
||||
|
||||
assert(variant);
|
||||
assert(i);
|
||||
@@ -4077,8 +4077,8 @@ int json_dispatch_intmax(const char *name, JsonVariant *variant, JsonDispatchFla
|
||||
return 0;
|
||||
}
|
||||
|
||||
int json_dispatch_uintmax(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
uintmax_t *u = userdata;
|
||||
int json_dispatch_uint64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
uint64_t *u = userdata;
|
||||
|
||||
assert(variant);
|
||||
assert(u);
|
||||
@@ -4228,7 +4228,7 @@ int json_dispatch_variant(const char *name, JsonVariant *variant, JsonDispatchFl
|
||||
|
||||
int json_dispatch_uid_gid(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
uid_t *uid = userdata;
|
||||
uintmax_t k;
|
||||
uint64_t k;
|
||||
|
||||
assert_cc(sizeof(uid_t) == sizeof(uint32_t));
|
||||
assert_cc(sizeof(gid_t) == sizeof(uint32_t));
|
||||
|
||||
+10
-16
@@ -59,8 +59,8 @@ typedef enum JsonVariantType {
|
||||
int json_variant_new_stringn(JsonVariant **ret, const char *s, size_t n);
|
||||
int json_variant_new_base64(JsonVariant **ret, const void *p, size_t n);
|
||||
int json_variant_new_hex(JsonVariant **ret, const void *p, size_t n);
|
||||
int json_variant_new_integer(JsonVariant **ret, intmax_t i);
|
||||
int json_variant_new_unsigned(JsonVariant **ret, uintmax_t u);
|
||||
int json_variant_new_integer(JsonVariant **ret, int64_t i);
|
||||
int json_variant_new_unsigned(JsonVariant **ret, uint64_t u);
|
||||
int json_variant_new_real(JsonVariant **ret, double d);
|
||||
int json_variant_new_boolean(JsonVariant **ret, bool b);
|
||||
int json_variant_new_array(JsonVariant **ret, JsonVariant **array, size_t n);
|
||||
@@ -81,8 +81,8 @@ void json_variant_unref_many(JsonVariant **array, size_t n);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(JsonVariant *, json_variant_unref);
|
||||
|
||||
const char *json_variant_string(JsonVariant *v);
|
||||
intmax_t json_variant_integer(JsonVariant *v);
|
||||
uintmax_t json_variant_unsigned(JsonVariant *v);
|
||||
int64_t json_variant_integer(JsonVariant *v);
|
||||
uint64_t json_variant_unsigned(JsonVariant *v);
|
||||
double json_variant_real(JsonVariant *v);
|
||||
bool json_variant_boolean(JsonVariant *v);
|
||||
|
||||
@@ -189,8 +189,8 @@ int json_variant_filter(JsonVariant **v, char **to_remove);
|
||||
|
||||
int json_variant_set_field(JsonVariant **v, const char *field, JsonVariant *value);
|
||||
int json_variant_set_field_string(JsonVariant **v, const char *field, const char *value);
|
||||
int json_variant_set_field_integer(JsonVariant **v, const char *field, intmax_t value);
|
||||
int json_variant_set_field_unsigned(JsonVariant **v, const char *field, uintmax_t value);
|
||||
int json_variant_set_field_integer(JsonVariant **v, const char *field, int64_t value);
|
||||
int json_variant_set_field_unsigned(JsonVariant **v, const char *field, uint64_t value);
|
||||
int json_variant_set_field_boolean(JsonVariant **v, const char *field, bool b);
|
||||
int json_variant_set_field_strv(JsonVariant **v, const char *field, char **l);
|
||||
|
||||
@@ -240,8 +240,8 @@ enum {
|
||||
};
|
||||
|
||||
#define JSON_BUILD_STRING(s) _JSON_BUILD_STRING, (const char*) { s }
|
||||
#define JSON_BUILD_INTEGER(i) _JSON_BUILD_INTEGER, (intmax_t) { i }
|
||||
#define JSON_BUILD_UNSIGNED(u) _JSON_BUILD_UNSIGNED, (uintmax_t) { u }
|
||||
#define JSON_BUILD_INTEGER(i) _JSON_BUILD_INTEGER, (int64_t) { i }
|
||||
#define JSON_BUILD_UNSIGNED(u) _JSON_BUILD_UNSIGNED, (uint64_t) { u }
|
||||
#define JSON_BUILD_REAL(d) _JSON_BUILD_REAL, (double) { d }
|
||||
#define JSON_BUILD_BOOLEAN(b) _JSON_BUILD_BOOLEAN, (bool) { b }
|
||||
#define JSON_BUILD_ARRAY(...) _JSON_BUILD_ARRAY_BEGIN, __VA_ARGS__, _JSON_BUILD_ARRAY_END
|
||||
@@ -297,8 +297,8 @@ int json_dispatch_strv(const char *name, JsonVariant *variant, JsonDispatchFlags
|
||||
int json_dispatch_boolean(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_tristate(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_variant(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_intmax(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_uintmax(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_int64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_uint64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_uint32(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_int32(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_uid_gid(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
@@ -306,12 +306,6 @@ int json_dispatch_user_group_name(const char *name, JsonVariant *variant, JsonDi
|
||||
int json_dispatch_id128(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
int json_dispatch_unsupported(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
|
||||
assert_cc(sizeof(uintmax_t) == sizeof(uint64_t));
|
||||
#define json_dispatch_uint64 json_dispatch_uintmax
|
||||
|
||||
assert_cc(sizeof(intmax_t) == sizeof(int64_t));
|
||||
#define json_dispatch_int64 json_dispatch_intmax
|
||||
|
||||
assert_cc(sizeof(uint32_t) == sizeof(unsigned));
|
||||
#define json_dispatch_uint json_dispatch_uint32
|
||||
|
||||
|
||||
@@ -252,7 +252,7 @@ int json_dispatch_gecos(const char *name, JsonVariant *variant, JsonDispatchFlag
|
||||
|
||||
static int json_dispatch_nice(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
int *nl = userdata;
|
||||
intmax_t m;
|
||||
int64_t m;
|
||||
|
||||
if (json_variant_is_null(variant)) {
|
||||
*nl = INT_MAX;
|
||||
@@ -276,10 +276,10 @@ static int json_dispatch_rlimit_value(const char *name, JsonVariant *variant, Js
|
||||
if (json_variant_is_null(variant))
|
||||
*ret = RLIM_INFINITY;
|
||||
else if (json_variant_is_unsigned(variant)) {
|
||||
uintmax_t w;
|
||||
uint64_t w;
|
||||
|
||||
w = json_variant_unsigned(variant);
|
||||
if (w == RLIM_INFINITY || (uintmax_t) w != json_variant_unsigned(variant))
|
||||
if (w == RLIM_INFINITY || (uint64_t) w != json_variant_unsigned(variant))
|
||||
return json_log(variant, flags, SYNTHETIC_ERRNO(ERANGE), "Resource limit value '%s' is out of range.", name);
|
||||
|
||||
*ret = (rlim_t) w;
|
||||
@@ -453,7 +453,7 @@ static int json_dispatch_image_path(const char *name, JsonVariant *variant, Json
|
||||
|
||||
static int json_dispatch_umask(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
mode_t *m = userdata;
|
||||
uintmax_t k;
|
||||
uint64_t k;
|
||||
|
||||
if (json_variant_is_null(variant)) {
|
||||
*m = MODE_INVALID;
|
||||
@@ -473,7 +473,7 @@ static int json_dispatch_umask(const char *name, JsonVariant *variant, JsonDispa
|
||||
|
||||
static int json_dispatch_access_mode(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
mode_t *m = userdata;
|
||||
uintmax_t k;
|
||||
uint64_t k;
|
||||
|
||||
if (json_variant_is_null(variant)) {
|
||||
*m = MODE_INVALID;
|
||||
@@ -564,8 +564,7 @@ static int json_dispatch_storage(const char *name, JsonVariant *variant, JsonDis
|
||||
}
|
||||
|
||||
static int json_dispatch_tasks_or_memory_max(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
uint64_t *limit = userdata;
|
||||
uintmax_t k;
|
||||
uint64_t *limit = userdata, k;
|
||||
|
||||
if (json_variant_is_null(variant)) {
|
||||
*limit = UINT64_MAX;
|
||||
@@ -584,8 +583,7 @@ static int json_dispatch_tasks_or_memory_max(const char *name, JsonVariant *vari
|
||||
}
|
||||
|
||||
static int json_dispatch_weight(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
|
||||
uint64_t *weight = userdata;
|
||||
uintmax_t k;
|
||||
uint64_t *weight = userdata, k;
|
||||
|
||||
if (json_variant_is_null(variant)) {
|
||||
*weight = UINT64_MAX;
|
||||
|
||||
Reference in New Issue
Block a user