Begin to add the upload and download commands.
authorRichard Jones <rjones@redhat.com>
Sat, 18 Apr 2009 21:33:15 +0000 (22:33 +0100)
committerRichard Jones <rjones@redhat.com>
Sat, 18 Apr 2009 21:33:15 +0000 (22:33 +0100)
23 files changed:
daemon/actions.h
daemon/stubs.c
fish/cmds.c
fish/completion.c
guestfish-actions.pod
guestfs-actions.pod
ocaml/guestfs.ml
ocaml/guestfs.mli
ocaml/guestfs_c_actions.c
perl/Guestfs.xs
perl/lib/Sys/Guestfs.pm
python/guestfs-py.c
python/guestfs.py
ruby/ext/guestfs/_guestfs.c
src/generator.ml
src/guestfs-actions.c
src/guestfs-actions.h
src/guestfs.c
src/guestfs.h
src/guestfs_protocol.c
src/guestfs_protocol.h
src/guestfs_protocol.x
tests.c

index 76ce8fc..01ef882 100644 (file)
@@ -86,3 +86,5 @@ extern int64_t do_blockdev_getsz (const char *device);
 extern int64_t do_blockdev_getsize64 (const char *device);
 extern int do_blockdev_flushbufs (const char *device);
 extern int do_blockdev_rereadpt (const char *device);
+extern int do_upload (const char *remotefilename);
+extern int do_download (const char *remotefilename);
index dfadb83..df067cc 100644 (file)
@@ -1584,6 +1584,54 @@ done:
   xdr_free ((xdrproc_t) xdr_guestfs_blockdev_rereadpt_args, (char *) &args);
 }
 
+static void upload_stub (XDR *xdr_in)
+{
+  int r;
+  struct guestfs_upload_args args;
+  const char *remotefilename;
+
+  memset (&args, 0, sizeof args);
+
+  if (!xdr_guestfs_upload_args (xdr_in, &args)) {
+    reply_with_error ("%s: daemon failed to decode procedure arguments", "upload");
+    return;
+  }
+  remotefilename = args.remotefilename;
+
+  r = do_upload (remotefilename);
+  if (r == -1)
+    /* do_upload has already called reply_with_error */
+    goto done;
+
+  reply (NULL, NULL);
+done:
+  xdr_free ((xdrproc_t) xdr_guestfs_upload_args, (char *) &args);
+}
+
+static void download_stub (XDR *xdr_in)
+{
+  int r;
+  struct guestfs_download_args args;
+  const char *remotefilename;
+
+  memset (&args, 0, sizeof args);
+
+  if (!xdr_guestfs_download_args (xdr_in, &args)) {
+    reply_with_error ("%s: daemon failed to decode procedure arguments", "download");
+    return;
+  }
+  remotefilename = args.remotefilename;
+
+  r = do_download (remotefilename);
+  if (r == -1)
+    /* do_download has already called reply_with_error */
+    goto done;
+
+  /* do_download has already sent a reply */
+done:
+  xdr_free ((xdrproc_t) xdr_guestfs_download_args, (char *) &args);
+}
+
 void dispatch_incoming_message (XDR *xdr_in)
 {
   switch (proc_nr) {
@@ -1782,6 +1830,12 @@ void dispatch_incoming_message (XDR *xdr_in)
     case GUESTFS_PROC_BLOCKDEV_REREADPT:
       blockdev_rereadpt_stub (xdr_in);
       break;
+    case GUESTFS_PROC_UPLOAD:
+      upload_stub (xdr_in);
+      break;
+    case GUESTFS_PROC_DOWNLOAD:
+      download_stub (xdr_in);
+      break;
     default:
       reply_with_error ("dispatch_incoming_message: unknown procedure number %d", proc_nr);
   }
index 5270912..9cd23c5 100644 (file)
@@ -62,6 +62,7 @@ void list_commands (void)
   printf ("%-20s %s\n", "command", "run a command from the guest filesystem");
   printf ("%-20s %s\n", "command-lines", "run a command, returning lines");
   printf ("%-20s %s\n", "config", "add qemu parameters");
+  printf ("%-20s %s\n", "download", "download a file to the local machine");
   printf ("%-20s %s\n", "exists", "test if file or directory exists");
   printf ("%-20s %s\n", "file", "determine file type");
   printf ("%-20s %s\n", "get-autosync", "get autosync mode");
@@ -108,6 +109,7 @@ void list_commands (void)
   printf ("%-20s %s\n", "tune2fs-l", "get ext2/ext3 superblock details");
   printf ("%-20s %s\n", "umount", "unmount a filesystem");
   printf ("%-20s %s\n", "umount-all", "unmount all filesystems");
+  printf ("%-20s %s\n", "upload", "upload a file from the local machine");
   printf ("%-20s %s\n", "vgcreate", "create an LVM volume group");
   printf ("%-20s %s\n", "vgs", "list the LVM volume groups (VGs)");
   printf ("%-20s %s\n", "vgs-full", "list the LVM volume groups (VGs)");
@@ -360,6 +362,12 @@ void display_command (const char *cmd)
   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
     pod2text ("blockdev-rereadpt - reread partition table", " blockdev-rereadpt <device>\n\nReread the partition table on C<device>.\n\nThis uses the L<blockdev(8)> command.");
   else
+  if (strcasecmp (cmd, "upload") == 0)
+    pod2text ("upload - upload a file from the local machine", " upload <filename> <remotefilename>\n\nUpload local file C<filename> to C<remotefilename> on the\nfilesystem.\n\nC<filename> can also be a named pipe.\n\nSee also C<download>.");
+  else
+  if (strcasecmp (cmd, "download") == 0)
+    pod2text ("download - download a file to the local machine", " download <remotefilename> <filename>\n\nDownload file C<remotefilename> and save it as C<filename>\non the local machine.\n\nC<filename> can also be a named pipe.\n\nSee also C<upload>, C<cat>.");
+  else
     display_builtin_command (cmd);
 }
 
@@ -1738,6 +1746,38 @@ static int run_blockdev_rereadpt (const char *cmd, int argc, char *argv[])
   return r;
 }
 
