From: Julien Grall <jgr...@amazon.com>
Currently, only Live-Update request can be delayed. In a follow-up,
we will want to delay more requests (e.g. transaction start).
Therefore we want to preserve delayed requests across Live-Update.
Delayed requests are just complete "in" buffer. So the code is
refactored to allow sharing the code to dump "in" buffer.
Signed-off-by: Julien Grall <jgr...@amazon.com>
---
tools/xenstore/xenstored_core.c | 42 +++++++++++++++++++++++++--------
1 file changed, 32 insertions(+), 10 deletions(-)
diff --git a/tools/xenstore/xenstored_core.c
b/tools/xenstore/xenstored_core.c
index 5b7ab7f74013..9eca58682b51 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -2403,25 +2403,47 @@ const char *dump_state_global(FILE *fp)
return NULL;
}
+static const char *dump_input_buffered_data(FILE *fp,
+ const struct buffered_data *in,
+ unsigned int *total_len)
+{
+ unsigned int hlen = in->inhdr ? in->used : sizeof(in->hdr);
+
+ *total_len += hlen;
+ if (fp && fwrite(&in->hdr, hlen, 1, fp) != 1)
+ return "Dump read data error";
+ if (!in->inhdr && in->used) {
+ *total_len += in->used;
+ if (fp && fwrite(in->buffer, in->used, 1, fp) != 1)
+ return "Dump read data error";
+ }
+
+ return NULL;
+}
+
/* Called twice: first with fp == NULL to get length, then for
writing data. */
const char *dump_state_buffered_data(FILE *fp, const struct
connection *c,
struct xs_state_connection *sc)
{
unsigned int len = 0, used;
- struct buffered_data *out, *in = c->in;
+ struct buffered_data *out;
bool partial = true;
+ struct delayed_request *req;
+ const char *ret;
- if (in) {
- len = in->inhdr ? in->used : sizeof(in->hdr);
- if (fp && fwrite(&in->hdr, len, 1, fp) != 1)
- return "Dump read data error";
- if (!in->inhdr && in->used) {
- len += in->used;
- if (fp && fwrite(in->buffer, in->used, 1, fp) != 1)
- return "Dump read data error";
- }
+ /* Dump any command that was delayed */
+ list_for_each_entry(req, &c->delayed, list) {