mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
sd-varlink: when expecting a type and refusing due to mismatch say what was received
Sometimes it is not obvious why a message is not accepted, so explicitly say what type was received in the log message
This commit is contained in:
committed by
Yu Watanabe
parent
ae10e1ef80
commit
d08b2f2a06
@@ -1705,32 +1705,52 @@ static int varlink_idl_validate_field_element_type(const sd_varlink_field *field
|
||||
|
||||
case SD_VARLINK_BOOL:
|
||||
if (!sd_json_variant_is_boolean(v))
|
||||
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be a bool, but it is not, refusing.", strna(field->name));
|
||||
return varlink_idl_log(
|
||||
SYNTHETIC_ERRNO(EMEDIUMTYPE),
|
||||
"Field '%s' should be a bool, but it is of type '%s', refusing.",
|
||||
strna(field->name),
|
||||
strna(sd_json_variant_type_to_string(sd_json_variant_type(v))));
|
||||
|
||||
break;
|
||||
|
||||
case SD_VARLINK_INT:
|
||||
/* Allow strings here too, since integers with > 53 bits are often passed in as strings */
|
||||
if (!sd_json_variant_is_integer(v) && !sd_json_variant_is_unsigned(v) && !sd_json_variant_is_string(v))
|
||||
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be an int, but it is not, refusing.", strna(field->name));
|
||||
return varlink_idl_log(
|
||||
SYNTHETIC_ERRNO(EMEDIUMTYPE),
|
||||
"Field '%s' should be an int, but it is of type '%s', refusing.",
|
||||
strna(field->name),
|
||||
strna(sd_json_variant_type_to_string(sd_json_variant_type(v))));
|
||||
|
||||
break;
|
||||
|
||||
case SD_VARLINK_FLOAT:
|
||||
if (!sd_json_variant_is_number(v))
|
||||
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be a float, but it is not, refusing.", strna(field->name));
|
||||
return varlink_idl_log(
|
||||
SYNTHETIC_ERRNO(EMEDIUMTYPE),
|
||||
"Field '%s' should be a float, but it is of type '%s', refusing.",
|
||||
strna(field->name),
|
||||
strna(sd_json_variant_type_to_string(sd_json_variant_type(v))));
|
||||
|
||||
break;
|
||||
|
||||
case SD_VARLINK_STRING:
|
||||
if (!sd_json_variant_is_string(v))
|
||||
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be a string, but it is not, refusing.", strna(field->name));
|
||||
return varlink_idl_log(
|
||||
SYNTHETIC_ERRNO(EMEDIUMTYPE),
|
||||
"Field '%s' should be a string, but it is of type '%s', refusing.",
|
||||
strna(field->name),
|
||||
strna(sd_json_variant_type_to_string(sd_json_variant_type(v))));
|
||||
|
||||
break;
|
||||
|
||||
case SD_VARLINK_OBJECT:
|
||||
if (!sd_json_variant_is_object(v))
|
||||
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be an object, but it is not, refusing.", strna(field->name));
|
||||
return varlink_idl_log(
|
||||
SYNTHETIC_ERRNO(EMEDIUMTYPE),
|
||||
"Field '%s' should be an object, but it is of type '%s', refusing.",
|
||||
strna(field->name),
|
||||
strna(sd_json_variant_type_to_string(sd_json_variant_type(v))));
|
||||
|
||||
break;
|
||||
|
||||
@@ -1759,7 +1779,10 @@ static int varlink_idl_validate_field(const sd_varlink_field *field, sd_json_var
|
||||
sd_json_variant *i;
|
||||
|
||||
if (!sd_json_variant_is_array(v))
|
||||
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be an array, but it is not, refusing.", strna(field->name));
|
||||
return varlink_idl_log(
|
||||
SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be an array, but it is of type '%s', refusing.",
|
||||
strna(field->name),
|
||||
strna(sd_json_variant_type_to_string(sd_json_variant_type(v))));
|
||||
|
||||
JSON_VARIANT_ARRAY_FOREACH(i, v) {
|
||||
r = varlink_idl_validate_field_element_type(field, i);
|
||||
@@ -1772,7 +1795,11 @@ static int varlink_idl_validate_field(const sd_varlink_field *field, sd_json_var
|
||||
sd_json_variant *e;
|
||||
|
||||
if (!sd_json_variant_is_object(v))
|
||||
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be an object, but it is not, refusing.", strna(field->name));
|
||||
return varlink_idl_log(
|
||||
SYNTHETIC_ERRNO(EMEDIUMTYPE),
|
||||
"Field '%s' should be an object, but it is of type '%s', refusing.",
|
||||
strna(field->name),
|
||||
strna(sd_json_variant_type_to_string(sd_json_variant_type(v))));
|
||||
|
||||
JSON_VARIANT_OBJECT_FOREACH(k, e, v) {
|
||||
r = varlink_idl_validate_field_element_type(field, e);
|
||||
|
||||
Reference in New Issue
Block a user