+static int run_upload (const char *cmd, int argc, char *argv[])
+{
+  int r;
+  const char *filename;
+  const char *remotefilename;
+  if (argc != 2) {
+    fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
+    fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
+    return -1;
+  }
+  filename = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
+  remotefilename = argv[1];
+  r = guestfs_upload (g, filename, remotefilename);
+  return r;
+}
+
+static int run_download (const char *cmd, int argc, char *argv[])
+{
+  int r;
+  const char *remotefilename;
+  const char *filename;
+  if (argc != 2) {
+    fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
+    fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
+    return -1;
+  }
+  remotefilename = argv[0];
+  filename = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
+  r = guestfs_download (g, remotefilename, filename);
+  return r;
+}
+
 int run_action (const char *cmd, int argc, char *argv[])
 {
   if (strcasecmp (cmd, "launch") == 0 || strcasecmp (cmd, "run") == 0)
@@ -1983,6 +2023,12 @@ int run_action (const char *cmd, int argc, char *argv[])
   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
     return run_blockdev_rereadpt (cmd, argc, argv);
   else
+  if (strcasecmp (cmd, "upload") == 0)
+    return run_upload (cmd, argc, argv);
+  else
+  if (strcasecmp (cmd, "download") == 0)
+    return run_download (cmd, argc, argv);
+  else
     {
       fprintf (stderr, "%s: unknown command\n", cmd);
       return -1;
index a346ccb..a0ba5ae 100644 (file)
@@ -68,6 +68,7 @@ static const char *commands[] = {
   "command",
   "command-lines",
   "config",
+  "download",
   "exists",
   "file",
   "get-autosync",
@@ -118,6 +119,7 @@ static const char *commands[] = {
   "umount-all",
   "unmount",
   "unmount-all",
+  "upload",
   "verbose",
   "vgcreate",
   "vgs",
index 6fa8649..5013a28 100644 (file)
@@ -358,6 +358,19 @@ The first character of C<param> string must be a C<-> (dash).
 
 C<value> can be NULL.
 
+=head2 download
+
+ download remotefilename (filename|-)
+
+Download file C<remotefilename> and save it as C<filename>
+on the local machine.
+
+C<filename> can also be a named pipe.
+
+See also C<upload>, C<cat>.
+
+Use C<-> instead of a filename to read/write from stdin/stdout.
+
 =head2 exists
 
  exists path
@@ -803,6 +816,19 @@ This unmounts all mounted filesystems.
 
 Some internal mounts are not unmounted by this call.
 
+=head2 upload
+
+ upload (filename|-) remotefilename
+
+Upload local file C<filename> to C<remotefilename> on the
+filesystem.
+
+C<filename> can also be a named pipe.
+
+See also C<download>.
+
+Use C<-> instead of a filename to read/write from stdin/stdout.
+
 =head2 vgcreate
 
  vgcreate volgroup physvols,...
index 8667340..21f424f 100644 (file)
@@ -472,6 +472,21 @@ C<value> can be NULL.
 
 This function returns 0 on success or -1 on error.
 
+=head2 guestfs_download
+
+ int guestfs_download (guestfs_h *handle,
+               const char *remotefilename,
+               const char *filename);
+
+Download file C<remotefilename> and save it as C<filename>
+on the local machine.
+
+C<filename> can also be a named pipe.
+
+See also C<guestfs_upload>, C<guestfs_cat>.
+
+This function returns 0 on success or -1 on error.
+
 =head2 guestfs_exists
 
  int guestfs_exists (guestfs_h *handle,
@@ -1079,6 +1094,21 @@ Some internal mounts are not unmounted by this call.
 
 This function returns 0 on success or -1 on error.
 
+=head2 guestfs_upload
+
+ int guestfs_upload (guestfs_h *handle,
+               const char *filename,
+               const char *remotefilename);
+
+Upload local file C<filename> to C<remotefilename> on the
+filesystem.
+
+C<filename> can also be a named pipe.
+
+See also C<guestfs_download>.
+
+This function returns 0 on success or -1 on error.
+
 =head2 guestfs_vgcreate
 
  int guestfs_vgcreate (guestfs_h *handle,
index 0ea77c7..f45533b 100644 (file)
@@ -197,3 +197,5 @@ external blockdev_getsz : t -> string -> int64 = "ocaml_guestfs_blockdev_getsz"
 external blockdev_getsize64 : t -> string -> int64 = "ocaml_guestfs_blockdev_getsize64"
 external blockdev_flushbufs : t -> string -> unit = "ocaml_guestfs_blockdev_flushbufs"
 external blockdev_rereadpt : t -> string -> unit = "ocaml_guestfs_blockdev_rereadpt"
+external upload : t -> string -> string -> unit = "ocaml_guestfs_upload"
+external download : t -> string -> string -> unit = "ocaml_guestfs_download"
index 6c76363..2257fc0 100644 (file)
@@ -370,3 +370,9 @@ val blockdev_flushbufs : t -> string -> unit
 val blockdev_rereadpt : t -> string -> unit
 (** reread partition table *)
 
+val upload : t -> string -> string -> unit
+(** upload a file from the local machine *)
+
+val download : t -> string -> string -> unit
+(** download a file to the local machine *)
+
index dd2f6f4..4d7b350 100644 (file)
@@ -2275,3 +2275,51 @@ ocaml_guestfs_blockdev_rereadpt (value gv, value devicev)
   CAMLreturn (rv);
 }
 
+CAMLprim value
+ocaml_guestfs_upload (value gv, value filenamev, value remotefilenamev)
+{
+  CAMLparam3 (gv, filenamev, remotefilenamev);
+  CAMLlocal1 (rv);
+
+  guestfs_h *g = Guestfs_val (gv);
+  if (g == NULL)
+    caml_failwith ("upload: used handle after closing it");
+
+  const char *filename = String_val (filenamev);
+  const char *remotefilename = String_val (remotefilenamev);
+  int r;
+
+  caml_enter_blocking_section ();
+  r = guestfs_upload (g, filename, remotefilename);
+  caml_leave_blocking_section ();
+  if (r == -1)
+    ocaml_guestfs_raise_error (g, "upload");
+
+  rv = Val_unit;
+  CAMLreturn (rv);
+}
+
+CAMLprim value
+ocaml_guestfs_download (value gv, value remotefilenamev, value filenamev)
+{
+  CAMLparam3 (gv, remotefilenamev, filenamev);
+  CAMLlocal1 (rv);
+
+  guestfs_h *g = Guestfs_val (gv);
+  if (g == NULL)
+    caml_failwith ("download: used handle after closing it");
+
+  const char *remotefilename = String_val (remotefilenamev);
+  const char *filename = String_val (filenamev);
+  int r;
+
+  caml_enter_blocking_section ();
+  r = guestfs_download (g, remotefilename, filename);
+  caml_leave_blocking_section ();
+  if (r == -1)
+    ocaml_guestfs_raise_error (g, "download");
+
+  rv = Val_unit;
+  CAMLreturn (rv);
+}
+
index e4a1b50..e498842 100644 (file)
@@ -1297,3 +1297,27 @@ PREINIT:
       if (r == -1)
         croak ("blockdev_rereadpt: %s", guestfs_last_error (g));
 
+void
+upload (g, filename, remotefilename)
+      guestfs_h *g;
+      char *filename;
+      char *remotefilename;
+PREINIT:
+      int r;
+ PPCODE:
+      r = guestfs_upload (g, filename, remotefilename);
+      if (r == -1)
+        croak ("upload: %s", guestfs_last_error (g));
+
+void
+download (g, remotefilename, filename)
+      guestfs_h *g;
+      char *remotefilename;
+      char *filename;
+PREINIT:
+      int r;
+ PPCODE:
+      r = guestfs_download (g, remotefilename, filename);
+      if (r == -1)
+        croak ("download: %s", guestfs_last_error (g));
+
index 7122314..f624c24 100644 (file)
@@ -389,6 +389,15 @@ The first character of C<param> string must be a C<-> (dash).
 
 C<value> can be NULL.
 
+=item $h->download ($remotefilename, $filename);
+
+Download file C<remotefilename> and save it as C<filename>
+on the local machine.
+
+C<filename> can also be a named pipe.
+
+See also C<$h-E<gt>upload>, C<$h-E<gt>cat>.
+
 =item $existsflag = $h->exists ($path);
 
 This returns C<true> if and only if there is a file, directory
@@ -742,6 +751,15 @@ This unmounts all mounted filesystems.
 
 Some internal mounts are not unmounted by this call.
 
+=item $h->upload ($filename, $remotefilename);
+
+Upload local file C<filename> to C<remotefilename> on the
+filesystem.
+
+C<filename> can also be a named pipe.
+
+See also C<$h-E<gt>download>.
+
 =item $h->vgcreate ($volgroup, \@physvols);
 
 This creates an LVM volume group called C<volgroup>
index d1f0a9e..69446ae 100644 (file)
@@ -2436,6 +2436,58 @@ py_guestfs_blockdev_rereadpt (PyObject *self, PyObject *args)
   return py_r;
 }
 
+static PyObject *
+py_guestfs_upload (PyObject *self, PyObject *args)
+{
+  PyObject *py_g;
+  guestfs_h *g;
+  PyObject *py_r;
+  int r;
+  const char *filename;
+  const char *remotefilename;
+
+  if (!PyArg_ParseTuple (args, (char *) "Oss:guestfs_upload",
+                         &py_g, &filename, &remotefilename))
+    return NULL;
+  g = get_handle (py_g);
+
+  r = guestfs_upload (g, filename, remotefilename);
+  if (r == -1) {
+    PyErr_SetString (PyExc_RuntimeError, guestfs_last_error (g));
+    return NULL;
+  }
+
+  Py_INCREF (Py_None);
+  py_r = Py_None;
+  return py_r;
+}
+
+static PyObject *
+py_guestfs_download (PyObject *self, PyObject *args)
+{
+  PyObject *py_g;
+  guestfs_h *g;
+  PyObject *py_r;
+  int r;
+  const char *remotefilename;
+  const char *filename;
+
+  if (!PyArg_ParseTuple (args, (char *) "Oss:guestfs_download",
+                         &py_g, &remotefilename, &filename))
+    return NULL;
+  g = get_handle (py_g);
+
+  r = guestfs_download (g, remotefilename, filename);
+  if (r == -1) {
+    PyErr_SetString (PyExc_RuntimeError, guestfs_last_error (g));
+    return NULL;
+  }
+
+  Py_INCREF (Py_None);
+  py_r = Py_None;
+  return py_r;
+}
+
 static PyMethodDef methods[] = {
   { (char *) "create", py_guestfs_create, METH_VARARGS, NULL },
   { (char *) "close", py_guestfs_close, METH_VARARGS, NULL },
@@ -2521,6 +2573,8 @@ static PyMethodDef methods[] = {
   { (char *) "blockdev_getsize64", py_guestfs_blockdev_getsize64, METH_VARARGS, NULL },
   { (char *) "blockdev_flushbufs", py_guestfs_blockdev_flushbufs, METH_VARARGS, NULL },
   { (char *) "blockdev_rereadpt", py_guestfs_blockdev_rereadpt, METH_VARARGS, NULL },
+  { (char *) "upload", py_guestfs_upload, METH_VARARGS, NULL },
+  { (char *) "download", py_guestfs_download, METH_VARARGS, NULL },
   { NULL, NULL, 0, NULL }
 };
 
index 943f80a..fd495fd 100644 (file)
@@ -923,3 +923,23 @@ class GuestFS:
         """
         return libguestfsmod.blockdev_rereadpt (self._o, device)
 
+    def upload (self, filename, remotefilename):
+        u"""Upload local file "filename" to "remotefilename" on the
+        filesystem.
+        
+        "filename" can also be a named pipe.
+        
+        See also "g.download".
+        """
+        return libguestfsmod.upload (self._o, filename, remotefilename)
+
+    def download (self, remotefilename, filename):
+        u"""Download file "remotefilename" and save it as "filename"
+        on the local machine.
+        
+        "filename" can also be a named pipe.
+        
+        See also "g.upload", "g.cat".
+        """
+        return libguestfsmod.download (self._o, remotefilename, filename)
+
index cd4c271..f73a3b7 100644 (file)
@@ -1982,6 +1982,56 @@ static VALUE ruby_guestfs_blockdev_rereadpt (VALUE gv, VALUE devicev)
   return Qnil;
 }
 
+static VALUE ruby_guestfs_upload (VALUE gv, VALUE filenamev, VALUE remotefilenamev)
+{
+  guestfs_h *g;
+  Data_Get_Struct (gv, guestfs_h, g);
+  if (!g)
+    rb_raise (rb_eArgError, "%s: used handle after closing it", "upload");
+
+  const char *filename = StringValueCStr (filenamev);
+  if (!filename)
+    rb_raise (rb_eTypeError, "expected string for parameter %s of %s",
+              "filename", "upload");
+  const char *remotefilename = StringValueCStr (remotefilenamev);
+  if (!remotefilename)
+    rb_raise (rb_eTypeError, "expected string for parameter %s of %s",
+              "remotefilename", "upload");
+
+  int r;
+
+  r = guestfs_upload (g, filename, remotefilename);
+  if (r == -1)
+    rb_raise (e_Error, "%s", guestfs_last_error (g));
+
+  return Qnil;
+}
+
+static VALUE ruby_guestfs_download (VALUE gv, VALUE remotefilenamev, VALUE filenamev)
+{
+  guestfs_h *g;
+  Data_Get_Struct (gv, guestfs_h, g);
+  if (!g)
+    rb_raise (rb_eArgError, "%s: used handle after closing it", "download");
+
+  const char *remotefilename = StringValueCStr (remotefilenamev);
+  if (!remotefilename)
+    rb_raise (rb_eTypeError, "expected string for parameter %s of %s",
+              "remotefilename", "download");
+  const char *filename = StringValueCStr (filenamev);
+  if (!filename)
+    rb_raise (rb_eTypeError, "expected string for parameter %s of %s",
+              "filename", "download");
+
+  int r;
+
+  r = guestfs_download (g, remotefilename, filename);
+  if (r == -1)
+    rb_raise (e_Error, "%s", guestfs_last_error (g));
+
+  return Qnil;
+}
+
 /* Initialize the module. */
 void Init__guestfs ()
 {
@@ -2156,4 +2206,8 @@ void Init__guestfs ()
         ruby_guestfs_blockdev_flushbufs, 1);
   rb_define_method (c_guestfs, "blockdev_rereadpt",
         ruby_guestfs_blockdev_rereadpt, 1);
+  rb_define_method (c_guestfs, "upload",
+        ruby_guestfs_upload, 2);
+  rb_define_method (c_guestfs, "download",
+        ruby_guestfs_download, 2);
 }
index 6df04a5..a89886f 100755 (executable)
@@ -1253,7 +1253,6 @@ Reread the partition table on C<device>.
 
 This uses the L<blockdev(8)> command.");
 
-(*
   ("upload", (RErr, [FileIn "filename"; String "remotefilename"]), 66, [],
    [],
    "upload a file from the local machine",
@@ -1275,7 +1274,6 @@ on the local machine.
 C<filename> can also be a named pipe.
 
 See also C<guestfs_upload>, C<guestfs_cat>.");
-*)
 
 ]
 
@@ -2146,8 +2144,7 @@ check_state (guestfs_h *g, const char *caller)
       pr "  /* This flag is set by the callbacks, so we know we've done\n";
       pr "   * the callbacks as expected, and in the right sequence.\n";
       pr "   * 0 = not called, 1 = send called,\n";
-      pr "   * 2.. = send_file called,\n";
-      pr "   * 1000 = reply called.\n";
+      pr "   * 1001 = reply called.\n";
       pr "   */\n";
       pr "  int cb_sequence;\n";
       pr "  struct guestfs_message_header hdr;\n";
@@ -2173,7 +2170,6 @@ check_state (guestfs_h *g, const char *caller)
       pr "  guestfs_main_loop *ml = guestfs_get_main_loop (g);\n";
       pr "  struct %s_ctx *ctx = (struct %s_ctx *) data;\n" shortname shortname;
       pr "\n";
-      pr "  guestfs__switch_to_receiving (g);\n";
       pr "  ctx->cb_sequence = 1;\n";
       pr "  ml->main_loop_quit (ml, g);\n";
       pr "}\n";
@@ -2215,7 +2211,7 @@ check_state (guestfs_h *g, const char *caller)
       );
 
       pr " done:\n";
-      pr "  ctx->cb_sequence = 1000;\n";
+      pr "  ctx->cb_sequence = 1001;\n";
       pr "  ml->main_loop_quit (ml, g);\n";
       pr "}\n\n";
 
@@ -2291,22 +2287,23 @@ check_state (guestfs_h *g, const char *caller)
       pr "  }\n";
       pr "\n";
 
-      (* Send any additional files requested. *)
+      (* Send any additional files (FileIn) requested. *)
       List.iter (
        function
        | FileIn n ->
-           pr "  if (send_file (g, %s) == -1)\n" n;
+           pr "  if (guestfs__send_file_sync (ml, g, %s) == -1)\n" n;
            pr "    return %s;\n" error_code;
            pr "\n";
        | _ -> ()
       ) (snd style);
 
       (* Wait for the reply from the remote end. *)
+      pr "  guestfs__switch_to_receiving (g);\n";
       pr "  ctx.cb_sequence = 0;\n";
       pr "  guestfs_set_reply_callback (g, %s_reply_cb, &ctx);\n" shortname;
       pr "  (void) ml->main_loop_run (ml, g);\n";
       pr "  guestfs_set_reply_callback (g, NULL, NULL);\n";
-      pr "  if (ctx.cb_sequence != 1000) {\n";
+      pr "  if (ctx.cb_sequence != 1001) {\n";
       pr "    error (g, \"%%s reply failed, see earlier error messages\", \"%s\");\n" name;
       pr "    return %s;\n" error_code;
       pr "  }\n";
@@ -2327,7 +2324,7 @@ check_state (guestfs_h *g, const char *caller)
       List.iter (
        function
        | FileOut n ->
-           pr "  if (receive_file (g, %s) == -1)\n" n;
+           pr "  if (guestfs__receive_file_sync (ml, g, %s) == -1)\n" n;
            pr "    return %s;\n" error_code;
            pr "\n";
        | _ -> ()
index e9de5d6..b340bb7 100644 (file)
@@ -87,8 +87,7 @@ struct mount_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -100,7 +99,6 @@ static void mount_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct mount_ctx *ctx = (struct mount_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -122,7 +120,7 @@ static void mount_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -155,11 +153,12 @@ int guestfs_mount (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, mount_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_mount");
     return -1;
   }
@@ -179,8 +178,7 @@ struct sync_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -192,7 +190,6 @@ static void sync_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct sync_ctx *ctx = (struct sync_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -214,7 +211,7 @@ static void sync_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -241,11 +238,12 @@ int guestfs_sync (guestfs_h *g)
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, sync_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_sync");
     return -1;
   }
@@ -265,8 +263,7 @@ struct touch_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -278,7 +275,6 @@ static void touch_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct touch_ctx *ctx = (struct touch_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -300,7 +296,7 @@ static void touch_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -331,11 +327,12 @@ int guestfs_touch (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, touch_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_touch");
     return -1;
   }
@@ -355,8 +352,7 @@ struct cat_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -369,7 +365,6 @@ static void cat_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct cat_ctx *ctx = (struct cat_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -395,7 +390,7 @@ static void cat_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -426,11 +421,12 @@ char *guestfs_cat (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, cat_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_cat");
     return NULL;
   }
@@ -450,8 +446,7 @@ struct ll_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -464,7 +459,6 @@ static void ll_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct ll_ctx *ctx = (struct ll_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -490,7 +484,7 @@ static void ll_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -521,11 +515,12 @@ char *guestfs_ll (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, ll_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_ll");
     return NULL;
   }
@@ -545,8 +540,7 @@ struct ls_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -559,7 +553,6 @@ static void ls_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct ls_ctx *ctx = (struct ls_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -585,7 +578,7 @@ static void ls_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -616,11 +609,12 @@ char **guestfs_ls (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, ls_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_ls");
     return NULL;
   }
@@ -645,8 +639,7 @@ struct list_devices_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -659,7 +652,6 @@ static void list_devices_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct list_devices_ctx *ctx = (struct list_devices_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -685,7 +677,7 @@ static void list_devices_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -712,11 +704,12 @@ char **guestfs_list_devices (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, list_devices_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_list_devices");
     return NULL;
   }
@@ -741,8 +734,7 @@ struct list_partitions_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -755,7 +747,6 @@ static void list_partitions_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct list_partitions_ctx *ctx = (struct list_partitions_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -781,7 +772,7 @@ static void list_partitions_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -808,11 +799,12 @@ char **guestfs_list_partitions (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, list_partitions_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_list_partitions");
     return NULL;
   }
@@ -837,8 +829,7 @@ struct pvs_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -851,7 +842,6 @@ static void pvs_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct pvs_ctx *ctx = (struct pvs_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -877,7 +867,7 @@ static void pvs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -904,11 +894,12 @@ char **guestfs_pvs (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, pvs_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_pvs");
     return NULL;
   }
@@ -933,8 +924,7 @@ struct vgs_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -947,7 +937,6 @@ static void vgs_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct vgs_ctx *ctx = (struct vgs_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -973,7 +962,7 @@ static void vgs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1000,11 +989,12 @@ char **guestfs_vgs (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, vgs_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_vgs");
     return NULL;
   }
@@ -1029,8 +1019,7 @@ struct lvs_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1043,7 +1032,6 @@ static void lvs_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct lvs_ctx *ctx = (struct lvs_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1069,7 +1057,7 @@ static void lvs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1096,11 +1084,12 @@ char **guestfs_lvs (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, lvs_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_lvs");
     return NULL;
   }
@@ -1125,8 +1114,7 @@ struct pvs_full_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1139,7 +1127,6 @@ static void pvs_full_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct pvs_full_ctx *ctx = (struct pvs_full_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1165,7 +1152,7 @@ static void pvs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1192,11 +1179,12 @@ struct guestfs_lvm_pv_list *guestfs_pvs_full (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, pvs_full_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_pvs_full");
     return NULL;
   }
@@ -1217,8 +1205,7 @@ struct vgs_full_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1231,7 +1218,6 @@ static void vgs_full_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct vgs_full_ctx *ctx = (struct vgs_full_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1257,7 +1243,7 @@ static void vgs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1284,11 +1270,12 @@ struct guestfs_lvm_vg_list *guestfs_vgs_full (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, vgs_full_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_vgs_full");
     return NULL;
   }
@@ -1309,8 +1296,7 @@ struct lvs_full_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1323,7 +1309,6 @@ static void lvs_full_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct lvs_full_ctx *ctx = (struct lvs_full_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1349,7 +1334,7 @@ static void lvs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1376,11 +1361,12 @@ struct guestfs_lvm_lv_list *guestfs_lvs_full (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, lvs_full_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_lvs_full");
     return NULL;
   }
@@ -1401,8 +1387,7 @@ struct read_lines_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1415,7 +1400,6 @@ static void read_lines_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct read_lines_ctx *ctx = (struct read_lines_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1441,7 +1425,7 @@ static void read_lines_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1472,11 +1456,12 @@ char **guestfs_read_lines (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, read_lines_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_read_lines");
     return NULL;
   }
@@ -1501,8 +1486,7 @@ struct aug_init_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1514,7 +1498,6 @@ static void aug_init_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_init_ctx *ctx = (struct aug_init_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1536,7 +1519,7 @@ static void aug_init_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1569,11 +1552,12 @@ int guestfs_aug_init (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_init_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_init");
     return -1;
   }
@@ -1593,8 +1577,7 @@ struct aug_close_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1606,7 +1589,6 @@ static void aug_close_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_close_ctx *ctx = (struct aug_close_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1628,7 +1610,7 @@ static void aug_close_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1655,11 +1637,12 @@ int guestfs_aug_close (guestfs_h *g)
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_close_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_close");
     return -1;
   }
@@ -1679,8 +1662,7 @@ struct aug_defvar_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1693,7 +1675,6 @@ static void aug_defvar_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_defvar_ctx *ctx = (struct aug_defvar_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1719,7 +1700,7 @@ static void aug_defvar_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1752,11 +1733,12 @@ int guestfs_aug_defvar (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_defvar_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_defvar");
     return -1;
   }
@@ -1776,8 +1758,7 @@ struct aug_defnode_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1790,7 +1771,6 @@ static void aug_defnode_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_defnode_ctx *ctx = (struct aug_defnode_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1816,7 +1796,7 @@ static void aug_defnode_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1851,11 +1831,12 @@ struct guestfs_int_bool *guestfs_aug_defnode (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_defnode_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_defnode");
     return NULL;
   }
@@ -1876,8 +1857,7 @@ struct aug_get_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1890,7 +1870,6 @@ static void aug_get_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_get_ctx *ctx = (struct aug_get_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -1916,7 +1895,7 @@ static void aug_get_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -1947,11 +1926,12 @@ char *guestfs_aug_get (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_get_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_get");
     return NULL;
   }
@@ -1971,8 +1951,7 @@ struct aug_set_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -1984,7 +1963,6 @@ static void aug_set_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_set_ctx *ctx = (struct aug_set_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2006,7 +1984,7 @@ static void aug_set_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2039,11 +2017,12 @@ int guestfs_aug_set (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_set_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_set");
     return -1;
   }
@@ -2063,8 +2042,7 @@ struct aug_insert_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2076,7 +2054,6 @@ static void aug_insert_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_insert_ctx *ctx = (struct aug_insert_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2098,7 +2075,7 @@ static void aug_insert_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2133,11 +2110,12 @@ int guestfs_aug_insert (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_insert_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_insert");
     return -1;
   }
@@ -2157,8 +2135,7 @@ struct aug_rm_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2171,7 +2148,6 @@ static void aug_rm_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_rm_ctx *ctx = (struct aug_rm_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2197,7 +2173,7 @@ static void aug_rm_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2228,11 +2204,12 @@ int guestfs_aug_rm (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_rm_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_rm");
     return -1;
   }
@@ -2252,8 +2229,7 @@ struct aug_mv_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2265,7 +2241,6 @@ static void aug_mv_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_mv_ctx *ctx = (struct aug_mv_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2287,7 +2262,7 @@ static void aug_mv_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2320,11 +2295,12 @@ int guestfs_aug_mv (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_mv_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_mv");
     return -1;
   }
@@ -2344,8 +2320,7 @@ struct aug_match_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2358,7 +2333,6 @@ static void aug_match_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_match_ctx *ctx = (struct aug_match_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2384,7 +2358,7 @@ static void aug_match_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2415,11 +2389,12 @@ char **guestfs_aug_match (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_match_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_match");
     return NULL;
   }
@@ -2444,8 +2419,7 @@ struct aug_save_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2457,7 +2431,6 @@ static void aug_save_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_save_ctx *ctx = (struct aug_save_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2479,7 +2452,7 @@ static void aug_save_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2506,11 +2479,12 @@ int guestfs_aug_save (guestfs_h *g)
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_save_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_save");
     return -1;
   }
@@ -2530,8 +2504,7 @@ struct aug_load_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2543,7 +2516,6 @@ static void aug_load_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_load_ctx *ctx = (struct aug_load_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2565,7 +2537,7 @@ static void aug_load_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2592,11 +2564,12 @@ int guestfs_aug_load (guestfs_h *g)
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_load_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_load");
     return -1;
   }
@@ -2616,8 +2589,7 @@ struct aug_ls_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2630,7 +2602,6 @@ static void aug_ls_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct aug_ls_ctx *ctx = (struct aug_ls_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2656,7 +2627,7 @@ static void aug_ls_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2687,11 +2658,12 @@ char **guestfs_aug_ls (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, aug_ls_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_aug_ls");
     return NULL;
   }
@@ -2716,8 +2688,7 @@ struct rm_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2729,7 +2700,6 @@ static void rm_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct rm_ctx *ctx = (struct rm_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2751,7 +2721,7 @@ static void rm_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2782,11 +2752,12 @@ int guestfs_rm (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, rm_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_rm");
     return -1;
   }
@@ -2806,8 +2777,7 @@ struct rmdir_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2819,7 +2789,6 @@ static void rmdir_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct rmdir_ctx *ctx = (struct rmdir_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2841,7 +2810,7 @@ static void rmdir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2872,11 +2841,12 @@ int guestfs_rmdir (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, rmdir_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_rmdir");
     return -1;
   }
@@ -2896,8 +2866,7 @@ struct rm_rf_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2909,7 +2878,6 @@ static void rm_rf_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct rm_rf_ctx *ctx = (struct rm_rf_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -2931,7 +2899,7 @@ static void rm_rf_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -2962,11 +2930,12 @@ int guestfs_rm_rf (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, rm_rf_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_rm_rf");
     return -1;
   }
@@ -2986,8 +2955,7 @@ struct mkdir_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -2999,7 +2967,6 @@ static void mkdir_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct mkdir_ctx *ctx = (struct mkdir_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3021,7 +2988,7 @@ static void mkdir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3052,11 +3019,12 @@ int guestfs_mkdir (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, mkdir_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_mkdir");
     return -1;
   }
@@ -3076,8 +3044,7 @@ struct mkdir_p_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3089,7 +3056,6 @@ static void mkdir_p_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct mkdir_p_ctx *ctx = (struct mkdir_p_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3111,7 +3077,7 @@ static void mkdir_p_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3142,11 +3108,12 @@ int guestfs_mkdir_p (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, mkdir_p_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_mkdir_p");
     return -1;
   }
@@ -3166,8 +3133,7 @@ struct chmod_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3179,7 +3145,6 @@ static void chmod_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct chmod_ctx *ctx = (struct chmod_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3201,7 +3166,7 @@ static void chmod_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3234,11 +3199,12 @@ int guestfs_chmod (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, chmod_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_chmod");
     return -1;
   }
@@ -3258,8 +3224,7 @@ struct chown_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3271,7 +3236,6 @@ static void chown_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct chown_ctx *ctx = (struct chown_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3293,7 +3257,7 @@ static void chown_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3328,11 +3292,12 @@ int guestfs_chown (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, chown_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_chown");
     return -1;
   }
@@ -3352,8 +3317,7 @@ struct exists_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3366,7 +3330,6 @@ static void exists_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct exists_ctx *ctx = (struct exists_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3392,7 +3355,7 @@ static void exists_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3423,11 +3386,12 @@ int guestfs_exists (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, exists_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_exists");
     return -1;
   }
@@ -3447,8 +3411,7 @@ struct is_file_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3461,7 +3424,6 @@ static void is_file_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct is_file_ctx *ctx = (struct is_file_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3487,7 +3449,7 @@ static void is_file_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3518,11 +3480,12 @@ int guestfs_is_file (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, is_file_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_is_file");
     return -1;
   }
@@ -3542,8 +3505,7 @@ struct is_dir_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3556,7 +3518,6 @@ static void is_dir_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct is_dir_ctx *ctx = (struct is_dir_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3582,7 +3543,7 @@ static void is_dir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3613,11 +3574,12 @@ int guestfs_is_dir (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, is_dir_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_is_dir");
     return -1;
   }
@@ -3637,8 +3599,7 @@ struct pvcreate_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3650,7 +3611,6 @@ static void pvcreate_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct pvcreate_ctx *ctx = (struct pvcreate_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3672,7 +3632,7 @@ static void pvcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3703,11 +3663,12 @@ int guestfs_pvcreate (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, pvcreate_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_pvcreate");
     return -1;
   }
@@ -3727,8 +3688,7 @@ struct vgcreate_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3740,7 +3700,6 @@ static void vgcreate_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct vgcreate_ctx *ctx = (struct vgcreate_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3762,7 +3721,7 @@ static void vgcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3796,11 +3755,12 @@ int guestfs_vgcreate (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, vgcreate_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_vgcreate");
     return -1;
   }
@@ -3820,8 +3780,7 @@ struct lvcreate_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3833,7 +3792,6 @@ static void lvcreate_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct lvcreate_ctx *ctx = (struct lvcreate_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3855,7 +3813,7 @@ static void lvcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3890,11 +3848,12 @@ int guestfs_lvcreate (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, lvcreate_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_lvcreate");
     return -1;
   }
@@ -3914,8 +3873,7 @@ struct mkfs_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -3927,7 +3885,6 @@ static void mkfs_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct mkfs_ctx *ctx = (struct mkfs_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -3949,7 +3906,7 @@ static void mkfs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -3982,11 +3939,12 @@ int guestfs_mkfs (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, mkfs_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_mkfs");
     return -1;
   }
@@ -4006,8 +3964,7 @@ struct sfdisk_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4019,7 +3976,6 @@ static void sfdisk_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct sfdisk_ctx *ctx = (struct sfdisk_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4041,7 +3997,7 @@ static void sfdisk_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4081,11 +4037,12 @@ int guestfs_sfdisk (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, sfdisk_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_sfdisk");
     return -1;
   }
@@ -4105,8 +4062,7 @@ struct write_file_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4118,7 +4074,6 @@ static void write_file_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct write_file_ctx *ctx = (struct write_file_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4140,7 +4095,7 @@ static void write_file_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4175,11 +4130,12 @@ int guestfs_write_file (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, write_file_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_write_file");
     return -1;
   }
@@ -4199,8 +4155,7 @@ struct umount_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4212,7 +4167,6 @@ static void umount_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct umount_ctx *ctx = (struct umount_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4234,7 +4188,7 @@ static void umount_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4265,11 +4219,12 @@ int guestfs_umount (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, umount_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_umount");
     return -1;
   }
@@ -4289,8 +4244,7 @@ struct mounts_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4303,7 +4257,6 @@ static void mounts_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct mounts_ctx *ctx = (struct mounts_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4329,7 +4282,7 @@ static void mounts_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4356,11 +4309,12 @@ char **guestfs_mounts (guestfs_h *g)
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, mounts_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_mounts");
     return NULL;
   }
@@ -4385,8 +4339,7 @@ struct umount_all_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4398,7 +4351,6 @@ static void umount_all_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct umount_all_ctx *ctx = (struct umount_all_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4420,7 +4372,7 @@ static void umount_all_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4447,11 +4399,12 @@ int guestfs_umount_all (guestfs_h *g)
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, umount_all_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_umount_all");
     return -1;
   }
@@ -4471,8 +4424,7 @@ struct lvm_remove_all_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4484,7 +4436,6 @@ static void lvm_remove_all_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct lvm_remove_all_ctx *ctx = (struct lvm_remove_all_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4506,7 +4457,7 @@ static void lvm_remove_all_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4533,11 +4484,12 @@ int guestfs_lvm_remove_all (guestfs_h *g)
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, lvm_remove_all_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_lvm_remove_all");
     return -1;
   }
@@ -4557,8 +4509,7 @@ struct file_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4571,7 +4522,6 @@ static void file_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct file_ctx *ctx = (struct file_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4597,7 +4547,7 @@ static void file_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4628,11 +4578,12 @@ char *guestfs_file (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, file_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_file");
     return NULL;
   }
@@ -4652,8 +4603,7 @@ struct command_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4666,7 +4616,6 @@ static void command_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct command_ctx *ctx = (struct command_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4692,7 +4641,7 @@ static void command_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4724,11 +4673,12 @@ char *guestfs_command (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, command_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_command");
     return NULL;
   }
@@ -4748,8 +4698,7 @@ struct command_lines_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4762,7 +4711,6 @@ static void command_lines_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct command_lines_ctx *ctx = (struct command_lines_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4788,7 +4736,7 @@ static void command_lines_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4820,11 +4768,12 @@ char **guestfs_command_lines (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, command_lines_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_command_lines");
     return NULL;
   }
@@ -4849,8 +4798,7 @@ struct stat_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4863,7 +4811,6 @@ static void stat_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct stat_ctx *ctx = (struct stat_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4889,7 +4836,7 @@ static void stat_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -4920,11 +4867,12 @@ struct guestfs_stat *guestfs_stat (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, stat_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_stat");
     return NULL;
   }
@@ -4945,8 +4893,7 @@ struct lstat_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -4959,7 +4906,6 @@ static void lstat_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct lstat_ctx *ctx = (struct lstat_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -4985,7 +4931,7 @@ static void lstat_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5016,11 +4962,12 @@ struct guestfs_stat *guestfs_lstat (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, lstat_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_lstat");
     return NULL;
   }
@@ -5041,8 +4988,7 @@ struct statvfs_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5055,7 +5001,6 @@ static void statvfs_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct statvfs_ctx *ctx = (struct statvfs_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5081,7 +5026,7 @@ static void statvfs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5112,11 +5057,12 @@ struct guestfs_statvfs *guestfs_statvfs (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, statvfs_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_statvfs");
     return NULL;
   }
@@ -5137,8 +5083,7 @@ struct tune2fs_l_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5151,7 +5096,6 @@ static void tune2fs_l_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct tune2fs_l_ctx *ctx = (struct tune2fs_l_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5177,7 +5121,7 @@ static void tune2fs_l_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5208,11 +5152,12 @@ char **guestfs_tune2fs_l (guestfs_h *g,
     return NULL;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, tune2fs_l_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_tune2fs_l");
     return NULL;
   }
@@ -5237,8 +5182,7 @@ struct blockdev_setro_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5250,7 +5194,6 @@ static void blockdev_setro_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_setro_ctx *ctx = (struct blockdev_setro_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5272,7 +5215,7 @@ static void blockdev_setro_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5303,11 +5246,12 @@ int guestfs_blockdev_setro (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_setro_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_setro");
     return -1;
   }
@@ -5327,8 +5271,7 @@ struct blockdev_setrw_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5340,7 +5283,6 @@ static void blockdev_setrw_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_setrw_ctx *ctx = (struct blockdev_setrw_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5362,7 +5304,7 @@ static void blockdev_setrw_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5393,11 +5335,12 @@ int guestfs_blockdev_setrw (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_setrw_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_setrw");
     return -1;
   }
@@ -5417,8 +5360,7 @@ struct blockdev_getro_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5431,7 +5373,6 @@ static void blockdev_getro_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_getro_ctx *ctx = (struct blockdev_getro_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5457,7 +5398,7 @@ static void blockdev_getro_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5488,11 +5429,12 @@ int guestfs_blockdev_getro (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_getro_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getro");
     return -1;
   }
@@ -5512,8 +5454,7 @@ struct blockdev_getss_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5526,7 +5467,6 @@ static void blockdev_getss_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_getss_ctx *ctx = (struct blockdev_getss_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5552,7 +5492,7 @@ static void blockdev_getss_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5583,11 +5523,12 @@ int guestfs_blockdev_getss (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_getss_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getss");
     return -1;
   }
@@ -5607,8 +5548,7 @@ struct blockdev_getbsz_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5621,7 +5561,6 @@ static void blockdev_getbsz_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_getbsz_ctx *ctx = (struct blockdev_getbsz_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5647,7 +5586,7 @@ static void blockdev_getbsz_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5678,11 +5617,12 @@ int guestfs_blockdev_getbsz (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_getbsz_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getbsz");
     return -1;
   }
@@ -5702,8 +5642,7 @@ struct blockdev_setbsz_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5715,7 +5654,6 @@ static void blockdev_setbsz_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_setbsz_ctx *ctx = (struct blockdev_setbsz_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5737,7 +5675,7 @@ static void blockdev_setbsz_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5770,11 +5708,12 @@ int guestfs_blockdev_setbsz (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_setbsz_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_setbsz");
     return -1;
   }
@@ -5794,8 +5733,7 @@ struct blockdev_getsz_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5808,7 +5746,6 @@ static void blockdev_getsz_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_getsz_ctx *ctx = (struct blockdev_getsz_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5834,7 +5771,7 @@ static void blockdev_getsz_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5865,11 +5802,12 @@ int64_t guestfs_blockdev_getsz (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_getsz_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getsz");
     return -1;
   }
@@ -5889,8 +5827,7 @@ struct blockdev_getsize64_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5903,7 +5840,6 @@ static void blockdev_getsize64_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_getsize64_ctx *ctx = (struct blockdev_getsize64_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -5929,7 +5865,7 @@ static void blockdev_getsize64_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     return;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -5960,11 +5896,12 @@ int64_t guestfs_blockdev_getsize64 (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_getsize64_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getsize64");
     return -1;
   }
@@ -5984,8 +5921,7 @@ struct blockdev_flushbufs_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -5997,7 +5933,6 @@ static void blockdev_flushbufs_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_flushbufs_ctx *ctx = (struct blockdev_flushbufs_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -6019,7 +5954,7 @@ static void blockdev_flushbufs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -6050,11 +5985,12 @@ int guestfs_blockdev_flushbufs (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_flushbufs_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_flushbufs");
     return -1;
   }
@@ -6074,8 +6010,7 @@ struct blockdev_rereadpt_ctx {
   /* This flag is set by the callbacks, so we know we've done
    * the callbacks as expected, and in the right sequence.
    * 0 = not called, 1 = send called,
-   * 2.. = send_file called,
-   * 1000 = reply called.
+   * 1001 = reply called.
    */
   int cb_sequence;
   struct guestfs_message_header hdr;
@@ -6087,7 +6022,6 @@ static void blockdev_rereadpt_send_cb (guestfs_h *g, void *data)
   guestfs_main_loop *ml = guestfs_get_main_loop (g);
   struct blockdev_rereadpt_ctx *ctx = (struct blockdev_rereadpt_ctx *) data;
 
-  guestfs__switch_to_receiving (g);
   ctx->cb_sequence = 1;
   ml->main_loop_quit (ml, g);
 }
@@ -6109,7 +6043,7 @@ static void blockdev_rereadpt_reply_cb (guestfs_h *g, void *data, XDR *xdr)
     goto done;
   }
  done:
-  ctx->cb_sequence = 1000;
+  ctx->cb_sequence = 1001;
   ml->main_loop_quit (ml, g);
 }
 
@@ -6140,11 +6074,12 @@ int guestfs_blockdev_rereadpt (guestfs_h *g,
     return -1;
   }
 
+  guestfs__switch_to_receiving (g);
   ctx.cb_sequence = 0;
   guestfs_set_reply_callback (g, blockdev_rereadpt_reply_cb, &ctx);
   (void) ml->main_loop_run (ml, g);
   guestfs_set_reply_callback (g, NULL, NULL);
-  if (ctx.cb_sequence != 1000) {
+  if (ctx.cb_sequence != 1001) {
     error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_rereadpt");
     return -1;
   }
@@ -6160,3 +6095,189 @@ int guestfs_blockdev_rereadpt (guestfs_h *g,
   return 0;
 }
 
+struct upload_ctx {
+  /* This flag is set by the callbacks, so we know we've done
+   * the callbacks as expected, and in the right sequence.
+   * 0 = not called, 1 = send called,
+   * 1001 = reply called.
+   */
+  int cb_sequence;
+  struct guestfs_message_header hdr;
+  struct guestfs_message_error err;
+};
+
+static void upload_send_cb (guestfs_h *g, void *data)
+{
+  guestfs_main_loop *ml = guestfs_get_main_loop (g);
+  struct upload_ctx *ctx = (struct upload_ctx *) data;
+
+  ctx->cb_sequence = 1;
+  ml->main_loop_quit (ml, g);
+}
+
+static void upload_reply_cb (guestfs_h *g, void *data, XDR *xdr)
+{
+  guestfs_main_loop *ml = guestfs_get_main_loop (g);
+  struct upload_ctx *ctx = (struct upload_ctx *) data;
+
+  if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
+    error (g, "%s: failed to parse reply header", "guestfs_upload");
+    return;
+  }
+  if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
+    if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
+      error (g, "%s: failed to parse reply error", "guestfs_upload");
+      return;
+    }
+    goto done;
+  }
+ done:
+  ctx->cb_sequence = 1001;
+  ml->main_loop_quit (ml, g);
+}
+
+int guestfs_upload (guestfs_h *g,
+               const char *filename,
+               const char *remotefilename)
+{
+  struct guestfs_upload_args args;
+  struct upload_ctx ctx;
+  guestfs_main_loop *ml = guestfs_get_main_loop (g);
+  int serial;
+
+  if (check_state (g, "guestfs_upload") == -1) return -1;
+
+  memset (&ctx, 0, sizeof ctx);
+
+  args.remotefilename = (char *) remotefilename;
+  serial = guestfs__send (g, GUESTFS_PROC_UPLOAD,
+        (xdrproc_t) xdr_guestfs_upload_args, (char *) &args);
+  if (serial == -1)
+    return -1;
+
+  ctx.cb_sequence = 0;
+  guestfs_set_send_callback (g, upload_send_cb, &ctx);
+  (void) ml->main_loop_run (ml, g);
+  guestfs_set_send_callback (g, NULL, NULL);
+  if (ctx.cb_sequence != 1) {
+    error (g, "%s send failed, see earlier error messages", "guestfs_upload");
+    return -1;
+  }
+
+  if (guestfs__send_file_sync (ml, g, filename) == -1)
+    return -1;
+
+  guestfs__switch_to_receiving (g);
+  ctx.cb_sequence = 0;
+  guestfs_set_reply_callback (g, upload_reply_cb, &ctx);
+  (void) ml->main_loop_run (ml, g);
+  guestfs_set_reply_callback (g, NULL, NULL);
+  if (ctx.cb_sequence != 1001) {
+    error (g, "%s reply failed, see earlier error messages", "guestfs_upload");
+    return -1;
+  }
+
+  if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_UPLOAD, serial) == -1)
+    return -1;
+
+  if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
+    error (g, "%s", ctx.err.error_message);
+    return -1;
+  }
+
+  return 0;
+}
+
+struct download_ctx {
+  /* This flag is set by the callbacks, so we know we've done
+   * the callbacks as expected, and in the right sequence.
+   * 0 = not called, 1 = send called,
+   * 1001 = reply called.
+   */
+  int cb_sequence;
+  struct guestfs_message_header hdr;
+  struct guestfs_message_error err;
+};
+
+static void download_send_cb (guestfs_h *g, void *data)
+{
+  guestfs_main_loop *ml = guestfs_get_main_loop (g);
+  struct download_ctx *ctx = (struct download_ctx *) data;
+
+  ctx->cb_sequence = 1;
+  ml->main_loop_quit (ml, g);
+}
+
+static void download_reply_cb (guestfs_h *g, void *data, XDR *xdr)
+{
+  guestfs_main_loop *ml = guestfs_get_main_loop (g);
+  struct download_ctx *ctx = (struct download_ctx *) data;
+
+  if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
+    error (g, "%s: failed to parse reply header", "guestfs_download");
+    return;
+  }
+  if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
+    if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
+      error (g, "%s: failed to parse reply error", "guestfs_download");
+      return;
+    }
+    goto done;
+  }
+ done:
+  ctx->cb_sequence = 1001;
+  ml->main_loop_quit (ml, g);
+}
+
+int guestfs_download (guestfs_h *g,
+               const char *remotefilename,
+               const char *filename)
+{
+  struct guestfs_download_args args;
+  struct download_ctx ctx;
+  guestfs_main_loop *ml = guestfs_get_main_loop (g);
+  int serial;
+
+  if (check_state (g, "guestfs_download") == -1) return -1;
+
+  memset (&ctx, 0, sizeof ctx);
+
+  args.remotefilename = (char *) remotefilename;
+  serial = guestfs__send (g, GUESTFS_PROC_DOWNLOAD,
+        (xdrproc_t) xdr_guestfs_download_args, (char *) &args);
+  if (serial == -1)
+    return -1;
+
+  ctx.cb_sequence = 0;
+  guestfs_set_send_callback (g, download_send_cb, &ctx);
+  (void) ml->main_loop_run (ml, g);
+  guestfs_set_send_callback (g, NULL, NULL);
+  if (ctx.cb_sequence != 1) {
+    error (g, "%s send failed, see earlier error messages", "guestfs_download");
+    return -1;
+  }
+
+  guestfs__switch_to_receiving (g);
+  ctx.cb_sequence = 0;
+  guestfs_set_reply_callback (g, download_reply_cb, &ctx);
+  (void) ml->main_loop_run (ml, g);
+  guestfs_set_reply_callback (g, NULL, NULL);
+  if (ctx.cb_sequence != 1001) {
+    error (g, "%s reply failed, see earlier error messages", "guestfs_download");
+    return -1;
+  }
+
+  if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_DOWNLOAD, serial) == -1)
+    return -1;
+
+  if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
+    error (g, "%s", ctx.err.error_message);
+    return -1;
+  }
+
+  if (guestfs__receive_file_sync (ml, g, filename) == -1)
+    return -1;
+
+  return 0;
+}
+
index 9ad13f6..2ec2d40 100644 (file)
@@ -101,3 +101,5 @@ extern int64_t guestfs_blockdev_getsz (guestfs_h *handle, const char *device);
 extern int64_t guestfs_blockdev_getsize64 (guestfs_h *handle, const char *device);
 extern int guestfs_blockdev_flushbufs (guestfs_h *handle, const char *device);
 extern int guestfs_blockdev_rereadpt (guestfs_h *handle, const char *device);
+extern int guestfs_upload (guestfs_h *handle, const char *filename, const char *remotefilename);
+extern int guestfs_download (guestfs_h *handle, const char *remotefilename, const char *filename);
index 47272f2..fd42f19 100644 (file)
@@ -1428,11 +1428,25 @@ guestfs__switch_to_receiving (guestfs_h *g)
   return 0;
 }
 
+int
+guestfs__send_file_sync (guestfs_main_loop *ml, guestfs_h *g,
+                        const char *filename)
+{
+  return -1;
+}
+
+int
+guestfs__receive_file_sync (guestfs_main_loop *ml, guestfs_h *g,
+                           const char *filename)
+{
+  return -1;
+}
+
 #if 0
 static int cancel = 0; /* XXX Implement file cancellation. */
 
-static int
-send_file (guestfs_h *g, const char *filename)
+int
+guestfs__send_file (guestfs_h *g, const char *filename)
 {
   char buf[GUESTFS_MAX_CHUNK_SIZE];
   int fd, r;
index 39b2687..2b49cbe 100644 (file)
@@ -27,6 +27,7 @@
 #include <rpc/xdr.h>
 
 typedef struct guestfs_h guestfs_h;
+typedef struct guestfs_main_loop guestfs_main_loop;
 
 /* Connection management. */
 extern guestfs_h *guestfs_create (void);
@@ -76,6 +77,8 @@ extern void *guestfs_safe_memdup (guestfs_h *g, void *ptr, size_t size);
 extern int guestfs__send (guestfs_h *g, int proc_nr, xdrproc_t xdrp, char *args);
 extern int guestfs__switch_to_sending (guestfs_h *g);
 extern int guestfs__switch_to_receiving (guestfs_h *g);
+extern int guestfs__send_file_sync (guestfs_main_loop *ml, guestfs_h *g, const char *filename);
+extern int guestfs__receive_file_sync (guestfs_main_loop *ml, guestfs_h *g, const char *filename);
 
 /* Main loop. */
 #define GUESTFS_HANDLE_READABLE 0x1
@@ -83,16 +86,14 @@ extern int guestfs__switch_to_receiving (guestfs_h *g);
 #define GUESTFS_HANDLE_HANGUP   0x4
 #define GUESTFS_HANDLE_ERROR    0x8
 
-struct guestfs_main_loop;
-
-typedef void (*guestfs_handle_event_cb) (struct guestfs_main_loop *ml, guestfs_h *g, void *data, int watch, int fd, int events);
-typedef int (*guestfs_add_handle_cb) (struct guestfs_main_loop *ml, guestfs_h *g, int fd, int events, guestfs_handle_event_cb cb, void *data);
-typedef int (*guestfs_remove_handle_cb) (struct guestfs_main_loop *ml, guestfs_h *g, int watch);
-typedef void (*guestfs_handle_timeout_cb) (struct guestfs_main_loop *ml, guestfs_h *g, void *data, int timer);
-typedef int (*guestfs_add_timeout_cb) (struct guestfs_main_loop *ml, guestfs_h *g, int interval, guestfs_handle_timeout_cb cb, void *data);
-typedef int (*guestfs_remove_timeout_cb) (struct guestfs_main_loop *ml, guestfs_h *g, int timer);
-typedef int (*guestfs_main_loop_run_cb) (struct guestfs_main_loop *ml, guestfs_h *g);
-typedef int (*guestfs_main_loop_quit_cb) (struct guestfs_main_loop *ml, guestfs_h *g);
+typedef void (*guestfs_handle_event_cb) (guestfs_main_loop *ml, guestfs_h *g, void *data, int watch, int fd, int events);
+typedef int (*guestfs_add_handle_cb) (guestfs_main_loop *ml, guestfs_h *g, int fd, int events, guestfs_handle_event_cb cb, void *data);
+typedef int (*guestfs_remove_handle_cb) (guestfs_main_loop *ml, guestfs_h *g, int watch);
+typedef void (*guestfs_handle_timeout_cb) (guestfs_main_loop *ml, guestfs_h *g, void *data, int timer);
+typedef int (*guestfs_add_timeout_cb) (guestfs_main_loop *ml, guestfs_h *g, int interval, guestfs_handle_timeout_cb cb, void *data);
+typedef int (*guestfs_remove_timeout_cb) (guestfs_main_loop *ml, guestfs_h *g, int timer);
+typedef int (*guestfs_main_loop_run_cb) (guestfs_main_loop *ml, guestfs_h *g);
+typedef int (*guestfs_main_loop_quit_cb) (guestfs_main_loop *ml, guestfs_h *g);
 
 /* This is the head of the main loop structure.  Concrete implementations
  * use additional private data after this struct.
@@ -105,7 +106,6 @@ struct guestfs_main_loop {
   guestfs_main_loop_run_cb main_loop_run;
   guestfs_main_loop_quit_cb main_loop_quit;
 };
-typedef struct guestfs_main_loop guestfs_main_loop;
 
 extern void guestfs_set_main_loop (guestfs_h *handle, guestfs_main_loop *main_loop);
 extern guestfs_main_loop *guestfs_get_main_loop (guestfs_h *handle);
index c4246d6..24b14a0 100644 (file)
@@ -1187,6 +1187,26 @@ xdr_guestfs_blockdev_rereadpt_args (XDR *xdrs, guestfs_blockdev_rereadpt_args *o
 }
 
 bool_t
+xdr_guestfs_upload_args (XDR *xdrs, guestfs_upload_args *objp)
+{
+       register int32_t *buf;
+
+        if (!xdr_string (xdrs, &objp->remotefilename, ~0))
+                return FALSE;
+       return TRUE;
+}
+
+bool_t
+xdr_guestfs_download_args (XDR *xdrs, guestfs_download_args *objp)
+{
+       register int32_t *buf;
+
+        if (!xdr_string (xdrs, &objp->remotefilename, ~0))
+                return FALSE;
+       return TRUE;
+}
+
+bool_t
 xdr_guestfs_procedure (XDR *xdrs, guestfs_procedure *objp)
 {
        register int32_t *buf;
index c863c85..0747a38 100644 (file)
@@ -616,6 +616,16 @@ struct guestfs_blockdev_rereadpt_args {
 };
 typedef struct guestfs_blockdev_rereadpt_args guestfs_blockdev_rereadpt_args;
 
+struct guestfs_upload_args {
+       char *remotefilename;
+};
+typedef struct guestfs_upload_args guestfs_upload_args;
+
+struct guestfs_download_args {
+       char *remotefilename;
+};
+typedef struct guestfs_download_args guestfs_download_args;
+
 enum guestfs_procedure {
        GUESTFS_PROC_MOUNT = 1,
        GUESTFS_PROC_SYNC = 2,
@@ -682,7 +692,9 @@ enum guestfs_procedure {
        GUESTFS_PROC_BLOCKDEV_GETSIZE64 = 63,
        GUESTFS_PROC_BLOCKDEV_FLUSHBUFS = 64,
        GUESTFS_PROC_BLOCKDEV_REREADPT = 65,
-       GUESTFS_PROC_NR_PROCS = 65 + 1,
+       GUESTFS_PROC_UPLOAD = 66,
+       GUESTFS_PROC_DOWNLOAD = 67,
+       GUESTFS_PROC_NR_PROCS = 67 + 1,
 };
 typedef enum guestfs_procedure guestfs_procedure;
 #define GUESTFS_MESSAGE_MAX 4194304
@@ -823,6 +835,8 @@ extern  bool_t xdr_guestfs_blockdev_getsize64_args (XDR *, guestfs_blockdev_gets
 extern  bool_t xdr_guestfs_blockdev_getsize64_ret (XDR *, guestfs_blockdev_getsize64_ret*);
 extern  bool_t xdr_guestfs_blockdev_flushbufs_args (XDR *, guestfs_blockdev_flushbufs_args*);
 extern  bool_t xdr_guestfs_blockdev_rereadpt_args (XDR *, guestfs_blockdev_rereadpt_args*);
+extern  bool_t xdr_guestfs_upload_args (XDR *, guestfs_upload_args*);
+extern  bool_t xdr_guestfs_download_args (XDR *, guestfs_download_args*);
 extern  bool_t xdr_guestfs_procedure (XDR *, guestfs_procedure*);
 extern  bool_t xdr_guestfs_message_direction (XDR *, guestfs_message_direction*);
 extern  bool_t xdr_guestfs_message_status (XDR *, guestfs_message_status*);
@@ -924,6 +938,8 @@ extern bool_t xdr_guestfs_blockdev_getsize64_args ();
 extern bool_t xdr_guestfs_blockdev_getsize64_ret ();
 extern bool_t xdr_guestfs_blockdev_flushbufs_args ();
 extern bool_t xdr_guestfs_blockdev_rereadpt_args ();
+extern bool_t xdr_guestfs_upload_args ();
+extern bool_t xdr_guestfs_download_args ();
 extern bool_t xdr_guestfs_procedure ();
 extern bool_t xdr_guestfs_message_direction ();
 extern bool_t xdr_guestfs_message_status ();
index d68a60a..4291809 100644 (file)
@@ -475,6 +475,14 @@ struct guestfs_blockdev_rereadpt_args {
   string device<>;
 };
 
+struct guestfs_upload_args {
+  string remotefilename<>;
+};
+
+struct guestfs_download_args {
+  string remotefilename<>;
+};
+
 enum guestfs_procedure {
   GUESTFS_PROC_MOUNT = 1,
   GUESTFS_PROC_SYNC = 2,
@@ -541,6 +549,8 @@ enum guestfs_procedure {
   GUESTFS_PROC_BLOCKDEV_GETSIZE64 = 63,
   GUESTFS_PROC_BLOCKDEV_FLUSHBUFS = 64,
   GUESTFS_PROC_BLOCKDEV_REREADPT = 65,
+  GUESTFS_PROC_UPLOAD = 66,
+  GUESTFS_PROC_DOWNLOAD = 67,
   GUESTFS_PROC_NR_PROCS
 };
 
diff --git a/tests.c b/tests.c
index 7feee5c..f1cf32a 100644 (file)
--- a/tests.c
+++ b/tests.c
@@ -99,6 +99,8 @@ static void no_test_warnings (void)
   fprintf (stderr, "warning: \"guestfs_command_lines\" has no tests\n");
   fprintf (stderr, "warning: \"guestfs_tune2fs_l\" has no tests\n");
   fprintf (stderr, "warning: \"guestfs_blockdev_setbsz\" has no tests\n");
+  fprintf (stderr, "warning: \"guestfs_upload\" has no tests\n");
+  fprintf (stderr, "warning: \"guestfs_download\" has no tests\n");
 }
 
 static int test_blockdev_rereadpt_0 (void)