+ /* Have we got enough of a message to be able to process it yet? */
+ if (g->msg_in_size < 4) return;
+
+ xdrmem_create (&xdr, g->msg_in, g->msg_in_size, XDR_DECODE);
+ if (!xdr_uint32_t (&xdr, &len)) {
+ error (g, "can't decode length word");
+ goto cleanup;
+ }
+
+ /* Length is normally the length of the message, but when guestfsd
+ * starts up it sends a "magic" value (longer than any possible
+ * message). Check for this.
+ */
+ if (len == 0xf5f55ff5) {
+ if (g->state != LAUNCHING)
+ error (g, "received magic signature from guestfsd, but in state %d",
+ g->state);
+ else if (g->msg_in_size != 4)
+ error (g, "received magic signature from guestfsd, but msg size is %d",
+ g->msg_in_size);
+ else {
+ g->state = READY;
+ if (g->launch_done_cb_internal)
+ g->launch_done_cb_internal (g, g->launch_done_cb_internal_data);
+ if (g->launch_done_cb)
+ g->launch_done_cb (g, g->launch_done_cb_data);
+ }