# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 5cca372aec0554f150e54d0ab30c30a06a2ad4b5
# Parent e43ffb31de480e558a1ccc7a12fbd9e2554ac83d
Echo request and transaction identifiers in xenstored
replies (and set to zero for async watch events).
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r e43ffb31de48 -r 5cca372aec05 tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c Tue Oct 11 10:59:15 2005
+++ b/tools/xenstore/xenstored_core.c Tue Oct 11 11:39:03 2005
@@ -539,6 +539,9 @@
struct buffered_data *data;
data = talloc(ctx, struct buffered_data);
+ if (data == NULL)
+ return NULL;
+
data->inhdr = true;
data->used = 0;
data->buffer = NULL;
@@ -583,15 +586,24 @@
{
struct buffered_data *bdata;
- /* When data gets freed, we want list entry is destroyed (so
- * list entry is a child). */
+ /* Message is a child of the connection context for auto-cleanup. */
bdata = new_buffer(conn);
bdata->buffer = talloc_array(bdata, char, len);
+ /* Echo request header in reply unless this is an async watch event. */
+ if (type != XS_WATCH_EVENT) {
+ memcpy(&bdata->hdr.msg, &conn->in->hdr.msg,
+ sizeof(struct xsd_sockmsg));
+ } else {
+ memset(&bdata->hdr.msg, 0, sizeof(struct xsd_sockmsg));
+ }
+
+ /* Update relevant header fields and fill in the message body. */
bdata->hdr.msg.type = type;
bdata->hdr.msg.len = len;
memcpy(bdata->buffer, data, len);
+ /* Queue for later transmission. */
list_add_tail(&bdata->list, &conn->out_list);
}
@@ -1144,36 +1156,25 @@
static void consider_message(struct connection *conn)
{
- /*
- * 'volatile' qualifier prevents register allocation which fixes:
- * warning: variable 'xxx' might be clobbered by 'longjmp' or 'vfork'
- */
- struct buffered_data *volatile in = NULL;
- enum xsd_sockmsg_type volatile type = conn->in->hdr.msg.type;
jmp_buf talloc_fail;
+
+ if (verbose)
+ xprintf("Got message %s len %i from %p\n",
+ sockmsg_string(conn->in->hdr.msg.type),
+ conn->in->hdr.msg.len, conn);
/* For simplicity, we kill the connection on OOM. */
talloc_set_fail_handler(out_of_mem, &talloc_fail);
if (setjmp(talloc_fail)) {
- /* Free in before conn, in case it needs something. */
- talloc_free(in);
talloc_free(conn);
goto end;
}
- if (verbose)
- xprintf("Got message %s len %i from %p\n",
- sockmsg_string(type), conn->in->hdr.msg.len, conn);
-
- /* Careful: process_message may free connection. We detach
- * "in" beforehand and allocate the new buffer to avoid
- * touching conn after process_message.
- */
- in = talloc_steal(talloc_autofree_context(), conn->in);
+ process_message(conn, conn->in);
+
+ talloc_free(conn->in);
conn->in = new_buffer(conn);
- process_message(conn, in);
-
- talloc_free(in);
+
end:
talloc_set_fail_handler(NULL, NULL);
if (talloc_total_blocks(NULL)
@@ -1242,12 +1243,7 @@
struct connection *new_connection(connwritefn_t *write, connreadfn_t *read)
{
- /*
- * 'volatile' qualifier prevents register allocation which fixes:
- * warning: variable 'xxx' might be clobbered by 'longjmp' or 'vfork'
- */
- struct connection *volatile new;
- jmp_buf talloc_fail;
+ struct connection *new;
new = talloc(talloc_autofree_context(), struct connection);
if (!new)
@@ -1262,13 +1258,11 @@
INIT_LIST_HEAD(&new->watches);
INIT_LIST_HEAD(&new->transaction_list);
- talloc_set_fail_handler(out_of_mem, &talloc_fail);
- if (setjmp(talloc_fail)) {
+ new->in = new_buffer(new);
+ if (new->in == NULL) {
talloc_free(new);
return NULL;
}
- new->in = new_buffer(new);
- talloc_set_fail_handler(NULL, NULL);
list_add_tail(&new->list, &connections);
talloc_set_destructor(new, destroy_conn);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|