static void imgr_ver_jsonstr(struct json_encoder *enc, char *key, struct image_version *ver) { struct json_value jv; char ver_str[IMGMGR_NMGR_MAX_VER]; int ver_len; ver_len = imgr_ver_str(ver, ver_str); JSON_VALUE_STRINGN(&jv, ver_str, ver_len); json_encode_object_entry(enc, key, &jv); }
static int imgr_list(struct nmgr_jbuf *njb) { struct image_version ver; int i; int rc; struct json_encoder *enc; struct json_value array; struct json_value versions[4]; struct json_value *version_ptrs[4]; char vers_str[4][IMGMGR_NMGR_MAX_VER]; int ver_len; int cnt = 0; for (i = FLASH_AREA_IMAGE_0; i <= FLASH_AREA_IMAGE_1; i++) { rc = imgr_read_ver(i, &ver); if (rc != 0) { continue; } ver_len = imgr_ver_str(&ver, vers_str[cnt]); JSON_VALUE_STRINGN(&versions[cnt], vers_str[cnt], ver_len); version_ptrs[cnt] = &versions[cnt]; cnt++; } array.jv_type = JSON_VALUE_TYPE_ARRAY; array.jv_len = cnt; array.jv_val.composite.values = version_ptrs; enc = &njb->njb_enc; json_encode_object_start(enc); json_encode_object_entry(enc, "images", &array); json_encode_object_finish(enc); return 0; }
int imgmgr_state_read(struct mgmt_cbuf *cb) { int i; int rc; uint32_t flags; struct image_version ver; uint8_t hash[IMGMGR_HASH_LEN]; /* SHA256 hash */ char vers_str[IMGMGR_NMGR_MAX_VER]; int any_non_bootable; int split_status; uint8_t state_flags; CborError g_err = CborNoError; CborEncoder *penc = &cb->encoder; CborEncoder rsp, images, image; any_non_bootable = 0; g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength); g_err |= cbor_encode_text_stringz(&rsp, "images"); g_err |= cbor_encoder_create_array(&rsp, &images, CborIndefiniteLength); for (i = 0; i < 2; i++) { rc = imgr_read_info(i, &ver, hash, &flags); if (rc != 0) { continue; } if (flags & IMAGE_F_NON_BOOTABLE) { any_non_bootable = 1; } state_flags = imgmgr_state_flags(i); g_err |= cbor_encoder_create_map(&images, &image, CborIndefiniteLength); g_err |= cbor_encode_text_stringz(&image, "slot"); g_err |= cbor_encode_int(&image, i); g_err |= cbor_encode_text_stringz(&image, "version"); imgr_ver_str(&ver, vers_str); g_err |= cbor_encode_text_stringz(&image, vers_str); g_err |= cbor_encode_text_stringz(&image, "hash"); g_err |= cbor_encode_byte_string(&image, hash, IMGMGR_HASH_LEN); g_err |= cbor_encode_text_stringz(&image, "bootable"); g_err |= cbor_encode_boolean(&image, !(flags & IMAGE_F_NON_BOOTABLE)); g_err |= cbor_encode_text_stringz(&image, "pending"); g_err |= cbor_encode_boolean(&image, state_flags & IMGMGR_STATE_F_PENDING); g_err |= cbor_encode_text_stringz(&image, "confirmed"); g_err |= cbor_encode_boolean(&image, state_flags & IMGMGR_STATE_F_CONFIRMED); g_err |= cbor_encode_text_stringz(&image, "active"); g_err |= cbor_encode_boolean(&image, state_flags & IMGMGR_STATE_F_ACTIVE); g_err |= cbor_encoder_close_container(&images, &image); } g_err |= cbor_encoder_close_container(&rsp, &images); if (any_non_bootable) { split_status = split_check_status(); } else { split_status = SPLIT_STATUS_INVALID; } g_err |= cbor_encode_text_stringz(&rsp, "splitStatus"); g_err |= cbor_encode_int(&rsp, split_status); g_err |= cbor_encoder_close_container(penc, &rsp); if (g_err) { return MGMT_ERR_ENOMEM; } return 0; }