Merge pull request #36 from vrahane/log_walk_workaround
cmd/log_mgmt: make sure a +ve err gets returned
diff --git a/cmd/log_mgmt/src/log_mgmt.c b/cmd/log_mgmt/src/log_mgmt.c
index fa2a792..7e6c715 100644
--- a/cmd/log_mgmt/src/log_mgmt.c
+++ b/cmd/log_mgmt/src/log_mgmt.c
@@ -235,7 +235,8 @@
"error: entry too large (%zu bytes)", entry_len);
}
- return MGMT_ERR_EMSGSIZE;
+ /* We want a negative error code here */
+ return -1 * MGMT_ERR_EMSGSIZE;
}
ctxt->rsp_len += entry_len;
}
@@ -255,13 +256,32 @@
log_encode_entries(const struct log_mgmt_log *log, CborEncoder *enc,
int64_t timestamp, uint32_t index)
{
+ struct CborCntWriter cnt_writer;
struct log_mgmt_filter filter;
struct log_walk_ctxt ctxt;
+ CborEncoder cnt_encoder;
CborEncoder entries;
CborError err;
+ int rsp_len;
int rc;
err = 0;
+ rsp_len = 0;
+ /* this code counts how long the message would be if we encoded
+ * this outer structure using cbor. */
+ cbor_cnt_writer_init(&cnt_writer);
+ cbor_encoder_init(&cnt_encoder, &cnt_writer.enc, 0);
+ err |= cbor_encode_text_stringz(&cnt_encoder, "entries");
+ err |= cbor_encoder_create_array(&cnt_encoder, &entries,
+ CborIndefiniteLength);
+ err |= cbor_encoder_close_container(&cnt_encoder, &entries);
+ rsp_len = cbor_encode_bytes_written(enc) +
+ cbor_encode_bytes_written(&cnt_encoder);
+ if (rsp_len > LOG_MGMT_MAX_RSP_LEN) {
+ rc = MGMT_ERR_EMSGSIZE;
+ goto err;
+ }
+
err |= cbor_encode_text_stringz(enc, "entries");
err |= cbor_encoder_create_array(enc, &entries, CborIndefiniteLength);
@@ -276,9 +296,12 @@
rc = log_mgmt_impl_foreach_entry(log->name, &filter,
log_mgmt_cb_encode, &ctxt);
- if (rc != 0 && rc != MGMT_ERR_EMSGSIZE) {
- cbor_encoder_close_container(enc, &entries);
- return rc;
+ if (rc < 0) {
+ /*
+ * If we receive negative error code from the walk function,
+ * make sure it gets converted to a positive error code
+ */
+ rc = -1 * rc;
}
err |= cbor_encoder_close_container(enc, &entries);
@@ -287,7 +310,8 @@
return MGMT_ERR_ENOMEM;
}
- return 0;
+err:
+ return rc;
}
static int
@@ -410,7 +434,7 @@
rc = log_encode(&log, &logs, timestamp, index);
#if LOG_MGMT_READ_WATERMARK_UPDATE
- if (rc == 0 || rc == OS_ENOMEM) {
+ if (rc == 0 || rc == MGMT_ERR_EMSGSIZE) {
log_mgmt_impl_set_watermark(&log, index);
}
#endif