1 /* libguestfs generated file
2 * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
3 * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
5 * Copyright (C) 2009 Red Hat Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "guestfs_protocol.h"
28 #define error guestfs_error
29 #define perrorf guestfs_perrorf
30 #define safe_malloc guestfs_safe_malloc
31 #define safe_realloc guestfs_safe_realloc
32 #define safe_strdup guestfs_safe_strdup
33 #define safe_memdup guestfs_safe_memdup
35 /* Check the return message from a call for validity. */
37 check_reply_header (guestfs_h *g,
38 const struct guestfs_message_header *hdr,
39 int proc_nr, int serial)
41 if (hdr->prog != GUESTFS_PROGRAM) {
42 error (g, "wrong program (%d/%d)", hdr->prog, GUESTFS_PROGRAM);
45 if (hdr->vers != GUESTFS_PROTOCOL_VERSION) {
46 error (g, "wrong protocol version (%d/%d)",
47 hdr->vers, GUESTFS_PROTOCOL_VERSION);
50 if (hdr->direction != GUESTFS_DIRECTION_REPLY) {
51 error (g, "unexpected message direction (%d/%d)",
52 hdr->direction, GUESTFS_DIRECTION_REPLY);
55 if (hdr->proc != proc_nr) {
56 error (g, "unexpected procedure number (%d/%d)", hdr->proc, proc_nr);
59 if (hdr->serial != serial) {
60 error (g, "unexpected serial (%d/%d)", hdr->serial, serial);
67 /* Check we are in the right state to run a high-level action. */
69 check_state (guestfs_h *g, const char *caller)
71 if (!guestfs_is_ready (g)) {
72 if (guestfs_is_config (g))
73 error (g, "%s: call launch() before using this function",
75 else if (guestfs_is_launching (g))
76 error (g, "%s: call wait_ready() before using this function",
79 error (g, "%s called from the wrong state, %d != READY",
80 caller, guestfs_get_state (g));
87 /* This flag is set by the callbacks, so we know we've done
88 * the callbacks as expected, and in the right sequence.
89 * 0 = not called, 1 = send called,
90 * 1001 = reply called.
93 struct guestfs_message_header hdr;
94 struct guestfs_message_error err;
97 static void mount_reply_cb (guestfs_h *g, void *data, XDR *xdr)
99 guestfs_main_loop *ml = guestfs_get_main_loop (g);
100 struct mount_ctx *ctx = (struct mount_ctx *) data;
102 ml->main_loop_quit (ml, g);
104 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
105 error (g, "%s: failed to parse reply header", "guestfs_mount");
108 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
109 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
110 error (g, "%s: failed to parse reply error", "guestfs_mount");
116 ctx->cb_sequence = 1001;
119 int guestfs_mount (guestfs_h *g,
121 const char *mountpoint)
123 struct guestfs_mount_args args;
124 struct mount_ctx ctx;
125 guestfs_main_loop *ml = guestfs_get_main_loop (g);
128 if (check_state (g, "guestfs_mount") == -1) return -1;
129 guestfs_set_busy (g);
131 memset (&ctx, 0, sizeof ctx);
133 args.device = (char *) device;
134 args.mountpoint = (char *) mountpoint;
135 serial = guestfs__send_sync (g, GUESTFS_PROC_MOUNT,
136 (xdrproc_t) xdr_guestfs_mount_args, (char *) &args);
138 guestfs_set_ready (g);
143 guestfs__switch_to_receiving (g);
145 guestfs_set_reply_callback (g, mount_reply_cb, &ctx);
146 (void) ml->main_loop_run (ml, g);
147 guestfs_set_reply_callback (g, NULL, NULL);
148 if (ctx.cb_sequence != 1001) {
149 error (g, "%s reply failed, see earlier error messages", "guestfs_mount");
150 guestfs_set_ready (g);
154 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MOUNT, serial) == -1) {
155 guestfs_set_ready (g);
159 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
160 error (g, "%s", ctx.err.error_message);
161 guestfs_set_ready (g);
165 guestfs_set_ready (g);
170 /* This flag is set by the callbacks, so we know we've done
171 * the callbacks as expected, and in the right sequence.
172 * 0 = not called, 1 = send called,
173 * 1001 = reply called.
176 struct guestfs_message_header hdr;
177 struct guestfs_message_error err;
180 static void sync_reply_cb (guestfs_h *g, void *data, XDR *xdr)
182 guestfs_main_loop *ml = guestfs_get_main_loop (g);
183 struct sync_ctx *ctx = (struct sync_ctx *) data;
185 ml->main_loop_quit (ml, g);
187 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
188 error (g, "%s: failed to parse reply header", "guestfs_sync");
191 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
192 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
193 error (g, "%s: failed to parse reply error", "guestfs_sync");
199 ctx->cb_sequence = 1001;
202 int guestfs_sync (guestfs_h *g)
205 guestfs_main_loop *ml = guestfs_get_main_loop (g);
208 if (check_state (g, "guestfs_sync") == -1) return -1;
209 guestfs_set_busy (g);
211 memset (&ctx, 0, sizeof ctx);
213 serial = guestfs__send_sync (g, GUESTFS_PROC_SYNC, NULL, NULL);
215 guestfs_set_ready (g);
220 guestfs__switch_to_receiving (g);
222 guestfs_set_reply_callback (g, sync_reply_cb, &ctx);
223 (void) ml->main_loop_run (ml, g);
224 guestfs_set_reply_callback (g, NULL, NULL);
225 if (ctx.cb_sequence != 1001) {
226 error (g, "%s reply failed, see earlier error messages", "guestfs_sync");
227 guestfs_set_ready (g);
231 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_SYNC, serial) == -1) {
232 guestfs_set_ready (g);
236 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
237 error (g, "%s", ctx.err.error_message);
238 guestfs_set_ready (g);
242 guestfs_set_ready (g);
247 /* This flag is set by the callbacks, so we know we've done
248 * the callbacks as expected, and in the right sequence.
249 * 0 = not called, 1 = send called,
250 * 1001 = reply called.
253 struct guestfs_message_header hdr;
254 struct guestfs_message_error err;
257 static void touch_reply_cb (guestfs_h *g, void *data, XDR *xdr)
259 guestfs_main_loop *ml = guestfs_get_main_loop (g);
260 struct touch_ctx *ctx = (struct touch_ctx *) data;
262 ml->main_loop_quit (ml, g);
264 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
265 error (g, "%s: failed to parse reply header", "guestfs_touch");
268 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
269 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
270 error (g, "%s: failed to parse reply error", "guestfs_touch");
276 ctx->cb_sequence = 1001;
279 int guestfs_touch (guestfs_h *g,
282 struct guestfs_touch_args args;
283 struct touch_ctx ctx;
284 guestfs_main_loop *ml = guestfs_get_main_loop (g);
287 if (check_state (g, "guestfs_touch") == -1) return -1;
288 guestfs_set_busy (g);
290 memset (&ctx, 0, sizeof ctx);
292 args.path = (char *) path;
293 serial = guestfs__send_sync (g, GUESTFS_PROC_TOUCH,
294 (xdrproc_t) xdr_guestfs_touch_args, (char *) &args);
296 guestfs_set_ready (g);
301 guestfs__switch_to_receiving (g);
303 guestfs_set_reply_callback (g, touch_reply_cb, &ctx);
304 (void) ml->main_loop_run (ml, g);
305 guestfs_set_reply_callback (g, NULL, NULL);
306 if (ctx.cb_sequence != 1001) {
307 error (g, "%s reply failed, see earlier error messages", "guestfs_touch");
308 guestfs_set_ready (g);
312 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_TOUCH, serial) == -1) {
313 guestfs_set_ready (g);
317 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
318 error (g, "%s", ctx.err.error_message);
319 guestfs_set_ready (g);
323 guestfs_set_ready (g);
328 /* This flag is set by the callbacks, so we know we've done
329 * the callbacks as expected, and in the right sequence.
330 * 0 = not called, 1 = send called,
331 * 1001 = reply called.
334 struct guestfs_message_header hdr;
335 struct guestfs_message_error err;
336 struct guestfs_cat_ret ret;
339 static void cat_reply_cb (guestfs_h *g, void *data, XDR *xdr)
341 guestfs_main_loop *ml = guestfs_get_main_loop (g);
342 struct cat_ctx *ctx = (struct cat_ctx *) data;
344 ml->main_loop_quit (ml, g);
346 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
347 error (g, "%s: failed to parse reply header", "guestfs_cat");
350 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
351 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
352 error (g, "%s: failed to parse reply error", "guestfs_cat");
357 if (!xdr_guestfs_cat_ret (xdr, &ctx->ret)) {
358 error (g, "%s: failed to parse reply", "guestfs_cat");
362 ctx->cb_sequence = 1001;
365 char *guestfs_cat (guestfs_h *g,
368 struct guestfs_cat_args args;
370 guestfs_main_loop *ml = guestfs_get_main_loop (g);
373 if (check_state (g, "guestfs_cat") == -1) return NULL;
374 guestfs_set_busy (g);
376 memset (&ctx, 0, sizeof ctx);
378 args.path = (char *) path;
379 serial = guestfs__send_sync (g, GUESTFS_PROC_CAT,
380 (xdrproc_t) xdr_guestfs_cat_args, (char *) &args);
382 guestfs_set_ready (g);
387 guestfs__switch_to_receiving (g);
389 guestfs_set_reply_callback (g, cat_reply_cb, &ctx);
390 (void) ml->main_loop_run (ml, g);
391 guestfs_set_reply_callback (g, NULL, NULL);
392 if (ctx.cb_sequence != 1001) {
393 error (g, "%s reply failed, see earlier error messages", "guestfs_cat");
394 guestfs_set_ready (g);
398 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_CAT, serial) == -1) {
399 guestfs_set_ready (g);
403 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
404 error (g, "%s", ctx.err.error_message);
405 guestfs_set_ready (g);
409 guestfs_set_ready (g);
410 return ctx.ret.content; /* caller will free */
414 /* This flag is set by the callbacks, so we know we've done
415 * the callbacks as expected, and in the right sequence.
416 * 0 = not called, 1 = send called,
417 * 1001 = reply called.
420 struct guestfs_message_header hdr;
421 struct guestfs_message_error err;
422 struct guestfs_ll_ret ret;
425 static void ll_reply_cb (guestfs_h *g, void *data, XDR *xdr)
427 guestfs_main_loop *ml = guestfs_get_main_loop (g);
428 struct ll_ctx *ctx = (struct ll_ctx *) data;
430 ml->main_loop_quit (ml, g);
432 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
433 error (g, "%s: failed to parse reply header", "guestfs_ll");
436 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
437 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
438 error (g, "%s: failed to parse reply error", "guestfs_ll");
443 if (!xdr_guestfs_ll_ret (xdr, &ctx->ret)) {
444 error (g, "%s: failed to parse reply", "guestfs_ll");
448 ctx->cb_sequence = 1001;
451 char *guestfs_ll (guestfs_h *g,
452 const char *directory)
454 struct guestfs_ll_args args;
456 guestfs_main_loop *ml = guestfs_get_main_loop (g);
459 if (check_state (g, "guestfs_ll") == -1) return NULL;
460 guestfs_set_busy (g);
462 memset (&ctx, 0, sizeof ctx);
464 args.directory = (char *) directory;
465 serial = guestfs__send_sync (g, GUESTFS_PROC_LL,
466 (xdrproc_t) xdr_guestfs_ll_args, (char *) &args);
468 guestfs_set_ready (g);
473 guestfs__switch_to_receiving (g);
475 guestfs_set_reply_callback (g, ll_reply_cb, &ctx);
476 (void) ml->main_loop_run (ml, g);
477 guestfs_set_reply_callback (g, NULL, NULL);
478 if (ctx.cb_sequence != 1001) {
479 error (g, "%s reply failed, see earlier error messages", "guestfs_ll");
480 guestfs_set_ready (g);
484 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LL, serial) == -1) {
485 guestfs_set_ready (g);
489 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
490 error (g, "%s", ctx.err.error_message);
491 guestfs_set_ready (g);
495 guestfs_set_ready (g);
496 return ctx.ret.listing; /* caller will free */
500 /* This flag is set by the callbacks, so we know we've done
501 * the callbacks as expected, and in the right sequence.
502 * 0 = not called, 1 = send called,
503 * 1001 = reply called.
506 struct guestfs_message_header hdr;
507 struct guestfs_message_error err;
508 struct guestfs_ls_ret ret;
511 static void ls_reply_cb (guestfs_h *g, void *data, XDR *xdr)
513 guestfs_main_loop *ml = guestfs_get_main_loop (g);
514 struct ls_ctx *ctx = (struct ls_ctx *) data;
516 ml->main_loop_quit (ml, g);
518 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
519 error (g, "%s: failed to parse reply header", "guestfs_ls");
522 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
523 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
524 error (g, "%s: failed to parse reply error", "guestfs_ls");
529 if (!xdr_guestfs_ls_ret (xdr, &ctx->ret)) {
530 error (g, "%s: failed to parse reply", "guestfs_ls");
534 ctx->cb_sequence = 1001;
537 char **guestfs_ls (guestfs_h *g,
538 const char *directory)
540 struct guestfs_ls_args args;
542 guestfs_main_loop *ml = guestfs_get_main_loop (g);
545 if (check_state (g, "guestfs_ls") == -1) return NULL;
546 guestfs_set_busy (g);
548 memset (&ctx, 0, sizeof ctx);
550 args.directory = (char *) directory;
551 serial = guestfs__send_sync (g, GUESTFS_PROC_LS,
552 (xdrproc_t) xdr_guestfs_ls_args, (char *) &args);
554 guestfs_set_ready (g);
559 guestfs__switch_to_receiving (g);
561 guestfs_set_reply_callback (g, ls_reply_cb, &ctx);
562 (void) ml->main_loop_run (ml, g);
563 guestfs_set_reply_callback (g, NULL, NULL);
564 if (ctx.cb_sequence != 1001) {
565 error (g, "%s reply failed, see earlier error messages", "guestfs_ls");
566 guestfs_set_ready (g);
570 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LS, serial) == -1) {
571 guestfs_set_ready (g);
575 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
576 error (g, "%s", ctx.err.error_message);
577 guestfs_set_ready (g);
581 guestfs_set_ready (g);
582 /* caller will free this, but we need to add a NULL entry */
583 ctx.ret.listing.listing_val =
584 safe_realloc (g, ctx.ret.listing.listing_val,
585 sizeof (char *) * (ctx.ret.listing.listing_len + 1));
586 ctx.ret.listing.listing_val[ctx.ret.listing.listing_len] = NULL;
587 return ctx.ret.listing.listing_val;
590 struct list_devices_ctx {
591 /* This flag is set by the callbacks, so we know we've done
592 * the callbacks as expected, and in the right sequence.
593 * 0 = not called, 1 = send called,
594 * 1001 = reply called.
597 struct guestfs_message_header hdr;
598 struct guestfs_message_error err;
599 struct guestfs_list_devices_ret ret;
602 static void list_devices_reply_cb (guestfs_h *g, void *data, XDR *xdr)
604 guestfs_main_loop *ml = guestfs_get_main_loop (g);
605 struct list_devices_ctx *ctx = (struct list_devices_ctx *) data;
607 ml->main_loop_quit (ml, g);
609 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
610 error (g, "%s: failed to parse reply header", "guestfs_list_devices");
613 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
614 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
615 error (g, "%s: failed to parse reply error", "guestfs_list_devices");
620 if (!xdr_guestfs_list_devices_ret (xdr, &ctx->ret)) {
621 error (g, "%s: failed to parse reply", "guestfs_list_devices");
625 ctx->cb_sequence = 1001;
628 char **guestfs_list_devices (guestfs_h *g)
630 struct list_devices_ctx ctx;
631 guestfs_main_loop *ml = guestfs_get_main_loop (g);
634 if (check_state (g, "guestfs_list_devices") == -1) return NULL;
635 guestfs_set_busy (g);
637 memset (&ctx, 0, sizeof ctx);
639 serial = guestfs__send_sync (g, GUESTFS_PROC_LIST_DEVICES, NULL, NULL);
641 guestfs_set_ready (g);
646 guestfs__switch_to_receiving (g);
648 guestfs_set_reply_callback (g, list_devices_reply_cb, &ctx);
649 (void) ml->main_loop_run (ml, g);
650 guestfs_set_reply_callback (g, NULL, NULL);
651 if (ctx.cb_sequence != 1001) {
652 error (g, "%s reply failed, see earlier error messages", "guestfs_list_devices");
653 guestfs_set_ready (g);
657 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LIST_DEVICES, serial) == -1) {
658 guestfs_set_ready (g);
662 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
663 error (g, "%s", ctx.err.error_message);
664 guestfs_set_ready (g);
668 guestfs_set_ready (g);
669 /* caller will free this, but we need to add a NULL entry */
670 ctx.ret.devices.devices_val =
671 safe_realloc (g, ctx.ret.devices.devices_val,
672 sizeof (char *) * (ctx.ret.devices.devices_len + 1));
673 ctx.ret.devices.devices_val[ctx.ret.devices.devices_len] = NULL;
674 return ctx.ret.devices.devices_val;
677 struct list_partitions_ctx {
678 /* This flag is set by the callbacks, so we know we've done
679 * the callbacks as expected, and in the right sequence.
680 * 0 = not called, 1 = send called,
681 * 1001 = reply called.
684 struct guestfs_message_header hdr;
685 struct guestfs_message_error err;
686 struct guestfs_list_partitions_ret ret;
689 static void list_partitions_reply_cb (guestfs_h *g, void *data, XDR *xdr)
691 guestfs_main_loop *ml = guestfs_get_main_loop (g);
692 struct list_partitions_ctx *ctx = (struct list_partitions_ctx *) data;
694 ml->main_loop_quit (ml, g);
696 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
697 error (g, "%s: failed to parse reply header", "guestfs_list_partitions");
700 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
701 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
702 error (g, "%s: failed to parse reply error", "guestfs_list_partitions");
707 if (!xdr_guestfs_list_partitions_ret (xdr, &ctx->ret)) {
708 error (g, "%s: failed to parse reply", "guestfs_list_partitions");
712 ctx->cb_sequence = 1001;
715 char **guestfs_list_partitions (guestfs_h *g)
717 struct list_partitions_ctx ctx;
718 guestfs_main_loop *ml = guestfs_get_main_loop (g);
721 if (check_state (g, "guestfs_list_partitions") == -1) return NULL;
722 guestfs_set_busy (g);
724 memset (&ctx, 0, sizeof ctx);
726 serial = guestfs__send_sync (g, GUESTFS_PROC_LIST_PARTITIONS, NULL, NULL);
728 guestfs_set_ready (g);
733 guestfs__switch_to_receiving (g);
735 guestfs_set_reply_callback (g, list_partitions_reply_cb, &ctx);
736 (void) ml->main_loop_run (ml, g);
737 guestfs_set_reply_callback (g, NULL, NULL);
738 if (ctx.cb_sequence != 1001) {
739 error (g, "%s reply failed, see earlier error messages", "guestfs_list_partitions");
740 guestfs_set_ready (g);
744 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LIST_PARTITIONS, serial) == -1) {
745 guestfs_set_ready (g);
749 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
750 error (g, "%s", ctx.err.error_message);
751 guestfs_set_ready (g);
755 guestfs_set_ready (g);
756 /* caller will free this, but we need to add a NULL entry */
757 ctx.ret.partitions.partitions_val =
758 safe_realloc (g, ctx.ret.partitions.partitions_val,
759 sizeof (char *) * (ctx.ret.partitions.partitions_len + 1));
760 ctx.ret.partitions.partitions_val[ctx.ret.partitions.partitions_len] = NULL;
761 return ctx.ret.partitions.partitions_val;
765 /* This flag is set by the callbacks, so we know we've done
766 * the callbacks as expected, and in the right sequence.
767 * 0 = not called, 1 = send called,
768 * 1001 = reply called.
771 struct guestfs_message_header hdr;
772 struct guestfs_message_error err;
773 struct guestfs_pvs_ret ret;
776 static void pvs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
778 guestfs_main_loop *ml = guestfs_get_main_loop (g);
779 struct pvs_ctx *ctx = (struct pvs_ctx *) data;
781 ml->main_loop_quit (ml, g);
783 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
784 error (g, "%s: failed to parse reply header", "guestfs_pvs");
787 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
788 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
789 error (g, "%s: failed to parse reply error", "guestfs_pvs");
794 if (!xdr_guestfs_pvs_ret (xdr, &ctx->ret)) {
795 error (g, "%s: failed to parse reply", "guestfs_pvs");
799 ctx->cb_sequence = 1001;
802 char **guestfs_pvs (guestfs_h *g)
805 guestfs_main_loop *ml = guestfs_get_main_loop (g);
808 if (check_state (g, "guestfs_pvs") == -1) return NULL;
809 guestfs_set_busy (g);
811 memset (&ctx, 0, sizeof ctx);
813 serial = guestfs__send_sync (g, GUESTFS_PROC_PVS, NULL, NULL);
815 guestfs_set_ready (g);
820 guestfs__switch_to_receiving (g);
822 guestfs_set_reply_callback (g, pvs_reply_cb, &ctx);
823 (void) ml->main_loop_run (ml, g);
824 guestfs_set_reply_callback (g, NULL, NULL);
825 if (ctx.cb_sequence != 1001) {
826 error (g, "%s reply failed, see earlier error messages", "guestfs_pvs");
827 guestfs_set_ready (g);
831 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_PVS, serial) == -1) {
832 guestfs_set_ready (g);
836 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
837 error (g, "%s", ctx.err.error_message);
838 guestfs_set_ready (g);
842 guestfs_set_ready (g);
843 /* caller will free this, but we need to add a NULL entry */
844 ctx.ret.physvols.physvols_val =
845 safe_realloc (g, ctx.ret.physvols.physvols_val,
846 sizeof (char *) * (ctx.ret.physvols.physvols_len + 1));
847 ctx.ret.physvols.physvols_val[ctx.ret.physvols.physvols_len] = NULL;
848 return ctx.ret.physvols.physvols_val;
852 /* This flag is set by the callbacks, so we know we've done
853 * the callbacks as expected, and in the right sequence.
854 * 0 = not called, 1 = send called,
855 * 1001 = reply called.
858 struct guestfs_message_header hdr;
859 struct guestfs_message_error err;
860 struct guestfs_vgs_ret ret;
863 static void vgs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
865 guestfs_main_loop *ml = guestfs_get_main_loop (g);
866 struct vgs_ctx *ctx = (struct vgs_ctx *) data;
868 ml->main_loop_quit (ml, g);
870 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
871 error (g, "%s: failed to parse reply header", "guestfs_vgs");
874 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
875 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
876 error (g, "%s: failed to parse reply error", "guestfs_vgs");
881 if (!xdr_guestfs_vgs_ret (xdr, &ctx->ret)) {
882 error (g, "%s: failed to parse reply", "guestfs_vgs");
886 ctx->cb_sequence = 1001;
889 char **guestfs_vgs (guestfs_h *g)
892 guestfs_main_loop *ml = guestfs_get_main_loop (g);
895 if (check_state (g, "guestfs_vgs") == -1) return NULL;
896 guestfs_set_busy (g);
898 memset (&ctx, 0, sizeof ctx);
900 serial = guestfs__send_sync (g, GUESTFS_PROC_VGS, NULL, NULL);
902 guestfs_set_ready (g);
907 guestfs__switch_to_receiving (g);
909 guestfs_set_reply_callback (g, vgs_reply_cb, &ctx);
910 (void) ml->main_loop_run (ml, g);
911 guestfs_set_reply_callback (g, NULL, NULL);
912 if (ctx.cb_sequence != 1001) {
913 error (g, "%s reply failed, see earlier error messages", "guestfs_vgs");
914 guestfs_set_ready (g);
918 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_VGS, serial) == -1) {
919 guestfs_set_ready (g);
923 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
924 error (g, "%s", ctx.err.error_message);
925 guestfs_set_ready (g);
929 guestfs_set_ready (g);
930 /* caller will free this, but we need to add a NULL entry */
931 ctx.ret.volgroups.volgroups_val =
932 safe_realloc (g, ctx.ret.volgroups.volgroups_val,
933 sizeof (char *) * (ctx.ret.volgroups.volgroups_len + 1));
934 ctx.ret.volgroups.volgroups_val[ctx.ret.volgroups.volgroups_len] = NULL;
935 return ctx.ret.volgroups.volgroups_val;
939 /* This flag is set by the callbacks, so we know we've done
940 * the callbacks as expected, and in the right sequence.
941 * 0 = not called, 1 = send called,
942 * 1001 = reply called.
945 struct guestfs_message_header hdr;
946 struct guestfs_message_error err;
947 struct guestfs_lvs_ret ret;
950 static void lvs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
952 guestfs_main_loop *ml = guestfs_get_main_loop (g);
953 struct lvs_ctx *ctx = (struct lvs_ctx *) data;
955 ml->main_loop_quit (ml, g);
957 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
958 error (g, "%s: failed to parse reply header", "guestfs_lvs");
961 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
962 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
963 error (g, "%s: failed to parse reply error", "guestfs_lvs");
968 if (!xdr_guestfs_lvs_ret (xdr, &ctx->ret)) {
969 error (g, "%s: failed to parse reply", "guestfs_lvs");
973 ctx->cb_sequence = 1001;
976 char **guestfs_lvs (guestfs_h *g)
979 guestfs_main_loop *ml = guestfs_get_main_loop (g);
982 if (check_state (g, "guestfs_lvs") == -1) return NULL;
983 guestfs_set_busy (g);
985 memset (&ctx, 0, sizeof ctx);
987 serial = guestfs__send_sync (g, GUESTFS_PROC_LVS, NULL, NULL);
989 guestfs_set_ready (g);
994 guestfs__switch_to_receiving (g);
996 guestfs_set_reply_callback (g, lvs_reply_cb, &ctx);
997 (void) ml->main_loop_run (ml, g);
998 guestfs_set_reply_callback (g, NULL, NULL);
999 if (ctx.cb_sequence != 1001) {
1000 error (g, "%s reply failed, see earlier error messages", "guestfs_lvs");
1001 guestfs_set_ready (g);
1005 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LVS, serial) == -1) {
1006 guestfs_set_ready (g);
1010 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1011 error (g, "%s", ctx.err.error_message);
1012 guestfs_set_ready (g);
1016 guestfs_set_ready (g);
1017 /* caller will free this, but we need to add a NULL entry */
1018 ctx.ret.logvols.logvols_val =
1019 safe_realloc (g, ctx.ret.logvols.logvols_val,
1020 sizeof (char *) * (ctx.ret.logvols.logvols_len + 1));
1021 ctx.ret.logvols.logvols_val[ctx.ret.logvols.logvols_len] = NULL;
1022 return ctx.ret.logvols.logvols_val;
1025 struct pvs_full_ctx {
1026 /* This flag is set by the callbacks, so we know we've done
1027 * the callbacks as expected, and in the right sequence.
1028 * 0 = not called, 1 = send called,
1029 * 1001 = reply called.
1032 struct guestfs_message_header hdr;
1033 struct guestfs_message_error err;
1034 struct guestfs_pvs_full_ret ret;
1037 static void pvs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1039 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1040 struct pvs_full_ctx *ctx = (struct pvs_full_ctx *) data;
1042 ml->main_loop_quit (ml, g);
1044 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1045 error (g, "%s: failed to parse reply header", "guestfs_pvs_full");
1048 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1049 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1050 error (g, "%s: failed to parse reply error", "guestfs_pvs_full");
1055 if (!xdr_guestfs_pvs_full_ret (xdr, &ctx->ret)) {
1056 error (g, "%s: failed to parse reply", "guestfs_pvs_full");
1060 ctx->cb_sequence = 1001;
1063 struct guestfs_lvm_pv_list *guestfs_pvs_full (guestfs_h *g)
1065 struct pvs_full_ctx ctx;
1066 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1069 if (check_state (g, "guestfs_pvs_full") == -1) return NULL;
1070 guestfs_set_busy (g);
1072 memset (&ctx, 0, sizeof ctx);
1074 serial = guestfs__send_sync (g, GUESTFS_PROC_PVS_FULL, NULL, NULL);
1076 guestfs_set_ready (g);
1081 guestfs__switch_to_receiving (g);
1082 ctx.cb_sequence = 0;
1083 guestfs_set_reply_callback (g, pvs_full_reply_cb, &ctx);
1084 (void) ml->main_loop_run (ml, g);
1085 guestfs_set_reply_callback (g, NULL, NULL);
1086 if (ctx.cb_sequence != 1001) {
1087 error (g, "%s reply failed, see earlier error messages", "guestfs_pvs_full");
1088 guestfs_set_ready (g);
1092 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_PVS_FULL, serial) == -1) {
1093 guestfs_set_ready (g);
1097 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1098 error (g, "%s", ctx.err.error_message);
1099 guestfs_set_ready (g);
1103 guestfs_set_ready (g);
1104 /* caller will free this */
1105 return safe_memdup (g, &ctx.ret.physvols, sizeof (ctx.ret.physvols));
1108 struct vgs_full_ctx {
1109 /* This flag is set by the callbacks, so we know we've done
1110 * the callbacks as expected, and in the right sequence.
1111 * 0 = not called, 1 = send called,
1112 * 1001 = reply called.
1115 struct guestfs_message_header hdr;
1116 struct guestfs_message_error err;
1117 struct guestfs_vgs_full_ret ret;
1120 static void vgs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1122 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1123 struct vgs_full_ctx *ctx = (struct vgs_full_ctx *) data;
1125 ml->main_loop_quit (ml, g);
1127 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1128 error (g, "%s: failed to parse reply header", "guestfs_vgs_full");
1131 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1132 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1133 error (g, "%s: failed to parse reply error", "guestfs_vgs_full");
1138 if (!xdr_guestfs_vgs_full_ret (xdr, &ctx->ret)) {
1139 error (g, "%s: failed to parse reply", "guestfs_vgs_full");
1143 ctx->cb_sequence = 1001;
1146 struct guestfs_lvm_vg_list *guestfs_vgs_full (guestfs_h *g)
1148 struct vgs_full_ctx ctx;
1149 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1152 if (check_state (g, "guestfs_vgs_full") == -1) return NULL;
1153 guestfs_set_busy (g);
1155 memset (&ctx, 0, sizeof ctx);
1157 serial = guestfs__send_sync (g, GUESTFS_PROC_VGS_FULL, NULL, NULL);
1159 guestfs_set_ready (g);
1164 guestfs__switch_to_receiving (g);
1165 ctx.cb_sequence = 0;
1166 guestfs_set_reply_callback (g, vgs_full_reply_cb, &ctx);
1167 (void) ml->main_loop_run (ml, g);
1168 guestfs_set_reply_callback (g, NULL, NULL);
1169 if (ctx.cb_sequence != 1001) {
1170 error (g, "%s reply failed, see earlier error messages", "guestfs_vgs_full");
1171 guestfs_set_ready (g);
1175 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_VGS_FULL, serial) == -1) {
1176 guestfs_set_ready (g);
1180 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1181 error (g, "%s", ctx.err.error_message);
1182 guestfs_set_ready (g);
1186 guestfs_set_ready (g);
1187 /* caller will free this */
1188 return safe_memdup (g, &ctx.ret.volgroups, sizeof (ctx.ret.volgroups));
1191 struct lvs_full_ctx {
1192 /* This flag is set by the callbacks, so we know we've done
1193 * the callbacks as expected, and in the right sequence.
1194 * 0 = not called, 1 = send called,
1195 * 1001 = reply called.
1198 struct guestfs_message_header hdr;
1199 struct guestfs_message_error err;
1200 struct guestfs_lvs_full_ret ret;
1203 static void lvs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1205 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1206 struct lvs_full_ctx *ctx = (struct lvs_full_ctx *) data;
1208 ml->main_loop_quit (ml, g);
1210 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1211 error (g, "%s: failed to parse reply header", "guestfs_lvs_full");
1214 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1215 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1216 error (g, "%s: failed to parse reply error", "guestfs_lvs_full");
1221 if (!xdr_guestfs_lvs_full_ret (xdr, &ctx->ret)) {
1222 error (g, "%s: failed to parse reply", "guestfs_lvs_full");
1226 ctx->cb_sequence = 1001;
1229 struct guestfs_lvm_lv_list *guestfs_lvs_full (guestfs_h *g)
1231 struct lvs_full_ctx ctx;
1232 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1235 if (check_state (g, "guestfs_lvs_full") == -1) return NULL;
1236 guestfs_set_busy (g);
1238 memset (&ctx, 0, sizeof ctx);
1240 serial = guestfs__send_sync (g, GUESTFS_PROC_LVS_FULL, NULL, NULL);
1242 guestfs_set_ready (g);
1247 guestfs__switch_to_receiving (g);
1248 ctx.cb_sequence = 0;
1249 guestfs_set_reply_callback (g, lvs_full_reply_cb, &ctx);
1250 (void) ml->main_loop_run (ml, g);
1251 guestfs_set_reply_callback (g, NULL, NULL);
1252 if (ctx.cb_sequence != 1001) {
1253 error (g, "%s reply failed, see earlier error messages", "guestfs_lvs_full");
1254 guestfs_set_ready (g);
1258 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LVS_FULL, serial) == -1) {
1259 guestfs_set_ready (g);
1263 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1264 error (g, "%s", ctx.err.error_message);
1265 guestfs_set_ready (g);
1269 guestfs_set_ready (g);
1270 /* caller will free this */
1271 return safe_memdup (g, &ctx.ret.logvols, sizeof (ctx.ret.logvols));
1274 struct read_lines_ctx {
1275 /* This flag is set by the callbacks, so we know we've done
1276 * the callbacks as expected, and in the right sequence.
1277 * 0 = not called, 1 = send called,
1278 * 1001 = reply called.
1281 struct guestfs_message_header hdr;
1282 struct guestfs_message_error err;
1283 struct guestfs_read_lines_ret ret;
1286 static void read_lines_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1288 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1289 struct read_lines_ctx *ctx = (struct read_lines_ctx *) data;
1291 ml->main_loop_quit (ml, g);
1293 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1294 error (g, "%s: failed to parse reply header", "guestfs_read_lines");
1297 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1298 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1299 error (g, "%s: failed to parse reply error", "guestfs_read_lines");
1304 if (!xdr_guestfs_read_lines_ret (xdr, &ctx->ret)) {
1305 error (g, "%s: failed to parse reply", "guestfs_read_lines");
1309 ctx->cb_sequence = 1001;
1312 char **guestfs_read_lines (guestfs_h *g,
1315 struct guestfs_read_lines_args args;
1316 struct read_lines_ctx ctx;
1317 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1320 if (check_state (g, "guestfs_read_lines") == -1) return NULL;
1321 guestfs_set_busy (g);
1323 memset (&ctx, 0, sizeof ctx);
1325 args.path = (char *) path;
1326 serial = guestfs__send_sync (g, GUESTFS_PROC_READ_LINES,
1327 (xdrproc_t) xdr_guestfs_read_lines_args, (char *) &args);
1329 guestfs_set_ready (g);
1334 guestfs__switch_to_receiving (g);
1335 ctx.cb_sequence = 0;
1336 guestfs_set_reply_callback (g, read_lines_reply_cb, &ctx);
1337 (void) ml->main_loop_run (ml, g);
1338 guestfs_set_reply_callback (g, NULL, NULL);
1339 if (ctx.cb_sequence != 1001) {
1340 error (g, "%s reply failed, see earlier error messages", "guestfs_read_lines");
1341 guestfs_set_ready (g);
1345 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_READ_LINES, serial) == -1) {
1346 guestfs_set_ready (g);
1350 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1351 error (g, "%s", ctx.err.error_message);
1352 guestfs_set_ready (g);
1356 guestfs_set_ready (g);
1357 /* caller will free this, but we need to add a NULL entry */
1358 ctx.ret.lines.lines_val =
1359 safe_realloc (g, ctx.ret.lines.lines_val,
1360 sizeof (char *) * (ctx.ret.lines.lines_len + 1));
1361 ctx.ret.lines.lines_val[ctx.ret.lines.lines_len] = NULL;
1362 return ctx.ret.lines.lines_val;
1365 struct aug_init_ctx {
1366 /* This flag is set by the callbacks, so we know we've done
1367 * the callbacks as expected, and in the right sequence.
1368 * 0 = not called, 1 = send called,
1369 * 1001 = reply called.
1372 struct guestfs_message_header hdr;
1373 struct guestfs_message_error err;
1376 static void aug_init_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1378 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1379 struct aug_init_ctx *ctx = (struct aug_init_ctx *) data;
1381 ml->main_loop_quit (ml, g);
1383 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1384 error (g, "%s: failed to parse reply header", "guestfs_aug_init");
1387 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1388 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1389 error (g, "%s: failed to parse reply error", "guestfs_aug_init");
1395 ctx->cb_sequence = 1001;
1398 int guestfs_aug_init (guestfs_h *g,
1402 struct guestfs_aug_init_args args;
1403 struct aug_init_ctx ctx;
1404 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1407 if (check_state (g, "guestfs_aug_init") == -1) return -1;
1408 guestfs_set_busy (g);
1410 memset (&ctx, 0, sizeof ctx);
1412 args.root = (char *) root;
1414 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_INIT,
1415 (xdrproc_t) xdr_guestfs_aug_init_args, (char *) &args);
1417 guestfs_set_ready (g);
1422 guestfs__switch_to_receiving (g);
1423 ctx.cb_sequence = 0;
1424 guestfs_set_reply_callback (g, aug_init_reply_cb, &ctx);
1425 (void) ml->main_loop_run (ml, g);
1426 guestfs_set_reply_callback (g, NULL, NULL);
1427 if (ctx.cb_sequence != 1001) {
1428 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_init");
1429 guestfs_set_ready (g);
1433 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_INIT, serial) == -1) {
1434 guestfs_set_ready (g);
1438 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1439 error (g, "%s", ctx.err.error_message);
1440 guestfs_set_ready (g);
1444 guestfs_set_ready (g);
1448 struct aug_close_ctx {
1449 /* This flag is set by the callbacks, so we know we've done
1450 * the callbacks as expected, and in the right sequence.
1451 * 0 = not called, 1 = send called,
1452 * 1001 = reply called.
1455 struct guestfs_message_header hdr;
1456 struct guestfs_message_error err;
1459 static void aug_close_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1461 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1462 struct aug_close_ctx *ctx = (struct aug_close_ctx *) data;
1464 ml->main_loop_quit (ml, g);
1466 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1467 error (g, "%s: failed to parse reply header", "guestfs_aug_close");
1470 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1471 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1472 error (g, "%s: failed to parse reply error", "guestfs_aug_close");
1478 ctx->cb_sequence = 1001;
1481 int guestfs_aug_close (guestfs_h *g)
1483 struct aug_close_ctx ctx;
1484 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1487 if (check_state (g, "guestfs_aug_close") == -1) return -1;
1488 guestfs_set_busy (g);
1490 memset (&ctx, 0, sizeof ctx);
1492 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_CLOSE, NULL, NULL);
1494 guestfs_set_ready (g);
1499 guestfs__switch_to_receiving (g);
1500 ctx.cb_sequence = 0;
1501 guestfs_set_reply_callback (g, aug_close_reply_cb, &ctx);
1502 (void) ml->main_loop_run (ml, g);
1503 guestfs_set_reply_callback (g, NULL, NULL);
1504 if (ctx.cb_sequence != 1001) {
1505 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_close");
1506 guestfs_set_ready (g);
1510 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_CLOSE, serial) == -1) {
1511 guestfs_set_ready (g);
1515 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1516 error (g, "%s", ctx.err.error_message);
1517 guestfs_set_ready (g);
1521 guestfs_set_ready (g);
1525 struct aug_defvar_ctx {
1526 /* This flag is set by the callbacks, so we know we've done
1527 * the callbacks as expected, and in the right sequence.
1528 * 0 = not called, 1 = send called,
1529 * 1001 = reply called.
1532 struct guestfs_message_header hdr;
1533 struct guestfs_message_error err;
1534 struct guestfs_aug_defvar_ret ret;
1537 static void aug_defvar_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1539 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1540 struct aug_defvar_ctx *ctx = (struct aug_defvar_ctx *) data;
1542 ml->main_loop_quit (ml, g);
1544 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1545 error (g, "%s: failed to parse reply header", "guestfs_aug_defvar");
1548 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1549 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1550 error (g, "%s: failed to parse reply error", "guestfs_aug_defvar");
1555 if (!xdr_guestfs_aug_defvar_ret (xdr, &ctx->ret)) {
1556 error (g, "%s: failed to parse reply", "guestfs_aug_defvar");
1560 ctx->cb_sequence = 1001;
1563 int guestfs_aug_defvar (guestfs_h *g,
1567 struct guestfs_aug_defvar_args args;
1568 struct aug_defvar_ctx ctx;
1569 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1572 if (check_state (g, "guestfs_aug_defvar") == -1) return -1;
1573 guestfs_set_busy (g);
1575 memset (&ctx, 0, sizeof ctx);
1577 args.name = (char *) name;
1578 args.expr = expr ? (char **) &expr : NULL;
1579 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_DEFVAR,
1580 (xdrproc_t) xdr_guestfs_aug_defvar_args, (char *) &args);
1582 guestfs_set_ready (g);
1587 guestfs__switch_to_receiving (g);
1588 ctx.cb_sequence = 0;
1589 guestfs_set_reply_callback (g, aug_defvar_reply_cb, &ctx);
1590 (void) ml->main_loop_run (ml, g);
1591 guestfs_set_reply_callback (g, NULL, NULL);
1592 if (ctx.cb_sequence != 1001) {
1593 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_defvar");
1594 guestfs_set_ready (g);
1598 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_DEFVAR, serial) == -1) {
1599 guestfs_set_ready (g);
1603 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1604 error (g, "%s", ctx.err.error_message);
1605 guestfs_set_ready (g);
1609 guestfs_set_ready (g);
1610 return ctx.ret.nrnodes;
1613 struct aug_defnode_ctx {
1614 /* This flag is set by the callbacks, so we know we've done
1615 * the callbacks as expected, and in the right sequence.
1616 * 0 = not called, 1 = send called,
1617 * 1001 = reply called.
1620 struct guestfs_message_header hdr;
1621 struct guestfs_message_error err;
1622 struct guestfs_aug_defnode_ret ret;
1625 static void aug_defnode_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1627 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1628 struct aug_defnode_ctx *ctx = (struct aug_defnode_ctx *) data;
1630 ml->main_loop_quit (ml, g);
1632 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1633 error (g, "%s: failed to parse reply header", "guestfs_aug_defnode");
1636 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1637 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1638 error (g, "%s: failed to parse reply error", "guestfs_aug_defnode");
1643 if (!xdr_guestfs_aug_defnode_ret (xdr, &ctx->ret)) {
1644 error (g, "%s: failed to parse reply", "guestfs_aug_defnode");
1648 ctx->cb_sequence = 1001;
1651 struct guestfs_int_bool *guestfs_aug_defnode (guestfs_h *g,
1656 struct guestfs_aug_defnode_args args;
1657 struct aug_defnode_ctx ctx;
1658 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1661 if (check_state (g, "guestfs_aug_defnode") == -1) return NULL;
1662 guestfs_set_busy (g);
1664 memset (&ctx, 0, sizeof ctx);
1666 args.name = (char *) name;
1667 args.expr = (char *) expr;
1668 args.val = (char *) val;
1669 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_DEFNODE,
1670 (xdrproc_t) xdr_guestfs_aug_defnode_args, (char *) &args);
1672 guestfs_set_ready (g);
1677 guestfs__switch_to_receiving (g);
1678 ctx.cb_sequence = 0;
1679 guestfs_set_reply_callback (g, aug_defnode_reply_cb, &ctx);
1680 (void) ml->main_loop_run (ml, g);
1681 guestfs_set_reply_callback (g, NULL, NULL);
1682 if (ctx.cb_sequence != 1001) {
1683 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_defnode");
1684 guestfs_set_ready (g);
1688 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_DEFNODE, serial) == -1) {
1689 guestfs_set_ready (g);
1693 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1694 error (g, "%s", ctx.err.error_message);
1695 guestfs_set_ready (g);
1699 guestfs_set_ready (g);
1700 /* caller with free this */
1701 return safe_memdup (g, &ctx.ret, sizeof (ctx.ret));
1704 struct aug_get_ctx {
1705 /* This flag is set by the callbacks, so we know we've done
1706 * the callbacks as expected, and in the right sequence.
1707 * 0 = not called, 1 = send called,
1708 * 1001 = reply called.
1711 struct guestfs_message_header hdr;
1712 struct guestfs_message_error err;
1713 struct guestfs_aug_get_ret ret;
1716 static void aug_get_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1718 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1719 struct aug_get_ctx *ctx = (struct aug_get_ctx *) data;
1721 ml->main_loop_quit (ml, g);
1723 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1724 error (g, "%s: failed to parse reply header", "guestfs_aug_get");
1727 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1728 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1729 error (g, "%s: failed to parse reply error", "guestfs_aug_get");
1734 if (!xdr_guestfs_aug_get_ret (xdr, &ctx->ret)) {
1735 error (g, "%s: failed to parse reply", "guestfs_aug_get");
1739 ctx->cb_sequence = 1001;
1742 char *guestfs_aug_get (guestfs_h *g,
1745 struct guestfs_aug_get_args args;
1746 struct aug_get_ctx ctx;
1747 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1750 if (check_state (g, "guestfs_aug_get") == -1) return NULL;
1751 guestfs_set_busy (g);
1753 memset (&ctx, 0, sizeof ctx);
1755 args.path = (char *) path;
1756 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_GET,
1757 (xdrproc_t) xdr_guestfs_aug_get_args, (char *) &args);
1759 guestfs_set_ready (g);
1764 guestfs__switch_to_receiving (g);
1765 ctx.cb_sequence = 0;
1766 guestfs_set_reply_callback (g, aug_get_reply_cb, &ctx);
1767 (void) ml->main_loop_run (ml, g);
1768 guestfs_set_reply_callback (g, NULL, NULL);
1769 if (ctx.cb_sequence != 1001) {
1770 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_get");
1771 guestfs_set_ready (g);
1775 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_GET, serial) == -1) {
1776 guestfs_set_ready (g);
1780 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1781 error (g, "%s", ctx.err.error_message);
1782 guestfs_set_ready (g);
1786 guestfs_set_ready (g);
1787 return ctx.ret.val; /* caller will free */
1790 struct aug_set_ctx {
1791 /* This flag is set by the callbacks, so we know we've done
1792 * the callbacks as expected, and in the right sequence.
1793 * 0 = not called, 1 = send called,
1794 * 1001 = reply called.
1797 struct guestfs_message_header hdr;
1798 struct guestfs_message_error err;
1801 static void aug_set_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1803 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1804 struct aug_set_ctx *ctx = (struct aug_set_ctx *) data;
1806 ml->main_loop_quit (ml, g);
1808 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1809 error (g, "%s: failed to parse reply header", "guestfs_aug_set");
1812 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1813 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1814 error (g, "%s: failed to parse reply error", "guestfs_aug_set");
1820 ctx->cb_sequence = 1001;
1823 int guestfs_aug_set (guestfs_h *g,
1827 struct guestfs_aug_set_args args;
1828 struct aug_set_ctx ctx;
1829 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1832 if (check_state (g, "guestfs_aug_set") == -1) return -1;
1833 guestfs_set_busy (g);
1835 memset (&ctx, 0, sizeof ctx);
1837 args.path = (char *) path;
1838 args.val = (char *) val;
1839 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_SET,
1840 (xdrproc_t) xdr_guestfs_aug_set_args, (char *) &args);
1842 guestfs_set_ready (g);
1847 guestfs__switch_to_receiving (g);
1848 ctx.cb_sequence = 0;
1849 guestfs_set_reply_callback (g, aug_set_reply_cb, &ctx);
1850 (void) ml->main_loop_run (ml, g);
1851 guestfs_set_reply_callback (g, NULL, NULL);
1852 if (ctx.cb_sequence != 1001) {
1853 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_set");
1854 guestfs_set_ready (g);
1858 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_SET, serial) == -1) {
1859 guestfs_set_ready (g);
1863 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1864 error (g, "%s", ctx.err.error_message);
1865 guestfs_set_ready (g);
1869 guestfs_set_ready (g);
1873 struct aug_insert_ctx {
1874 /* This flag is set by the callbacks, so we know we've done
1875 * the callbacks as expected, and in the right sequence.
1876 * 0 = not called, 1 = send called,
1877 * 1001 = reply called.
1880 struct guestfs_message_header hdr;
1881 struct guestfs_message_error err;
1884 static void aug_insert_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1886 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1887 struct aug_insert_ctx *ctx = (struct aug_insert_ctx *) data;
1889 ml->main_loop_quit (ml, g);
1891 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1892 error (g, "%s: failed to parse reply header", "guestfs_aug_insert");
1895 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1896 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1897 error (g, "%s: failed to parse reply error", "guestfs_aug_insert");
1903 ctx->cb_sequence = 1001;
1906 int guestfs_aug_insert (guestfs_h *g,
1911 struct guestfs_aug_insert_args args;
1912 struct aug_insert_ctx ctx;
1913 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1916 if (check_state (g, "guestfs_aug_insert") == -1) return -1;
1917 guestfs_set_busy (g);
1919 memset (&ctx, 0, sizeof ctx);
1921 args.path = (char *) path;
1922 args.label = (char *) label;
1923 args.before = before;
1924 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_INSERT,
1925 (xdrproc_t) xdr_guestfs_aug_insert_args, (char *) &args);
1927 guestfs_set_ready (g);
1932 guestfs__switch_to_receiving (g);
1933 ctx.cb_sequence = 0;
1934 guestfs_set_reply_callback (g, aug_insert_reply_cb, &ctx);
1935 (void) ml->main_loop_run (ml, g);
1936 guestfs_set_reply_callback (g, NULL, NULL);
1937 if (ctx.cb_sequence != 1001) {
1938 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_insert");
1939 guestfs_set_ready (g);
1943 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_INSERT, serial) == -1) {
1944 guestfs_set_ready (g);
1948 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1949 error (g, "%s", ctx.err.error_message);
1950 guestfs_set_ready (g);
1954 guestfs_set_ready (g);
1959 /* This flag is set by the callbacks, so we know we've done
1960 * the callbacks as expected, and in the right sequence.
1961 * 0 = not called, 1 = send called,
1962 * 1001 = reply called.
1965 struct guestfs_message_header hdr;
1966 struct guestfs_message_error err;
1967 struct guestfs_aug_rm_ret ret;
1970 static void aug_rm_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1972 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1973 struct aug_rm_ctx *ctx = (struct aug_rm_ctx *) data;
1975 ml->main_loop_quit (ml, g);
1977 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1978 error (g, "%s: failed to parse reply header", "guestfs_aug_rm");
1981 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1982 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1983 error (g, "%s: failed to parse reply error", "guestfs_aug_rm");
1988 if (!xdr_guestfs_aug_rm_ret (xdr, &ctx->ret)) {
1989 error (g, "%s: failed to parse reply", "guestfs_aug_rm");
1993 ctx->cb_sequence = 1001;
1996 int guestfs_aug_rm (guestfs_h *g,
1999 struct guestfs_aug_rm_args args;
2000 struct aug_rm_ctx ctx;
2001 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2004 if (check_state (g, "guestfs_aug_rm") == -1) return -1;
2005 guestfs_set_busy (g);
2007 memset (&ctx, 0, sizeof ctx);
2009 args.path = (char *) path;
2010 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_RM,
2011 (xdrproc_t) xdr_guestfs_aug_rm_args, (char *) &args);
2013 guestfs_set_ready (g);
2018 guestfs__switch_to_receiving (g);
2019 ctx.cb_sequence = 0;
2020 guestfs_set_reply_callback (g, aug_rm_reply_cb, &ctx);
2021 (void) ml->main_loop_run (ml, g);
2022 guestfs_set_reply_callback (g, NULL, NULL);
2023 if (ctx.cb_sequence != 1001) {
2024 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_rm");
2025 guestfs_set_ready (g);
2029 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_RM, serial) == -1) {
2030 guestfs_set_ready (g);
2034 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2035 error (g, "%s", ctx.err.error_message);
2036 guestfs_set_ready (g);
2040 guestfs_set_ready (g);
2041 return ctx.ret.nrnodes;
2045 /* This flag is set by the callbacks, so we know we've done
2046 * the callbacks as expected, and in the right sequence.
2047 * 0 = not called, 1 = send called,
2048 * 1001 = reply called.
2051 struct guestfs_message_header hdr;
2052 struct guestfs_message_error err;
2055 static void aug_mv_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2057 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2058 struct aug_mv_ctx *ctx = (struct aug_mv_ctx *) data;
2060 ml->main_loop_quit (ml, g);
2062 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2063 error (g, "%s: failed to parse reply header", "guestfs_aug_mv");
2066 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2067 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2068 error (g, "%s: failed to parse reply error", "guestfs_aug_mv");
2074 ctx->cb_sequence = 1001;
2077 int guestfs_aug_mv (guestfs_h *g,
2081 struct guestfs_aug_mv_args args;
2082 struct aug_mv_ctx ctx;
2083 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2086 if (check_state (g, "guestfs_aug_mv") == -1) return -1;
2087 guestfs_set_busy (g);
2089 memset (&ctx, 0, sizeof ctx);
2091 args.src = (char *) src;
2092 args.dest = (char *) dest;
2093 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_MV,
2094 (xdrproc_t) xdr_guestfs_aug_mv_args, (char *) &args);
2096 guestfs_set_ready (g);
2101 guestfs__switch_to_receiving (g);
2102 ctx.cb_sequence = 0;
2103 guestfs_set_reply_callback (g, aug_mv_reply_cb, &ctx);
2104 (void) ml->main_loop_run (ml, g);
2105 guestfs_set_reply_callback (g, NULL, NULL);
2106 if (ctx.cb_sequence != 1001) {
2107 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_mv");
2108 guestfs_set_ready (g);
2112 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_MV, serial) == -1) {
2113 guestfs_set_ready (g);
2117 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2118 error (g, "%s", ctx.err.error_message);
2119 guestfs_set_ready (g);
2123 guestfs_set_ready (g);
2127 struct aug_match_ctx {
2128 /* This flag is set by the callbacks, so we know we've done
2129 * the callbacks as expected, and in the right sequence.
2130 * 0 = not called, 1 = send called,
2131 * 1001 = reply called.
2134 struct guestfs_message_header hdr;
2135 struct guestfs_message_error err;
2136 struct guestfs_aug_match_ret ret;
2139 static void aug_match_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2141 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2142 struct aug_match_ctx *ctx = (struct aug_match_ctx *) data;
2144 ml->main_loop_quit (ml, g);
2146 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2147 error (g, "%s: failed to parse reply header", "guestfs_aug_match");
2150 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2151 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2152 error (g, "%s: failed to parse reply error", "guestfs_aug_match");
2157 if (!xdr_guestfs_aug_match_ret (xdr, &ctx->ret)) {
2158 error (g, "%s: failed to parse reply", "guestfs_aug_match");
2162 ctx->cb_sequence = 1001;
2165 char **guestfs_aug_match (guestfs_h *g,
2168 struct guestfs_aug_match_args args;
2169 struct aug_match_ctx ctx;
2170 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2173 if (check_state (g, "guestfs_aug_match") == -1) return NULL;
2174 guestfs_set_busy (g);
2176 memset (&ctx, 0, sizeof ctx);
2178 args.path = (char *) path;
2179 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_MATCH,
2180 (xdrproc_t) xdr_guestfs_aug_match_args, (char *) &args);
2182 guestfs_set_ready (g);
2187 guestfs__switch_to_receiving (g);
2188 ctx.cb_sequence = 0;
2189 guestfs_set_reply_callback (g, aug_match_reply_cb, &ctx);
2190 (void) ml->main_loop_run (ml, g);
2191 guestfs_set_reply_callback (g, NULL, NULL);
2192 if (ctx.cb_sequence != 1001) {
2193 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_match");
2194 guestfs_set_ready (g);
2198 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_MATCH, serial) == -1) {
2199 guestfs_set_ready (g);
2203 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2204 error (g, "%s", ctx.err.error_message);
2205 guestfs_set_ready (g);
2209 guestfs_set_ready (g);
2210 /* caller will free this, but we need to add a NULL entry */
2211 ctx.ret.matches.matches_val =
2212 safe_realloc (g, ctx.ret.matches.matches_val,
2213 sizeof (char *) * (ctx.ret.matches.matches_len + 1));
2214 ctx.ret.matches.matches_val[ctx.ret.matches.matches_len] = NULL;
2215 return ctx.ret.matches.matches_val;
2218 struct aug_save_ctx {
2219 /* This flag is set by the callbacks, so we know we've done
2220 * the callbacks as expected, and in the right sequence.
2221 * 0 = not called, 1 = send called,
2222 * 1001 = reply called.
2225 struct guestfs_message_header hdr;
2226 struct guestfs_message_error err;
2229 static void aug_save_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2231 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2232 struct aug_save_ctx *ctx = (struct aug_save_ctx *) data;
2234 ml->main_loop_quit (ml, g);
2236 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2237 error (g, "%s: failed to parse reply header", "guestfs_aug_save");
2240 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2241 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2242 error (g, "%s: failed to parse reply error", "guestfs_aug_save");
2248 ctx->cb_sequence = 1001;
2251 int guestfs_aug_save (guestfs_h *g)
2253 struct aug_save_ctx ctx;
2254 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2257 if (check_state (g, "guestfs_aug_save") == -1) return -1;
2258 guestfs_set_busy (g);
2260 memset (&ctx, 0, sizeof ctx);
2262 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_SAVE, NULL, NULL);
2264 guestfs_set_ready (g);
2269 guestfs__switch_to_receiving (g);
2270 ctx.cb_sequence = 0;
2271 guestfs_set_reply_callback (g, aug_save_reply_cb, &ctx);
2272 (void) ml->main_loop_run (ml, g);
2273 guestfs_set_reply_callback (g, NULL, NULL);
2274 if (ctx.cb_sequence != 1001) {
2275 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_save");
2276 guestfs_set_ready (g);
2280 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_SAVE, serial) == -1) {
2281 guestfs_set_ready (g);
2285 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2286 error (g, "%s", ctx.err.error_message);
2287 guestfs_set_ready (g);
2291 guestfs_set_ready (g);
2295 struct aug_load_ctx {
2296 /* This flag is set by the callbacks, so we know we've done
2297 * the callbacks as expected, and in the right sequence.
2298 * 0 = not called, 1 = send called,
2299 * 1001 = reply called.
2302 struct guestfs_message_header hdr;
2303 struct guestfs_message_error err;
2306 static void aug_load_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2308 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2309 struct aug_load_ctx *ctx = (struct aug_load_ctx *) data;
2311 ml->main_loop_quit (ml, g);
2313 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2314 error (g, "%s: failed to parse reply header", "guestfs_aug_load");
2317 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2318 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2319 error (g, "%s: failed to parse reply error", "guestfs_aug_load");
2325 ctx->cb_sequence = 1001;
2328 int guestfs_aug_load (guestfs_h *g)
2330 struct aug_load_ctx ctx;
2331 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2334 if (check_state (g, "guestfs_aug_load") == -1) return -1;
2335 guestfs_set_busy (g);
2337 memset (&ctx, 0, sizeof ctx);
2339 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_LOAD, NULL, NULL);
2341 guestfs_set_ready (g);
2346 guestfs__switch_to_receiving (g);
2347 ctx.cb_sequence = 0;
2348 guestfs_set_reply_callback (g, aug_load_reply_cb, &ctx);
2349 (void) ml->main_loop_run (ml, g);
2350 guestfs_set_reply_callback (g, NULL, NULL);
2351 if (ctx.cb_sequence != 1001) {
2352 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_load");
2353 guestfs_set_ready (g);
2357 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_LOAD, serial) == -1) {
2358 guestfs_set_ready (g);
2362 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2363 error (g, "%s", ctx.err.error_message);
2364 guestfs_set_ready (g);
2368 guestfs_set_ready (g);
2373 /* This flag is set by the callbacks, so we know we've done
2374 * the callbacks as expected, and in the right sequence.
2375 * 0 = not called, 1 = send called,
2376 * 1001 = reply called.
2379 struct guestfs_message_header hdr;
2380 struct guestfs_message_error err;
2381 struct guestfs_aug_ls_ret ret;
2384 static void aug_ls_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2386 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2387 struct aug_ls_ctx *ctx = (struct aug_ls_ctx *) data;
2389 ml->main_loop_quit (ml, g);
2391 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2392 error (g, "%s: failed to parse reply header", "guestfs_aug_ls");
2395 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2396 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2397 error (g, "%s: failed to parse reply error", "guestfs_aug_ls");
2402 if (!xdr_guestfs_aug_ls_ret (xdr, &ctx->ret)) {
2403 error (g, "%s: failed to parse reply", "guestfs_aug_ls");
2407 ctx->cb_sequence = 1001;
2410 char **guestfs_aug_ls (guestfs_h *g,
2413 struct guestfs_aug_ls_args args;
2414 struct aug_ls_ctx ctx;
2415 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2418 if (check_state (g, "guestfs_aug_ls") == -1) return NULL;
2419 guestfs_set_busy (g);
2421 memset (&ctx, 0, sizeof ctx);
2423 args.path = (char *) path;
2424 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_LS,
2425 (xdrproc_t) xdr_guestfs_aug_ls_args, (char *) &args);
2427 guestfs_set_ready (g);
2432 guestfs__switch_to_receiving (g);
2433 ctx.cb_sequence = 0;
2434 guestfs_set_reply_callback (g, aug_ls_reply_cb, &ctx);
2435 (void) ml->main_loop_run (ml, g);
2436 guestfs_set_reply_callback (g, NULL, NULL);
2437 if (ctx.cb_sequence != 1001) {
2438 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_ls");
2439 guestfs_set_ready (g);
2443 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_LS, serial) == -1) {
2444 guestfs_set_ready (g);
2448 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2449 error (g, "%s", ctx.err.error_message);
2450 guestfs_set_ready (g);
2454 guestfs_set_ready (g);
2455 /* caller will free this, but we need to add a NULL entry */
2456 ctx.ret.matches.matches_val =
2457 safe_realloc (g, ctx.ret.matches.matches_val,
2458 sizeof (char *) * (ctx.ret.matches.matches_len + 1));
2459 ctx.ret.matches.matches_val[ctx.ret.matches.matches_len] = NULL;
2460 return ctx.ret.matches.matches_val;
2464 /* This flag is set by the callbacks, so we know we've done
2465 * the callbacks as expected, and in the right sequence.
2466 * 0 = not called, 1 = send called,
2467 * 1001 = reply called.
2470 struct guestfs_message_header hdr;
2471 struct guestfs_message_error err;
2474 static void rm_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2476 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2477 struct rm_ctx *ctx = (struct rm_ctx *) data;
2479 ml->main_loop_quit (ml, g);
2481 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2482 error (g, "%s: failed to parse reply header", "guestfs_rm");
2485 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2486 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2487 error (g, "%s: failed to parse reply error", "guestfs_rm");
2493 ctx->cb_sequence = 1001;
2496 int guestfs_rm (guestfs_h *g,
2499 struct guestfs_rm_args args;
2501 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2504 if (check_state (g, "guestfs_rm") == -1) return -1;
2505 guestfs_set_busy (g);
2507 memset (&ctx, 0, sizeof ctx);
2509 args.path = (char *) path;
2510 serial = guestfs__send_sync (g, GUESTFS_PROC_RM,
2511 (xdrproc_t) xdr_guestfs_rm_args, (char *) &args);
2513 guestfs_set_ready (g);
2518 guestfs__switch_to_receiving (g);
2519 ctx.cb_sequence = 0;
2520 guestfs_set_reply_callback (g, rm_reply_cb, &ctx);
2521 (void) ml->main_loop_run (ml, g);
2522 guestfs_set_reply_callback (g, NULL, NULL);
2523 if (ctx.cb_sequence != 1001) {
2524 error (g, "%s reply failed, see earlier error messages", "guestfs_rm");
2525 guestfs_set_ready (g);
2529 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_RM, serial) == -1) {
2530 guestfs_set_ready (g);
2534 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2535 error (g, "%s", ctx.err.error_message);
2536 guestfs_set_ready (g);
2540 guestfs_set_ready (g);
2545 /* This flag is set by the callbacks, so we know we've done
2546 * the callbacks as expected, and in the right sequence.
2547 * 0 = not called, 1 = send called,
2548 * 1001 = reply called.
2551 struct guestfs_message_header hdr;
2552 struct guestfs_message_error err;
2555 static void rmdir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2557 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2558 struct rmdir_ctx *ctx = (struct rmdir_ctx *) data;
2560 ml->main_loop_quit (ml, g);
2562 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2563 error (g, "%s: failed to parse reply header", "guestfs_rmdir");
2566 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2567 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2568 error (g, "%s: failed to parse reply error", "guestfs_rmdir");
2574 ctx->cb_sequence = 1001;
2577 int guestfs_rmdir (guestfs_h *g,
2580 struct guestfs_rmdir_args args;
2581 struct rmdir_ctx ctx;
2582 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2585 if (check_state (g, "guestfs_rmdir") == -1) return -1;
2586 guestfs_set_busy (g);
2588 memset (&ctx, 0, sizeof ctx);
2590 args.path = (char *) path;
2591 serial = guestfs__send_sync (g, GUESTFS_PROC_RMDIR,
2592 (xdrproc_t) xdr_guestfs_rmdir_args, (char *) &args);
2594 guestfs_set_ready (g);
2599 guestfs__switch_to_receiving (g);
2600 ctx.cb_sequence = 0;
2601 guestfs_set_reply_callback (g, rmdir_reply_cb, &ctx);
2602 (void) ml->main_loop_run (ml, g);
2603 guestfs_set_reply_callback (g, NULL, NULL);
2604 if (ctx.cb_sequence != 1001) {
2605 error (g, "%s reply failed, see earlier error messages", "guestfs_rmdir");
2606 guestfs_set_ready (g);
2610 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_RMDIR, serial) == -1) {
2611 guestfs_set_ready (g);
2615 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2616 error (g, "%s", ctx.err.error_message);
2617 guestfs_set_ready (g);
2621 guestfs_set_ready (g);
2626 /* This flag is set by the callbacks, so we know we've done
2627 * the callbacks as expected, and in the right sequence.
2628 * 0 = not called, 1 = send called,
2629 * 1001 = reply called.
2632 struct guestfs_message_header hdr;
2633 struct guestfs_message_error err;
2636 static void rm_rf_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2638 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2639 struct rm_rf_ctx *ctx = (struct rm_rf_ctx *) data;
2641 ml->main_loop_quit (ml, g);
2643 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2644 error (g, "%s: failed to parse reply header", "guestfs_rm_rf");
2647 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2648 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2649 error (g, "%s: failed to parse reply error", "guestfs_rm_rf");
2655 ctx->cb_sequence = 1001;
2658 int guestfs_rm_rf (guestfs_h *g,
2661 struct guestfs_rm_rf_args args;
2662 struct rm_rf_ctx ctx;
2663 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2666 if (check_state (g, "guestfs_rm_rf") == -1) return -1;
2667 guestfs_set_busy (g);
2669 memset (&ctx, 0, sizeof ctx);
2671 args.path = (char *) path;
2672 serial = guestfs__send_sync (g, GUESTFS_PROC_RM_RF,
2673 (xdrproc_t) xdr_guestfs_rm_rf_args, (char *) &args);
2675 guestfs_set_ready (g);
2680 guestfs__switch_to_receiving (g);
2681 ctx.cb_sequence = 0;
2682 guestfs_set_reply_callback (g, rm_rf_reply_cb, &ctx);
2683 (void) ml->main_loop_run (ml, g);
2684 guestfs_set_reply_callback (g, NULL, NULL);
2685 if (ctx.cb_sequence != 1001) {
2686 error (g, "%s reply failed, see earlier error messages", "guestfs_rm_rf");
2687 guestfs_set_ready (g);
2691 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_RM_RF, serial) == -1) {
2692 guestfs_set_ready (g);
2696 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2697 error (g, "%s", ctx.err.error_message);
2698 guestfs_set_ready (g);
2702 guestfs_set_ready (g);
2707 /* This flag is set by the callbacks, so we know we've done
2708 * the callbacks as expected, and in the right sequence.
2709 * 0 = not called, 1 = send called,
2710 * 1001 = reply called.
2713 struct guestfs_message_header hdr;
2714 struct guestfs_message_error err;
2717 static void mkdir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2719 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2720 struct mkdir_ctx *ctx = (struct mkdir_ctx *) data;
2722 ml->main_loop_quit (ml, g);
2724 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2725 error (g, "%s: failed to parse reply header", "guestfs_mkdir");
2728 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2729 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2730 error (g, "%s: failed to parse reply error", "guestfs_mkdir");
2736 ctx->cb_sequence = 1001;
2739 int guestfs_mkdir (guestfs_h *g,
2742 struct guestfs_mkdir_args args;
2743 struct mkdir_ctx ctx;
2744 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2747 if (check_state (g, "guestfs_mkdir") == -1) return -1;
2748 guestfs_set_busy (g);
2750 memset (&ctx, 0, sizeof ctx);
2752 args.path = (char *) path;
2753 serial = guestfs__send_sync (g, GUESTFS_PROC_MKDIR,
2754 (xdrproc_t) xdr_guestfs_mkdir_args, (char *) &args);
2756 guestfs_set_ready (g);
2761 guestfs__switch_to_receiving (g);
2762 ctx.cb_sequence = 0;
2763 guestfs_set_reply_callback (g, mkdir_reply_cb, &ctx);
2764 (void) ml->main_loop_run (ml, g);
2765 guestfs_set_reply_callback (g, NULL, NULL);
2766 if (ctx.cb_sequence != 1001) {
2767 error (g, "%s reply failed, see earlier error messages", "guestfs_mkdir");
2768 guestfs_set_ready (g);
2772 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MKDIR, serial) == -1) {
2773 guestfs_set_ready (g);
2777 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2778 error (g, "%s", ctx.err.error_message);
2779 guestfs_set_ready (g);
2783 guestfs_set_ready (g);
2787 struct mkdir_p_ctx {
2788 /* This flag is set by the callbacks, so we know we've done
2789 * the callbacks as expected, and in the right sequence.
2790 * 0 = not called, 1 = send called,
2791 * 1001 = reply called.
2794 struct guestfs_message_header hdr;
2795 struct guestfs_message_error err;
2798 static void mkdir_p_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2800 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2801 struct mkdir_p_ctx *ctx = (struct mkdir_p_ctx *) data;
2803 ml->main_loop_quit (ml, g);
2805 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2806 error (g, "%s: failed to parse reply header", "guestfs_mkdir_p");
2809 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2810 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2811 error (g, "%s: failed to parse reply error", "guestfs_mkdir_p");
2817 ctx->cb_sequence = 1001;
2820 int guestfs_mkdir_p (guestfs_h *g,
2823 struct guestfs_mkdir_p_args args;
2824 struct mkdir_p_ctx ctx;
2825 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2828 if (check_state (g, "guestfs_mkdir_p") == -1) return -1;
2829 guestfs_set_busy (g);
2831 memset (&ctx, 0, sizeof ctx);
2833 args.path = (char *) path;
2834 serial = guestfs__send_sync (g, GUESTFS_PROC_MKDIR_P,
2835 (xdrproc_t) xdr_guestfs_mkdir_p_args, (char *) &args);
2837 guestfs_set_ready (g);
2842 guestfs__switch_to_receiving (g);
2843 ctx.cb_sequence = 0;
2844 guestfs_set_reply_callback (g, mkdir_p_reply_cb, &ctx);
2845 (void) ml->main_loop_run (ml, g);
2846 guestfs_set_reply_callback (g, NULL, NULL);
2847 if (ctx.cb_sequence != 1001) {
2848 error (g, "%s reply failed, see earlier error messages", "guestfs_mkdir_p");
2849 guestfs_set_ready (g);
2853 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MKDIR_P, serial) == -1) {
2854 guestfs_set_ready (g);
2858 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2859 error (g, "%s", ctx.err.error_message);
2860 guestfs_set_ready (g);
2864 guestfs_set_ready (g);
2869 /* This flag is set by the callbacks, so we know we've done
2870 * the callbacks as expected, and in the right sequence.
2871 * 0 = not called, 1 = send called,
2872 * 1001 = reply called.
2875 struct guestfs_message_header hdr;
2876 struct guestfs_message_error err;
2879 static void chmod_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2881 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2882 struct chmod_ctx *ctx = (struct chmod_ctx *) data;
2884 ml->main_loop_quit (ml, g);
2886 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2887 error (g, "%s: failed to parse reply header", "guestfs_chmod");
2890 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2891 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2892 error (g, "%s: failed to parse reply error", "guestfs_chmod");
2898 ctx->cb_sequence = 1001;
2901 int guestfs_chmod (guestfs_h *g,
2905 struct guestfs_chmod_args args;
2906 struct chmod_ctx ctx;
2907 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2910 if (check_state (g, "guestfs_chmod") == -1) return -1;
2911 guestfs_set_busy (g);
2913 memset (&ctx, 0, sizeof ctx);
2916 args.path = (char *) path;
2917 serial = guestfs__send_sync (g, GUESTFS_PROC_CHMOD,
2918 (xdrproc_t) xdr_guestfs_chmod_args, (char *) &args);
2920 guestfs_set_ready (g);
2925 guestfs__switch_to_receiving (g);
2926 ctx.cb_sequence = 0;
2927 guestfs_set_reply_callback (g, chmod_reply_cb, &ctx);
2928 (void) ml->main_loop_run (ml, g);
2929 guestfs_set_reply_callback (g, NULL, NULL);
2930 if (ctx.cb_sequence != 1001) {
2931 error (g, "%s reply failed, see earlier error messages", "guestfs_chmod");
2932 guestfs_set_ready (g);
2936 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_CHMOD, serial) == -1) {
2937 guestfs_set_ready (g);
2941 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2942 error (g, "%s", ctx.err.error_message);
2943 guestfs_set_ready (g);
2947 guestfs_set_ready (g);
2952 /* This flag is set by the callbacks, so we know we've done
2953 * the callbacks as expected, and in the right sequence.
2954 * 0 = not called, 1 = send called,
2955 * 1001 = reply called.
2958 struct guestfs_message_header hdr;
2959 struct guestfs_message_error err;
2962 static void chown_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2964 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2965 struct chown_ctx *ctx = (struct chown_ctx *) data;
2967 ml->main_loop_quit (ml, g);
2969 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2970 error (g, "%s: failed to parse reply header", "guestfs_chown");
2973 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2974 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2975 error (g, "%s: failed to parse reply error", "guestfs_chown");
2981 ctx->cb_sequence = 1001;
2984 int guestfs_chown (guestfs_h *g,
2989 struct guestfs_chown_args args;
2990 struct chown_ctx ctx;
2991 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2994 if (check_state (g, "guestfs_chown") == -1) return -1;
2995 guestfs_set_busy (g);
2997 memset (&ctx, 0, sizeof ctx);
3001 args.path = (char *) path;
3002 serial = guestfs__send_sync (g, GUESTFS_PROC_CHOWN,
3003 (xdrproc_t) xdr_guestfs_chown_args, (char *) &args);
3005 guestfs_set_ready (g);
3010 guestfs__switch_to_receiving (g);
3011 ctx.cb_sequence = 0;
3012 guestfs_set_reply_callback (g, chown_reply_cb, &ctx);
3013 (void) ml->main_loop_run (ml, g);
3014 guestfs_set_reply_callback (g, NULL, NULL);
3015 if (ctx.cb_sequence != 1001) {
3016 error (g, "%s reply failed, see earlier error messages", "guestfs_chown");
3017 guestfs_set_ready (g);
3021 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_CHOWN, serial) == -1) {
3022 guestfs_set_ready (g);
3026 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3027 error (g, "%s", ctx.err.error_message);
3028 guestfs_set_ready (g);
3032 guestfs_set_ready (g);
3037 /* This flag is set by the callbacks, so we know we've done
3038 * the callbacks as expected, and in the right sequence.
3039 * 0 = not called, 1 = send called,
3040 * 1001 = reply called.
3043 struct guestfs_message_header hdr;
3044 struct guestfs_message_error err;
3045 struct guestfs_exists_ret ret;
3048 static void exists_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3050 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3051 struct exists_ctx *ctx = (struct exists_ctx *) data;
3053 ml->main_loop_quit (ml, g);
3055 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3056 error (g, "%s: failed to parse reply header", "guestfs_exists");
3059 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3060 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3061 error (g, "%s: failed to parse reply error", "guestfs_exists");
3066 if (!xdr_guestfs_exists_ret (xdr, &ctx->ret)) {
3067 error (g, "%s: failed to parse reply", "guestfs_exists");
3071 ctx->cb_sequence = 1001;
3074 int guestfs_exists (guestfs_h *g,
3077 struct guestfs_exists_args args;
3078 struct exists_ctx ctx;
3079 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3082 if (check_state (g, "guestfs_exists") == -1) return -1;
3083 guestfs_set_busy (g);
3085 memset (&ctx, 0, sizeof ctx);
3087 args.path = (char *) path;
3088 serial = guestfs__send_sync (g, GUESTFS_PROC_EXISTS,
3089 (xdrproc_t) xdr_guestfs_exists_args, (char *) &args);
3091 guestfs_set_ready (g);
3096 guestfs__switch_to_receiving (g);
3097 ctx.cb_sequence = 0;
3098 guestfs_set_reply_callback (g, exists_reply_cb, &ctx);
3099 (void) ml->main_loop_run (ml, g);
3100 guestfs_set_reply_callback (g, NULL, NULL);
3101 if (ctx.cb_sequence != 1001) {
3102 error (g, "%s reply failed, see earlier error messages", "guestfs_exists");
3103 guestfs_set_ready (g);
3107 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_EXISTS, serial) == -1) {
3108 guestfs_set_ready (g);
3112 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3113 error (g, "%s", ctx.err.error_message);
3114 guestfs_set_ready (g);
3118 guestfs_set_ready (g);
3119 return ctx.ret.existsflag;
3122 struct is_file_ctx {
3123 /* This flag is set by the callbacks, so we know we've done
3124 * the callbacks as expected, and in the right sequence.
3125 * 0 = not called, 1 = send called,
3126 * 1001 = reply called.
3129 struct guestfs_message_header hdr;
3130 struct guestfs_message_error err;
3131 struct guestfs_is_file_ret ret;
3134 static void is_file_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3136 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3137 struct is_file_ctx *ctx = (struct is_file_ctx *) data;
3139 ml->main_loop_quit (ml, g);
3141 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3142 error (g, "%s: failed to parse reply header", "guestfs_is_file");
3145 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3146 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3147 error (g, "%s: failed to parse reply error", "guestfs_is_file");
3152 if (!xdr_guestfs_is_file_ret (xdr, &ctx->ret)) {
3153 error (g, "%s: failed to parse reply", "guestfs_is_file");
3157 ctx->cb_sequence = 1001;
3160 int guestfs_is_file (guestfs_h *g,
3163 struct guestfs_is_file_args args;
3164 struct is_file_ctx ctx;
3165 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3168 if (check_state (g, "guestfs_is_file") == -1) return -1;
3169 guestfs_set_busy (g);
3171 memset (&ctx, 0, sizeof ctx);
3173 args.path = (char *) path;
3174 serial = guestfs__send_sync (g, GUESTFS_PROC_IS_FILE,
3175 (xdrproc_t) xdr_guestfs_is_file_args, (char *) &args);
3177 guestfs_set_ready (g);
3182 guestfs__switch_to_receiving (g);
3183 ctx.cb_sequence = 0;
3184 guestfs_set_reply_callback (g, is_file_reply_cb, &ctx);
3185 (void) ml->main_loop_run (ml, g);
3186 guestfs_set_reply_callback (g, NULL, NULL);
3187 if (ctx.cb_sequence != 1001) {
3188 error (g, "%s reply failed, see earlier error messages", "guestfs_is_file");
3189 guestfs_set_ready (g);
3193 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_IS_FILE, serial) == -1) {
3194 guestfs_set_ready (g);
3198 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3199 error (g, "%s", ctx.err.error_message);
3200 guestfs_set_ready (g);
3204 guestfs_set_ready (g);
3205 return ctx.ret.fileflag;
3209 /* This flag is set by the callbacks, so we know we've done
3210 * the callbacks as expected, and in the right sequence.
3211 * 0 = not called, 1 = send called,
3212 * 1001 = reply called.
3215 struct guestfs_message_header hdr;
3216 struct guestfs_message_error err;
3217 struct guestfs_is_dir_ret ret;
3220 static void is_dir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3222 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3223 struct is_dir_ctx *ctx = (struct is_dir_ctx *) data;
3225 ml->main_loop_quit (ml, g);
3227 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3228 error (g, "%s: failed to parse reply header", "guestfs_is_dir");
3231 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3232 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3233 error (g, "%s: failed to parse reply error", "guestfs_is_dir");
3238 if (!xdr_guestfs_is_dir_ret (xdr, &ctx->ret)) {
3239 error (g, "%s: failed to parse reply", "guestfs_is_dir");
3243 ctx->cb_sequence = 1001;
3246 int guestfs_is_dir (guestfs_h *g,
3249 struct guestfs_is_dir_args args;
3250 struct is_dir_ctx ctx;
3251 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3254 if (check_state (g, "guestfs_is_dir") == -1) return -1;
3255 guestfs_set_busy (g);
3257 memset (&ctx, 0, sizeof ctx);
3259 args.path = (char *) path;
3260 serial = guestfs__send_sync (g, GUESTFS_PROC_IS_DIR,
3261 (xdrproc_t) xdr_guestfs_is_dir_args, (char *) &args);
3263 guestfs_set_ready (g);
3268 guestfs__switch_to_receiving (g);
3269 ctx.cb_sequence = 0;
3270 guestfs_set_reply_callback (g, is_dir_reply_cb, &ctx);
3271 (void) ml->main_loop_run (ml, g);
3272 guestfs_set_reply_callback (g, NULL, NULL);
3273 if (ctx.cb_sequence != 1001) {
3274 error (g, "%s reply failed, see earlier error messages", "guestfs_is_dir");
3275 guestfs_set_ready (g);
3279 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_IS_DIR, serial) == -1) {
3280 guestfs_set_ready (g);
3284 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3285 error (g, "%s", ctx.err.error_message);
3286 guestfs_set_ready (g);
3290 guestfs_set_ready (g);
3291 return ctx.ret.dirflag;
3294 struct pvcreate_ctx {
3295 /* This flag is set by the callbacks, so we know we've done
3296 * the callbacks as expected, and in the right sequence.
3297 * 0 = not called, 1 = send called,
3298 * 1001 = reply called.
3301 struct guestfs_message_header hdr;
3302 struct guestfs_message_error err;
3305 static void pvcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3307 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3308 struct pvcreate_ctx *ctx = (struct pvcreate_ctx *) data;
3310 ml->main_loop_quit (ml, g);
3312 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3313 error (g, "%s: failed to parse reply header", "guestfs_pvcreate");
3316 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3317 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3318 error (g, "%s: failed to parse reply error", "guestfs_pvcreate");
3324 ctx->cb_sequence = 1001;
3327 int guestfs_pvcreate (guestfs_h *g,
3330 struct guestfs_pvcreate_args args;
3331 struct pvcreate_ctx ctx;
3332 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3335 if (check_state (g, "guestfs_pvcreate") == -1) return -1;
3336 guestfs_set_busy (g);
3338 memset (&ctx, 0, sizeof ctx);
3340 args.device = (char *) device;
3341 serial = guestfs__send_sync (g, GUESTFS_PROC_PVCREATE,
3342 (xdrproc_t) xdr_guestfs_pvcreate_args, (char *) &args);
3344 guestfs_set_ready (g);
3349 guestfs__switch_to_receiving (g);
3350 ctx.cb_sequence = 0;
3351 guestfs_set_reply_callback (g, pvcreate_reply_cb, &ctx);
3352 (void) ml->main_loop_run (ml, g);
3353 guestfs_set_reply_callback (g, NULL, NULL);
3354 if (ctx.cb_sequence != 1001) {
3355 error (g, "%s reply failed, see earlier error messages", "guestfs_pvcreate");
3356 guestfs_set_ready (g);
3360 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_PVCREATE, serial) == -1) {
3361 guestfs_set_ready (g);
3365 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3366 error (g, "%s", ctx.err.error_message);
3367 guestfs_set_ready (g);
3371 guestfs_set_ready (g);
3375 struct vgcreate_ctx {
3376 /* This flag is set by the callbacks, so we know we've done
3377 * the callbacks as expected, and in the right sequence.
3378 * 0 = not called, 1 = send called,
3379 * 1001 = reply called.
3382 struct guestfs_message_header hdr;
3383 struct guestfs_message_error err;
3386 static void vgcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3388 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3389 struct vgcreate_ctx *ctx = (struct vgcreate_ctx *) data;
3391 ml->main_loop_quit (ml, g);
3393 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3394 error (g, "%s: failed to parse reply header", "guestfs_vgcreate");
3397 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3398 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3399 error (g, "%s: failed to parse reply error", "guestfs_vgcreate");
3405 ctx->cb_sequence = 1001;
3408 int guestfs_vgcreate (guestfs_h *g,
3409 const char *volgroup,
3410 char * const* const physvols)
3412 struct guestfs_vgcreate_args args;
3413 struct vgcreate_ctx ctx;
3414 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3417 if (check_state (g, "guestfs_vgcreate") == -1) return -1;
3418 guestfs_set_busy (g);
3420 memset (&ctx, 0, sizeof ctx);
3422 args.volgroup = (char *) volgroup;
3423 args.physvols.physvols_val = (char **) physvols;
3424 for (args.physvols.physvols_len = 0; physvols[args.physvols.physvols_len]; args.physvols.physvols_len++) ;
3425 serial = guestfs__send_sync (g, GUESTFS_PROC_VGCREATE,
3426 (xdrproc_t) xdr_guestfs_vgcreate_args, (char *) &args);
3428 guestfs_set_ready (g);
3433 guestfs__switch_to_receiving (g);
3434 ctx.cb_sequence = 0;
3435 guestfs_set_reply_callback (g, vgcreate_reply_cb, &ctx);
3436 (void) ml->main_loop_run (ml, g);
3437 guestfs_set_reply_callback (g, NULL, NULL);
3438 if (ctx.cb_sequence != 1001) {
3439 error (g, "%s reply failed, see earlier error messages", "guestfs_vgcreate");
3440 guestfs_set_ready (g);
3444 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_VGCREATE, serial) == -1) {
3445 guestfs_set_ready (g);
3449 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3450 error (g, "%s", ctx.err.error_message);
3451 guestfs_set_ready (g);
3455 guestfs_set_ready (g);
3459 struct lvcreate_ctx {
3460 /* This flag is set by the callbacks, so we know we've done
3461 * the callbacks as expected, and in the right sequence.
3462 * 0 = not called, 1 = send called,
3463 * 1001 = reply called.
3466 struct guestfs_message_header hdr;
3467 struct guestfs_message_error err;
3470 static void lvcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3472 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3473 struct lvcreate_ctx *ctx = (struct lvcreate_ctx *) data;
3475 ml->main_loop_quit (ml, g);
3477 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3478 error (g, "%s: failed to parse reply header", "guestfs_lvcreate");
3481 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3482 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3483 error (g, "%s: failed to parse reply error", "guestfs_lvcreate");
3489 ctx->cb_sequence = 1001;
3492 int guestfs_lvcreate (guestfs_h *g,
3494 const char *volgroup,
3497 struct guestfs_lvcreate_args args;
3498 struct lvcreate_ctx ctx;
3499 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3502 if (check_state (g, "guestfs_lvcreate") == -1) return -1;
3503 guestfs_set_busy (g);
3505 memset (&ctx, 0, sizeof ctx);
3507 args.logvol = (char *) logvol;
3508 args.volgroup = (char *) volgroup;
3509 args.mbytes = mbytes;
3510 serial = guestfs__send_sync (g, GUESTFS_PROC_LVCREATE,
3511 (xdrproc_t) xdr_guestfs_lvcreate_args, (char *) &args);
3513 guestfs_set_ready (g);
3518 guestfs__switch_to_receiving (g);
3519 ctx.cb_sequence = 0;
3520 guestfs_set_reply_callback (g, lvcreate_reply_cb, &ctx);
3521 (void) ml->main_loop_run (ml, g);
3522 guestfs_set_reply_callback (g, NULL, NULL);
3523 if (ctx.cb_sequence != 1001) {
3524 error (g, "%s reply failed, see earlier error messages", "guestfs_lvcreate");
3525 guestfs_set_ready (g);
3529 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LVCREATE, serial) == -1) {
3530 guestfs_set_ready (g);
3534 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3535 error (g, "%s", ctx.err.error_message);
3536 guestfs_set_ready (g);
3540 guestfs_set_ready (g);
3545 /* This flag is set by the callbacks, so we know we've done
3546 * the callbacks as expected, and in the right sequence.
3547 * 0 = not called, 1 = send called,
3548 * 1001 = reply called.
3551 struct guestfs_message_header hdr;
3552 struct guestfs_message_error err;
3555 static void mkfs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3557 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3558 struct mkfs_ctx *ctx = (struct mkfs_ctx *) data;
3560 ml->main_loop_quit (ml, g);
3562 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3563 error (g, "%s: failed to parse reply header", "guestfs_mkfs");
3566 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3567 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3568 error (g, "%s: failed to parse reply error", "guestfs_mkfs");
3574 ctx->cb_sequence = 1001;
3577 int guestfs_mkfs (guestfs_h *g,
3581 struct guestfs_mkfs_args args;
3582 struct mkfs_ctx ctx;
3583 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3586 if (check_state (g, "guestfs_mkfs") == -1) return -1;
3587 guestfs_set_busy (g);
3589 memset (&ctx, 0, sizeof ctx);
3591 args.fstype = (char *) fstype;
3592 args.device = (char *) device;
3593 serial = guestfs__send_sync (g, GUESTFS_PROC_MKFS,
3594 (xdrproc_t) xdr_guestfs_mkfs_args, (char *) &args);
3596 guestfs_set_ready (g);
3601 guestfs__switch_to_receiving (g);
3602 ctx.cb_sequence = 0;
3603 guestfs_set_reply_callback (g, mkfs_reply_cb, &ctx);
3604 (void) ml->main_loop_run (ml, g);
3605 guestfs_set_reply_callback (g, NULL, NULL);
3606 if (ctx.cb_sequence != 1001) {
3607 error (g, "%s reply failed, see earlier error messages", "guestfs_mkfs");
3608 guestfs_set_ready (g);
3612 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MKFS, serial) == -1) {
3613 guestfs_set_ready (g);
3617 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3618 error (g, "%s", ctx.err.error_message);
3619 guestfs_set_ready (g);
3623 guestfs_set_ready (g);
3628 /* This flag is set by the callbacks, so we know we've done
3629 * the callbacks as expected, and in the right sequence.
3630 * 0 = not called, 1 = send called,
3631 * 1001 = reply called.
3634 struct guestfs_message_header hdr;
3635 struct guestfs_message_error err;
3638 static void sfdisk_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3640 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3641 struct sfdisk_ctx *ctx = (struct sfdisk_ctx *) data;
3643 ml->main_loop_quit (ml, g);
3645 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3646 error (g, "%s: failed to parse reply header", "guestfs_sfdisk");
3649 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3650 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3651 error (g, "%s: failed to parse reply error", "guestfs_sfdisk");
3657 ctx->cb_sequence = 1001;
3660 int guestfs_sfdisk (guestfs_h *g,
3665 char * const* const lines)
3667 struct guestfs_sfdisk_args args;
3668 struct sfdisk_ctx ctx;
3669 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3672 if (check_state (g, "guestfs_sfdisk") == -1) return -1;
3673 guestfs_set_busy (g);
3675 memset (&ctx, 0, sizeof ctx);
3677 args.device = (char *) device;
3680 args.sectors = sectors;
3681 args.lines.lines_val = (char **) lines;
3682 for (args.lines.lines_len = 0; lines[args.lines.lines_len]; args.lines.lines_len++) ;
3683 serial = guestfs__send_sync (g, GUESTFS_PROC_SFDISK,
3684 (xdrproc_t) xdr_guestfs_sfdisk_args, (char *) &args);
3686 guestfs_set_ready (g);
3691 guestfs__switch_to_receiving (g);
3692 ctx.cb_sequence = 0;
3693 guestfs_set_reply_callback (g, sfdisk_reply_cb, &ctx);
3694 (void) ml->main_loop_run (ml, g);
3695 guestfs_set_reply_callback (g, NULL, NULL);
3696 if (ctx.cb_sequence != 1001) {
3697 error (g, "%s reply failed, see earlier error messages", "guestfs_sfdisk");
3698 guestfs_set_ready (g);
3702 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_SFDISK, serial) == -1) {
3703 guestfs_set_ready (g);
3707 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3708 error (g, "%s", ctx.err.error_message);
3709 guestfs_set_ready (g);
3713 guestfs_set_ready (g);
3717 struct write_file_ctx {
3718 /* This flag is set by the callbacks, so we know we've done
3719 * the callbacks as expected, and in the right sequence.
3720 * 0 = not called, 1 = send called,
3721 * 1001 = reply called.
3724 struct guestfs_message_header hdr;
3725 struct guestfs_message_error err;
3728 static void write_file_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3730 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3731 struct write_file_ctx *ctx = (struct write_file_ctx *) data;
3733 ml->main_loop_quit (ml, g);
3735 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3736 error (g, "%s: failed to parse reply header", "guestfs_write_file");
3739 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3740 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3741 error (g, "%s: failed to parse reply error", "guestfs_write_file");
3747 ctx->cb_sequence = 1001;
3750 int guestfs_write_file (guestfs_h *g,
3752 const char *content,
3755 struct guestfs_write_file_args args;
3756 struct write_file_ctx ctx;
3757 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3760 if (check_state (g, "guestfs_write_file") == -1) return -1;
3761 guestfs_set_busy (g);
3763 memset (&ctx, 0, sizeof ctx);
3765 args.path = (char *) path;
3766 args.content = (char *) content;
3768 serial = guestfs__send_sync (g, GUESTFS_PROC_WRITE_FILE,
3769 (xdrproc_t) xdr_guestfs_write_file_args, (char *) &args);
3771 guestfs_set_ready (g);
3776 guestfs__switch_to_receiving (g);
3777 ctx.cb_sequence = 0;
3778 guestfs_set_reply_callback (g, write_file_reply_cb, &ctx);
3779 (void) ml->main_loop_run (ml, g);
3780 guestfs_set_reply_callback (g, NULL, NULL);
3781 if (ctx.cb_sequence != 1001) {
3782 error (g, "%s reply failed, see earlier error messages", "guestfs_write_file");
3783 guestfs_set_ready (g);
3787 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_WRITE_FILE, serial) == -1) {
3788 guestfs_set_ready (g);
3792 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3793 error (g, "%s", ctx.err.error_message);
3794 guestfs_set_ready (g);
3798 guestfs_set_ready (g);
3803 /* This flag is set by the callbacks, so we know we've done
3804 * the callbacks as expected, and in the right sequence.
3805 * 0 = not called, 1 = send called,
3806 * 1001 = reply called.
3809 struct guestfs_message_header hdr;
3810 struct guestfs_message_error err;
3813 static void umount_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3815 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3816 struct umount_ctx *ctx = (struct umount_ctx *) data;
3818 ml->main_loop_quit (ml, g);
3820 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3821 error (g, "%s: failed to parse reply header", "guestfs_umount");
3824 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3825 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3826 error (g, "%s: failed to parse reply error", "guestfs_umount");
3832 ctx->cb_sequence = 1001;
3835 int guestfs_umount (guestfs_h *g,
3836 const char *pathordevice)
3838 struct guestfs_umount_args args;
3839 struct umount_ctx ctx;
3840 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3843 if (check_state (g, "guestfs_umount") == -1) return -1;
3844 guestfs_set_busy (g);
3846 memset (&ctx, 0, sizeof ctx);
3848 args.pathordevice = (char *) pathordevice;
3849 serial = guestfs__send_sync (g, GUESTFS_PROC_UMOUNT,
3850 (xdrproc_t) xdr_guestfs_umount_args, (char *) &args);
3852 guestfs_set_ready (g);
3857 guestfs__switch_to_receiving (g);
3858 ctx.cb_sequence = 0;
3859 guestfs_set_reply_callback (g, umount_reply_cb, &ctx);
3860 (void) ml->main_loop_run (ml, g);
3861 guestfs_set_reply_callback (g, NULL, NULL);
3862 if (ctx.cb_sequence != 1001) {
3863 error (g, "%s reply failed, see earlier error messages", "guestfs_umount");
3864 guestfs_set_ready (g);
3868 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_UMOUNT, serial) == -1) {
3869 guestfs_set_ready (g);
3873 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3874 error (g, "%s", ctx.err.error_message);
3875 guestfs_set_ready (g);
3879 guestfs_set_ready (g);
3884 /* This flag is set by the callbacks, so we know we've done
3885 * the callbacks as expected, and in the right sequence.
3886 * 0 = not called, 1 = send called,
3887 * 1001 = reply called.
3890 struct guestfs_message_header hdr;
3891 struct guestfs_message_error err;
3892 struct guestfs_mounts_ret ret;
3895 static void mounts_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3897 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3898 struct mounts_ctx *ctx = (struct mounts_ctx *) data;
3900 ml->main_loop_quit (ml, g);
3902 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3903 error (g, "%s: failed to parse reply header", "guestfs_mounts");
3906 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3907 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3908 error (g, "%s: failed to parse reply error", "guestfs_mounts");
3913 if (!xdr_guestfs_mounts_ret (xdr, &ctx->ret)) {
3914 error (g, "%s: failed to parse reply", "guestfs_mounts");
3918 ctx->cb_sequence = 1001;
3921 char **guestfs_mounts (guestfs_h *g)
3923 struct mounts_ctx ctx;
3924 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3927 if (check_state (g, "guestfs_mounts") == -1) return NULL;
3928 guestfs_set_busy (g);
3930 memset (&ctx, 0, sizeof ctx);
3932 serial = guestfs__send_sync (g, GUESTFS_PROC_MOUNTS, NULL, NULL);
3934 guestfs_set_ready (g);
3939 guestfs__switch_to_receiving (g);
3940 ctx.cb_sequence = 0;
3941 guestfs_set_reply_callback (g, mounts_reply_cb, &ctx);
3942 (void) ml->main_loop_run (ml, g);
3943 guestfs_set_reply_callback (g, NULL, NULL);
3944 if (ctx.cb_sequence != 1001) {
3945 error (g, "%s reply failed, see earlier error messages", "guestfs_mounts");
3946 guestfs_set_ready (g);
3950 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MOUNTS, serial) == -1) {
3951 guestfs_set_ready (g);
3955 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3956 error (g, "%s", ctx.err.error_message);
3957 guestfs_set_ready (g);
3961 guestfs_set_ready (g);
3962 /* caller will free this, but we need to add a NULL entry */
3963 ctx.ret.devices.devices_val =
3964 safe_realloc (g, ctx.ret.devices.devices_val,
3965 sizeof (char *) * (ctx.ret.devices.devices_len + 1));
3966 ctx.ret.devices.devices_val[ctx.ret.devices.devices_len] = NULL;
3967 return ctx.ret.devices.devices_val;
3970 struct umount_all_ctx {
3971 /* This flag is set by the callbacks, so we know we've done
3972 * the callbacks as expected, and in the right sequence.
3973 * 0 = not called, 1 = send called,
3974 * 1001 = reply called.
3977 struct guestfs_message_header hdr;
3978 struct guestfs_message_error err;
3981 static void umount_all_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3983 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3984 struct umount_all_ctx *ctx = (struct umount_all_ctx *) data;
3986 ml->main_loop_quit (ml, g);
3988 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3989 error (g, "%s: failed to parse reply header", "guestfs_umount_all");
3992 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3993 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3994 error (g, "%s: failed to parse reply error", "guestfs_umount_all");
4000 ctx->cb_sequence = 1001;
4003 int guestfs_umount_all (guestfs_h *g)
4005 struct umount_all_ctx ctx;
4006 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4009 if (check_state (g, "guestfs_umount_all") == -1) return -1;
4010 guestfs_set_busy (g);
4012 memset (&ctx, 0, sizeof ctx);
4014 serial = guestfs__send_sync (g, GUESTFS_PROC_UMOUNT_ALL, NULL, NULL);
4016 guestfs_set_ready (g);
4021 guestfs__switch_to_receiving (g);
4022 ctx.cb_sequence = 0;
4023 guestfs_set_reply_callback (g, umount_all_reply_cb, &ctx);
4024 (void) ml->main_loop_run (ml, g);
4025 guestfs_set_reply_callback (g, NULL, NULL);
4026 if (ctx.cb_sequence != 1001) {
4027 error (g, "%s reply failed, see earlier error messages", "guestfs_umount_all");
4028 guestfs_set_ready (g);
4032 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_UMOUNT_ALL, serial) == -1) {
4033 guestfs_set_ready (g);
4037 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4038 error (g, "%s", ctx.err.error_message);
4039 guestfs_set_ready (g);
4043 guestfs_set_ready (g);
4047 struct lvm_remove_all_ctx {
4048 /* This flag is set by the callbacks, so we know we've done
4049 * the callbacks as expected, and in the right sequence.
4050 * 0 = not called, 1 = send called,
4051 * 1001 = reply called.
4054 struct guestfs_message_header hdr;
4055 struct guestfs_message_error err;
4058 static void lvm_remove_all_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4060 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4061 struct lvm_remove_all_ctx *ctx = (struct lvm_remove_all_ctx *) data;
4063 ml->main_loop_quit (ml, g);
4065 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4066 error (g, "%s: failed to parse reply header", "guestfs_lvm_remove_all");
4069 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4070 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4071 error (g, "%s: failed to parse reply error", "guestfs_lvm_remove_all");
4077 ctx->cb_sequence = 1001;
4080 int guestfs_lvm_remove_all (guestfs_h *g)
4082 struct lvm_remove_all_ctx ctx;
4083 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4086 if (check_state (g, "guestfs_lvm_remove_all") == -1) return -1;
4087 guestfs_set_busy (g);
4089 memset (&ctx, 0, sizeof ctx);
4091 serial = guestfs__send_sync (g, GUESTFS_PROC_LVM_REMOVE_ALL, NULL, NULL);
4093 guestfs_set_ready (g);
4098 guestfs__switch_to_receiving (g);
4099 ctx.cb_sequence = 0;
4100 guestfs_set_reply_callback (g, lvm_remove_all_reply_cb, &ctx);
4101 (void) ml->main_loop_run (ml, g);
4102 guestfs_set_reply_callback (g, NULL, NULL);
4103 if (ctx.cb_sequence != 1001) {
4104 error (g, "%s reply failed, see earlier error messages", "guestfs_lvm_remove_all");
4105 guestfs_set_ready (g);
4109 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LVM_REMOVE_ALL, serial) == -1) {
4110 guestfs_set_ready (g);
4114 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4115 error (g, "%s", ctx.err.error_message);
4116 guestfs_set_ready (g);
4120 guestfs_set_ready (g);
4125 /* This flag is set by the callbacks, so we know we've done
4126 * the callbacks as expected, and in the right sequence.
4127 * 0 = not called, 1 = send called,
4128 * 1001 = reply called.
4131 struct guestfs_message_header hdr;
4132 struct guestfs_message_error err;
4133 struct guestfs_file_ret ret;
4136 static void file_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4138 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4139 struct file_ctx *ctx = (struct file_ctx *) data;
4141 ml->main_loop_quit (ml, g);
4143 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4144 error (g, "%s: failed to parse reply header", "guestfs_file");
4147 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4148 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4149 error (g, "%s: failed to parse reply error", "guestfs_file");
4154 if (!xdr_guestfs_file_ret (xdr, &ctx->ret)) {
4155 error (g, "%s: failed to parse reply", "guestfs_file");
4159 ctx->cb_sequence = 1001;
4162 char *guestfs_file (guestfs_h *g,
4165 struct guestfs_file_args args;
4166 struct file_ctx ctx;
4167 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4170 if (check_state (g, "guestfs_file") == -1) return NULL;
4171 guestfs_set_busy (g);
4173 memset (&ctx, 0, sizeof ctx);
4175 args.path = (char *) path;
4176 serial = guestfs__send_sync (g, GUESTFS_PROC_FILE,
4177 (xdrproc_t) xdr_guestfs_file_args, (char *) &args);
4179 guestfs_set_ready (g);
4184 guestfs__switch_to_receiving (g);
4185 ctx.cb_sequence = 0;
4186 guestfs_set_reply_callback (g, file_reply_cb, &ctx);
4187 (void) ml->main_loop_run (ml, g);
4188 guestfs_set_reply_callback (g, NULL, NULL);
4189 if (ctx.cb_sequence != 1001) {
4190 error (g, "%s reply failed, see earlier error messages", "guestfs_file");
4191 guestfs_set_ready (g);
4195 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_FILE, serial) == -1) {
4196 guestfs_set_ready (g);
4200 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4201 error (g, "%s", ctx.err.error_message);
4202 guestfs_set_ready (g);
4206 guestfs_set_ready (g);
4207 return ctx.ret.description; /* caller will free */
4210 struct command_ctx {
4211 /* This flag is set by the callbacks, so we know we've done
4212 * the callbacks as expected, and in the right sequence.
4213 * 0 = not called, 1 = send called,
4214 * 1001 = reply called.
4217 struct guestfs_message_header hdr;
4218 struct guestfs_message_error err;
4219 struct guestfs_command_ret ret;
4222 static void command_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4224 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4225 struct command_ctx *ctx = (struct command_ctx *) data;
4227 ml->main_loop_quit (ml, g);
4229 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4230 error (g, "%s: failed to parse reply header", "guestfs_command");
4233 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4234 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4235 error (g, "%s: failed to parse reply error", "guestfs_command");
4240 if (!xdr_guestfs_command_ret (xdr, &ctx->ret)) {
4241 error (g, "%s: failed to parse reply", "guestfs_command");
4245 ctx->cb_sequence = 1001;
4248 char *guestfs_command (guestfs_h *g,
4249 char * const* const arguments)
4251 struct guestfs_command_args args;
4252 struct command_ctx ctx;
4253 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4256 if (check_state (g, "guestfs_command") == -1) return NULL;
4257 guestfs_set_busy (g);
4259 memset (&ctx, 0, sizeof ctx);
4261 args.arguments.arguments_val = (char **) arguments;
4262 for (args.arguments.arguments_len = 0; arguments[args.arguments.arguments_len]; args.arguments.arguments_len++) ;
4263 serial = guestfs__send_sync (g, GUESTFS_PROC_COMMAND,
4264 (xdrproc_t) xdr_guestfs_command_args, (char *) &args);
4266 guestfs_set_ready (g);
4271 guestfs__switch_to_receiving (g);
4272 ctx.cb_sequence = 0;
4273 guestfs_set_reply_callback (g, command_reply_cb, &ctx);
4274 (void) ml->main_loop_run (ml, g);
4275 guestfs_set_reply_callback (g, NULL, NULL);
4276 if (ctx.cb_sequence != 1001) {
4277 error (g, "%s reply failed, see earlier error messages", "guestfs_command");
4278 guestfs_set_ready (g);
4282 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_COMMAND, serial) == -1) {
4283 guestfs_set_ready (g);
4287 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4288 error (g, "%s", ctx.err.error_message);
4289 guestfs_set_ready (g);
4293 guestfs_set_ready (g);
4294 return ctx.ret.output; /* caller will free */
4297 struct command_lines_ctx {
4298 /* This flag is set by the callbacks, so we know we've done
4299 * the callbacks as expected, and in the right sequence.
4300 * 0 = not called, 1 = send called,
4301 * 1001 = reply called.
4304 struct guestfs_message_header hdr;
4305 struct guestfs_message_error err;
4306 struct guestfs_command_lines_ret ret;
4309 static void command_lines_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4311 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4312 struct command_lines_ctx *ctx = (struct command_lines_ctx *) data;
4314 ml->main_loop_quit (ml, g);
4316 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4317 error (g, "%s: failed to parse reply header", "guestfs_command_lines");
4320 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4321 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4322 error (g, "%s: failed to parse reply error", "guestfs_command_lines");
4327 if (!xdr_guestfs_command_lines_ret (xdr, &ctx->ret)) {
4328 error (g, "%s: failed to parse reply", "guestfs_command_lines");
4332 ctx->cb_sequence = 1001;
4335 char **guestfs_command_lines (guestfs_h *g,
4336 char * const* const arguments)
4338 struct guestfs_command_lines_args args;
4339 struct command_lines_ctx ctx;
4340 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4343 if (check_state (g, "guestfs_command_lines") == -1) return NULL;
4344 guestfs_set_busy (g);
4346 memset (&ctx, 0, sizeof ctx);
4348 args.arguments.arguments_val = (char **) arguments;
4349 for (args.arguments.arguments_len = 0; arguments[args.arguments.arguments_len]; args.arguments.arguments_len++) ;
4350 serial = guestfs__send_sync (g, GUESTFS_PROC_COMMAND_LINES,
4351 (xdrproc_t) xdr_guestfs_command_lines_args, (char *) &args);
4353 guestfs_set_ready (g);
4358 guestfs__switch_to_receiving (g);
4359 ctx.cb_sequence = 0;
4360 guestfs_set_reply_callback (g, command_lines_reply_cb, &ctx);
4361 (void) ml->main_loop_run (ml, g);
4362 guestfs_set_reply_callback (g, NULL, NULL);
4363 if (ctx.cb_sequence != 1001) {
4364 error (g, "%s reply failed, see earlier error messages", "guestfs_command_lines");
4365 guestfs_set_ready (g);
4369 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_COMMAND_LINES, serial) == -1) {
4370 guestfs_set_ready (g);
4374 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4375 error (g, "%s", ctx.err.error_message);
4376 guestfs_set_ready (g);
4380 guestfs_set_ready (g);
4381 /* caller will free this, but we need to add a NULL entry */
4382 ctx.ret.lines.lines_val =
4383 safe_realloc (g, ctx.ret.lines.lines_val,
4384 sizeof (char *) * (ctx.ret.lines.lines_len + 1));
4385 ctx.ret.lines.lines_val[ctx.ret.lines.lines_len] = NULL;
4386 return ctx.ret.lines.lines_val;
4390 /* This flag is set by the callbacks, so we know we've done
4391 * the callbacks as expected, and in the right sequence.
4392 * 0 = not called, 1 = send called,
4393 * 1001 = reply called.
4396 struct guestfs_message_header hdr;
4397 struct guestfs_message_error err;
4398 struct guestfs_stat_ret ret;
4401 static void stat_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4403 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4404 struct stat_ctx *ctx = (struct stat_ctx *) data;
4406 ml->main_loop_quit (ml, g);
4408 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4409 error (g, "%s: failed to parse reply header", "guestfs_stat");
4412 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4413 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4414 error (g, "%s: failed to parse reply error", "guestfs_stat");
4419 if (!xdr_guestfs_stat_ret (xdr, &ctx->ret)) {
4420 error (g, "%s: failed to parse reply", "guestfs_stat");
4424 ctx->cb_sequence = 1001;
4427 struct guestfs_stat *guestfs_stat (guestfs_h *g,
4430 struct guestfs_stat_args args;
4431 struct stat_ctx ctx;
4432 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4435 if (check_state (g, "guestfs_stat") == -1) return NULL;
4436 guestfs_set_busy (g);
4438 memset (&ctx, 0, sizeof ctx);
4440 args.path = (char *) path;
4441 serial = guestfs__send_sync (g, GUESTFS_PROC_STAT,
4442 (xdrproc_t) xdr_guestfs_stat_args, (char *) &args);
4444 guestfs_set_ready (g);
4449 guestfs__switch_to_receiving (g);
4450 ctx.cb_sequence = 0;
4451 guestfs_set_reply_callback (g, stat_reply_cb, &ctx);
4452 (void) ml->main_loop_run (ml, g);
4453 guestfs_set_reply_callback (g, NULL, NULL);
4454 if (ctx.cb_sequence != 1001) {
4455 error (g, "%s reply failed, see earlier error messages", "guestfs_stat");
4456 guestfs_set_ready (g);
4460 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_STAT, serial) == -1) {
4461 guestfs_set_ready (g);
4465 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4466 error (g, "%s", ctx.err.error_message);
4467 guestfs_set_ready (g);
4471 guestfs_set_ready (g);
4472 /* caller will free this */
4473 return safe_memdup (g, &ctx.ret.statbuf, sizeof (ctx.ret.statbuf));
4477 /* This flag is set by the callbacks, so we know we've done
4478 * the callbacks as expected, and in the right sequence.
4479 * 0 = not called, 1 = send called,
4480 * 1001 = reply called.
4483 struct guestfs_message_header hdr;
4484 struct guestfs_message_error err;
4485 struct guestfs_lstat_ret ret;
4488 static void lstat_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4490 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4491 struct lstat_ctx *ctx = (struct lstat_ctx *) data;
4493 ml->main_loop_quit (ml, g);
4495 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4496 error (g, "%s: failed to parse reply header", "guestfs_lstat");
4499 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4500 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4501 error (g, "%s: failed to parse reply error", "guestfs_lstat");
4506 if (!xdr_guestfs_lstat_ret (xdr, &ctx->ret)) {
4507 error (g, "%s: failed to parse reply", "guestfs_lstat");
4511 ctx->cb_sequence = 1001;
4514 struct guestfs_stat *guestfs_lstat (guestfs_h *g,
4517 struct guestfs_lstat_args args;
4518 struct lstat_ctx ctx;
4519 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4522 if (check_state (g, "guestfs_lstat") == -1) return NULL;
4523 guestfs_set_busy (g);
4525 memset (&ctx, 0, sizeof ctx);
4527 args.path = (char *) path;
4528 serial = guestfs__send_sync (g, GUESTFS_PROC_LSTAT,
4529 (xdrproc_t) xdr_guestfs_lstat_args, (char *) &args);
4531 guestfs_set_ready (g);
4536 guestfs__switch_to_receiving (g);
4537 ctx.cb_sequence = 0;
4538 guestfs_set_reply_callback (g, lstat_reply_cb, &ctx);
4539 (void) ml->main_loop_run (ml, g);
4540 guestfs_set_reply_callback (g, NULL, NULL);
4541 if (ctx.cb_sequence != 1001) {
4542 error (g, "%s reply failed, see earlier error messages", "guestfs_lstat");
4543 guestfs_set_ready (g);
4547 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LSTAT, serial) == -1) {
4548 guestfs_set_ready (g);
4552 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4553 error (g, "%s", ctx.err.error_message);
4554 guestfs_set_ready (g);
4558 guestfs_set_ready (g);
4559 /* caller will free this */
4560 return safe_memdup (g, &ctx.ret.statbuf, sizeof (ctx.ret.statbuf));
4563 struct statvfs_ctx {
4564 /* This flag is set by the callbacks, so we know we've done
4565 * the callbacks as expected, and in the right sequence.
4566 * 0 = not called, 1 = send called,
4567 * 1001 = reply called.
4570 struct guestfs_message_header hdr;
4571 struct guestfs_message_error err;
4572 struct guestfs_statvfs_ret ret;
4575 static void statvfs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4577 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4578 struct statvfs_ctx *ctx = (struct statvfs_ctx *) data;
4580 ml->main_loop_quit (ml, g);
4582 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4583 error (g, "%s: failed to parse reply header", "guestfs_statvfs");
4586 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4587 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4588 error (g, "%s: failed to parse reply error", "guestfs_statvfs");
4593 if (!xdr_guestfs_statvfs_ret (xdr, &ctx->ret)) {
4594 error (g, "%s: failed to parse reply", "guestfs_statvfs");
4598 ctx->cb_sequence = 1001;
4601 struct guestfs_statvfs *guestfs_statvfs (guestfs_h *g,
4604 struct guestfs_statvfs_args args;
4605 struct statvfs_ctx ctx;
4606 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4609 if (check_state (g, "guestfs_statvfs") == -1) return NULL;
4610 guestfs_set_busy (g);
4612 memset (&ctx, 0, sizeof ctx);
4614 args.path = (char *) path;
4615 serial = guestfs__send_sync (g, GUESTFS_PROC_STATVFS,
4616 (xdrproc_t) xdr_guestfs_statvfs_args, (char *) &args);
4618 guestfs_set_ready (g);
4623 guestfs__switch_to_receiving (g);
4624 ctx.cb_sequence = 0;
4625 guestfs_set_reply_callback (g, statvfs_reply_cb, &ctx);
4626 (void) ml->main_loop_run (ml, g);
4627 guestfs_set_reply_callback (g, NULL, NULL);
4628 if (ctx.cb_sequence != 1001) {
4629 error (g, "%s reply failed, see earlier error messages", "guestfs_statvfs");
4630 guestfs_set_ready (g);
4634 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_STATVFS, serial) == -1) {
4635 guestfs_set_ready (g);
4639 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4640 error (g, "%s", ctx.err.error_message);
4641 guestfs_set_ready (g);
4645 guestfs_set_ready (g);
4646 /* caller will free this */
4647 return safe_memdup (g, &ctx.ret.statbuf, sizeof (ctx.ret.statbuf));
4650 struct tune2fs_l_ctx {
4651 /* This flag is set by the callbacks, so we know we've done
4652 * the callbacks as expected, and in the right sequence.
4653 * 0 = not called, 1 = send called,
4654 * 1001 = reply called.
4657 struct guestfs_message_header hdr;
4658 struct guestfs_message_error err;
4659 struct guestfs_tune2fs_l_ret ret;
4662 static void tune2fs_l_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4664 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4665 struct tune2fs_l_ctx *ctx = (struct tune2fs_l_ctx *) data;
4667 ml->main_loop_quit (ml, g);
4669 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4670 error (g, "%s: failed to parse reply header", "guestfs_tune2fs_l");
4673 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4674 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4675 error (g, "%s: failed to parse reply error", "guestfs_tune2fs_l");
4680 if (!xdr_guestfs_tune2fs_l_ret (xdr, &ctx->ret)) {
4681 error (g, "%s: failed to parse reply", "guestfs_tune2fs_l");
4685 ctx->cb_sequence = 1001;
4688 char **guestfs_tune2fs_l (guestfs_h *g,
4691 struct guestfs_tune2fs_l_args args;
4692 struct tune2fs_l_ctx ctx;
4693 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4696 if (check_state (g, "guestfs_tune2fs_l") == -1) return NULL;
4697 guestfs_set_busy (g);
4699 memset (&ctx, 0, sizeof ctx);
4701 args.device = (char *) device;
4702 serial = guestfs__send_sync (g, GUESTFS_PROC_TUNE2FS_L,
4703 (xdrproc_t) xdr_guestfs_tune2fs_l_args, (char *) &args);
4705 guestfs_set_ready (g);
4710 guestfs__switch_to_receiving (g);
4711 ctx.cb_sequence = 0;
4712 guestfs_set_reply_callback (g, tune2fs_l_reply_cb, &ctx);
4713 (void) ml->main_loop_run (ml, g);
4714 guestfs_set_reply_callback (g, NULL, NULL);
4715 if (ctx.cb_sequence != 1001) {
4716 error (g, "%s reply failed, see earlier error messages", "guestfs_tune2fs_l");
4717 guestfs_set_ready (g);
4721 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_TUNE2FS_L, serial) == -1) {
4722 guestfs_set_ready (g);
4726 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4727 error (g, "%s", ctx.err.error_message);
4728 guestfs_set_ready (g);
4732 guestfs_set_ready (g);
4733 /* caller will free this, but we need to add a NULL entry */
4734 ctx.ret.superblock.superblock_val =
4735 safe_realloc (g, ctx.ret.superblock.superblock_val,
4736 sizeof (char *) * (ctx.ret.superblock.superblock_len + 1));
4737 ctx.ret.superblock.superblock_val[ctx.ret.superblock.superblock_len] = NULL;
4738 return ctx.ret.superblock.superblock_val;
4741 struct blockdev_setro_ctx {
4742 /* This flag is set by the callbacks, so we know we've done
4743 * the callbacks as expected, and in the right sequence.
4744 * 0 = not called, 1 = send called,
4745 * 1001 = reply called.
4748 struct guestfs_message_header hdr;
4749 struct guestfs_message_error err;
4752 static void blockdev_setro_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4754 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4755 struct blockdev_setro_ctx *ctx = (struct blockdev_setro_ctx *) data;
4757 ml->main_loop_quit (ml, g);
4759 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4760 error (g, "%s: failed to parse reply header", "guestfs_blockdev_setro");
4763 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4764 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4765 error (g, "%s: failed to parse reply error", "guestfs_blockdev_setro");
4771 ctx->cb_sequence = 1001;
4774 int guestfs_blockdev_setro (guestfs_h *g,
4777 struct guestfs_blockdev_setro_args args;
4778 struct blockdev_setro_ctx ctx;
4779 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4782 if (check_state (g, "guestfs_blockdev_setro") == -1) return -1;
4783 guestfs_set_busy (g);
4785 memset (&ctx, 0, sizeof ctx);
4787 args.device = (char *) device;
4788 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_SETRO,
4789 (xdrproc_t) xdr_guestfs_blockdev_setro_args, (char *) &args);
4791 guestfs_set_ready (g);
4796 guestfs__switch_to_receiving (g);
4797 ctx.cb_sequence = 0;
4798 guestfs_set_reply_callback (g, blockdev_setro_reply_cb, &ctx);
4799 (void) ml->main_loop_run (ml, g);
4800 guestfs_set_reply_callback (g, NULL, NULL);
4801 if (ctx.cb_sequence != 1001) {
4802 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_setro");
4803 guestfs_set_ready (g);
4807 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_SETRO, serial) == -1) {
4808 guestfs_set_ready (g);
4812 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4813 error (g, "%s", ctx.err.error_message);
4814 guestfs_set_ready (g);
4818 guestfs_set_ready (g);
4822 struct blockdev_setrw_ctx {
4823 /* This flag is set by the callbacks, so we know we've done
4824 * the callbacks as expected, and in the right sequence.
4825 * 0 = not called, 1 = send called,
4826 * 1001 = reply called.
4829 struct guestfs_message_header hdr;
4830 struct guestfs_message_error err;
4833 static void blockdev_setrw_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4835 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4836 struct blockdev_setrw_ctx *ctx = (struct blockdev_setrw_ctx *) data;
4838 ml->main_loop_quit (ml, g);
4840 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4841 error (g, "%s: failed to parse reply header", "guestfs_blockdev_setrw");
4844 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4845 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4846 error (g, "%s: failed to parse reply error", "guestfs_blockdev_setrw");
4852 ctx->cb_sequence = 1001;
4855 int guestfs_blockdev_setrw (guestfs_h *g,
4858 struct guestfs_blockdev_setrw_args args;
4859 struct blockdev_setrw_ctx ctx;
4860 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4863 if (check_state (g, "guestfs_blockdev_setrw") == -1) return -1;
4864 guestfs_set_busy (g);
4866 memset (&ctx, 0, sizeof ctx);
4868 args.device = (char *) device;
4869 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_SETRW,
4870 (xdrproc_t) xdr_guestfs_blockdev_setrw_args, (char *) &args);
4872 guestfs_set_ready (g);
4877 guestfs__switch_to_receiving (g);
4878 ctx.cb_sequence = 0;
4879 guestfs_set_reply_callback (g, blockdev_setrw_reply_cb, &ctx);
4880 (void) ml->main_loop_run (ml, g);
4881 guestfs_set_reply_callback (g, NULL, NULL);
4882 if (ctx.cb_sequence != 1001) {
4883 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_setrw");
4884 guestfs_set_ready (g);
4888 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_SETRW, serial) == -1) {
4889 guestfs_set_ready (g);
4893 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4894 error (g, "%s", ctx.err.error_message);
4895 guestfs_set_ready (g);
4899 guestfs_set_ready (g);
4903 struct blockdev_getro_ctx {
4904 /* This flag is set by the callbacks, so we know we've done
4905 * the callbacks as expected, and in the right sequence.
4906 * 0 = not called, 1 = send called,
4907 * 1001 = reply called.
4910 struct guestfs_message_header hdr;
4911 struct guestfs_message_error err;
4912 struct guestfs_blockdev_getro_ret ret;
4915 static void blockdev_getro_reply_cb (guestfs_h *g, void *data, XDR *xdr)
4917 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4918 struct blockdev_getro_ctx *ctx = (struct blockdev_getro_ctx *) data;
4920 ml->main_loop_quit (ml, g);
4922 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
4923 error (g, "%s: failed to parse reply header", "guestfs_blockdev_getro");
4926 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
4927 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
4928 error (g, "%s: failed to parse reply error", "guestfs_blockdev_getro");
4933 if (!xdr_guestfs_blockdev_getro_ret (xdr, &ctx->ret)) {
4934 error (g, "%s: failed to parse reply", "guestfs_blockdev_getro");
4938 ctx->cb_sequence = 1001;
4941 int guestfs_blockdev_getro (guestfs_h *g,
4944 struct guestfs_blockdev_getro_args args;
4945 struct blockdev_getro_ctx ctx;
4946 guestfs_main_loop *ml = guestfs_get_main_loop (g);
4949 if (check_state (g, "guestfs_blockdev_getro") == -1) return -1;
4950 guestfs_set_busy (g);
4952 memset (&ctx, 0, sizeof ctx);
4954 args.device = (char *) device;
4955 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_GETRO,
4956 (xdrproc_t) xdr_guestfs_blockdev_getro_args, (char *) &args);
4958 guestfs_set_ready (g);
4963 guestfs__switch_to_receiving (g);
4964 ctx.cb_sequence = 0;
4965 guestfs_set_reply_callback (g, blockdev_getro_reply_cb, &ctx);
4966 (void) ml->main_loop_run (ml, g);
4967 guestfs_set_reply_callback (g, NULL, NULL);
4968 if (ctx.cb_sequence != 1001) {
4969 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getro");
4970 guestfs_set_ready (g);
4974 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_GETRO, serial) == -1) {
4975 guestfs_set_ready (g);
4979 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
4980 error (g, "%s", ctx.err.error_message);
4981 guestfs_set_ready (g);
4985 guestfs_set_ready (g);
4989 struct blockdev_getss_ctx {
4990 /* This flag is set by the callbacks, so we know we've done
4991 * the callbacks as expected, and in the right sequence.
4992 * 0 = not called, 1 = send called,
4993 * 1001 = reply called.
4996 struct guestfs_message_header hdr;
4997 struct guestfs_message_error err;
4998 struct guestfs_blockdev_getss_ret ret;
5001 static void blockdev_getss_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5003 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5004 struct blockdev_getss_ctx *ctx = (struct blockdev_getss_ctx *) data;
5006 ml->main_loop_quit (ml, g);
5008 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5009 error (g, "%s: failed to parse reply header", "guestfs_blockdev_getss");
5012 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5013 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5014 error (g, "%s: failed to parse reply error", "guestfs_blockdev_getss");
5019 if (!xdr_guestfs_blockdev_getss_ret (xdr, &ctx->ret)) {
5020 error (g, "%s: failed to parse reply", "guestfs_blockdev_getss");
5024 ctx->cb_sequence = 1001;
5027 int guestfs_blockdev_getss (guestfs_h *g,
5030 struct guestfs_blockdev_getss_args args;
5031 struct blockdev_getss_ctx ctx;
5032 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5035 if (check_state (g, "guestfs_blockdev_getss") == -1) return -1;
5036 guestfs_set_busy (g);
5038 memset (&ctx, 0, sizeof ctx);
5040 args.device = (char *) device;
5041 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_GETSS,
5042 (xdrproc_t) xdr_guestfs_blockdev_getss_args, (char *) &args);
5044 guestfs_set_ready (g);
5049 guestfs__switch_to_receiving (g);
5050 ctx.cb_sequence = 0;
5051 guestfs_set_reply_callback (g, blockdev_getss_reply_cb, &ctx);
5052 (void) ml->main_loop_run (ml, g);
5053 guestfs_set_reply_callback (g, NULL, NULL);
5054 if (ctx.cb_sequence != 1001) {
5055 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getss");
5056 guestfs_set_ready (g);
5060 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_GETSS, serial) == -1) {
5061 guestfs_set_ready (g);
5065 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5066 error (g, "%s", ctx.err.error_message);
5067 guestfs_set_ready (g);
5071 guestfs_set_ready (g);
5072 return ctx.ret.sectorsize;
5075 struct blockdev_getbsz_ctx {
5076 /* This flag is set by the callbacks, so we know we've done
5077 * the callbacks as expected, and in the right sequence.
5078 * 0 = not called, 1 = send called,
5079 * 1001 = reply called.
5082 struct guestfs_message_header hdr;
5083 struct guestfs_message_error err;
5084 struct guestfs_blockdev_getbsz_ret ret;
5087 static void blockdev_getbsz_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5089 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5090 struct blockdev_getbsz_ctx *ctx = (struct blockdev_getbsz_ctx *) data;
5092 ml->main_loop_quit (ml, g);
5094 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5095 error (g, "%s: failed to parse reply header", "guestfs_blockdev_getbsz");
5098 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5099 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5100 error (g, "%s: failed to parse reply error", "guestfs_blockdev_getbsz");
5105 if (!xdr_guestfs_blockdev_getbsz_ret (xdr, &ctx->ret)) {
5106 error (g, "%s: failed to parse reply", "guestfs_blockdev_getbsz");
5110 ctx->cb_sequence = 1001;
5113 int guestfs_blockdev_getbsz (guestfs_h *g,
5116 struct guestfs_blockdev_getbsz_args args;
5117 struct blockdev_getbsz_ctx ctx;
5118 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5121 if (check_state (g, "guestfs_blockdev_getbsz") == -1) return -1;
5122 guestfs_set_busy (g);
5124 memset (&ctx, 0, sizeof ctx);
5126 args.device = (char *) device;
5127 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_GETBSZ,
5128 (xdrproc_t) xdr_guestfs_blockdev_getbsz_args, (char *) &args);
5130 guestfs_set_ready (g);
5135 guestfs__switch_to_receiving (g);
5136 ctx.cb_sequence = 0;
5137 guestfs_set_reply_callback (g, blockdev_getbsz_reply_cb, &ctx);
5138 (void) ml->main_loop_run (ml, g);
5139 guestfs_set_reply_callback (g, NULL, NULL);
5140 if (ctx.cb_sequence != 1001) {
5141 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getbsz");
5142 guestfs_set_ready (g);
5146 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_GETBSZ, serial) == -1) {
5147 guestfs_set_ready (g);
5151 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5152 error (g, "%s", ctx.err.error_message);
5153 guestfs_set_ready (g);
5157 guestfs_set_ready (g);
5158 return ctx.ret.blocksize;
5161 struct blockdev_setbsz_ctx {
5162 /* This flag is set by the callbacks, so we know we've done
5163 * the callbacks as expected, and in the right sequence.
5164 * 0 = not called, 1 = send called,
5165 * 1001 = reply called.
5168 struct guestfs_message_header hdr;
5169 struct guestfs_message_error err;
5172 static void blockdev_setbsz_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5174 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5175 struct blockdev_setbsz_ctx *ctx = (struct blockdev_setbsz_ctx *) data;
5177 ml->main_loop_quit (ml, g);
5179 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5180 error (g, "%s: failed to parse reply header", "guestfs_blockdev_setbsz");
5183 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5184 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5185 error (g, "%s: failed to parse reply error", "guestfs_blockdev_setbsz");
5191 ctx->cb_sequence = 1001;
5194 int guestfs_blockdev_setbsz (guestfs_h *g,
5198 struct guestfs_blockdev_setbsz_args args;
5199 struct blockdev_setbsz_ctx ctx;
5200 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5203 if (check_state (g, "guestfs_blockdev_setbsz") == -1) return -1;
5204 guestfs_set_busy (g);
5206 memset (&ctx, 0, sizeof ctx);
5208 args.device = (char *) device;
5209 args.blocksize = blocksize;
5210 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_SETBSZ,
5211 (xdrproc_t) xdr_guestfs_blockdev_setbsz_args, (char *) &args);
5213 guestfs_set_ready (g);
5218 guestfs__switch_to_receiving (g);
5219 ctx.cb_sequence = 0;
5220 guestfs_set_reply_callback (g, blockdev_setbsz_reply_cb, &ctx);
5221 (void) ml->main_loop_run (ml, g);
5222 guestfs_set_reply_callback (g, NULL, NULL);
5223 if (ctx.cb_sequence != 1001) {
5224 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_setbsz");
5225 guestfs_set_ready (g);
5229 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_SETBSZ, serial) == -1) {
5230 guestfs_set_ready (g);
5234 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5235 error (g, "%s", ctx.err.error_message);
5236 guestfs_set_ready (g);
5240 guestfs_set_ready (g);
5244 struct blockdev_getsz_ctx {
5245 /* This flag is set by the callbacks, so we know we've done
5246 * the callbacks as expected, and in the right sequence.
5247 * 0 = not called, 1 = send called,
5248 * 1001 = reply called.
5251 struct guestfs_message_header hdr;
5252 struct guestfs_message_error err;
5253 struct guestfs_blockdev_getsz_ret ret;
5256 static void blockdev_getsz_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5258 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5259 struct blockdev_getsz_ctx *ctx = (struct blockdev_getsz_ctx *) data;
5261 ml->main_loop_quit (ml, g);
5263 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5264 error (g, "%s: failed to parse reply header", "guestfs_blockdev_getsz");
5267 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5268 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5269 error (g, "%s: failed to parse reply error", "guestfs_blockdev_getsz");
5274 if (!xdr_guestfs_blockdev_getsz_ret (xdr, &ctx->ret)) {
5275 error (g, "%s: failed to parse reply", "guestfs_blockdev_getsz");
5279 ctx->cb_sequence = 1001;
5282 int64_t guestfs_blockdev_getsz (guestfs_h *g,
5285 struct guestfs_blockdev_getsz_args args;
5286 struct blockdev_getsz_ctx ctx;
5287 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5290 if (check_state (g, "guestfs_blockdev_getsz") == -1) return -1;
5291 guestfs_set_busy (g);
5293 memset (&ctx, 0, sizeof ctx);
5295 args.device = (char *) device;
5296 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_GETSZ,
5297 (xdrproc_t) xdr_guestfs_blockdev_getsz_args, (char *) &args);
5299 guestfs_set_ready (g);
5304 guestfs__switch_to_receiving (g);
5305 ctx.cb_sequence = 0;
5306 guestfs_set_reply_callback (g, blockdev_getsz_reply_cb, &ctx);
5307 (void) ml->main_loop_run (ml, g);
5308 guestfs_set_reply_callback (g, NULL, NULL);
5309 if (ctx.cb_sequence != 1001) {
5310 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getsz");
5311 guestfs_set_ready (g);
5315 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_GETSZ, serial) == -1) {
5316 guestfs_set_ready (g);
5320 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5321 error (g, "%s", ctx.err.error_message);
5322 guestfs_set_ready (g);
5326 guestfs_set_ready (g);
5327 return ctx.ret.sizeinsectors;
5330 struct blockdev_getsize64_ctx {
5331 /* This flag is set by the callbacks, so we know we've done
5332 * the callbacks as expected, and in the right sequence.
5333 * 0 = not called, 1 = send called,
5334 * 1001 = reply called.
5337 struct guestfs_message_header hdr;
5338 struct guestfs_message_error err;
5339 struct guestfs_blockdev_getsize64_ret ret;
5342 static void blockdev_getsize64_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5344 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5345 struct blockdev_getsize64_ctx *ctx = (struct blockdev_getsize64_ctx *) data;
5347 ml->main_loop_quit (ml, g);
5349 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5350 error (g, "%s: failed to parse reply header", "guestfs_blockdev_getsize64");
5353 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5354 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5355 error (g, "%s: failed to parse reply error", "guestfs_blockdev_getsize64");
5360 if (!xdr_guestfs_blockdev_getsize64_ret (xdr, &ctx->ret)) {
5361 error (g, "%s: failed to parse reply", "guestfs_blockdev_getsize64");
5365 ctx->cb_sequence = 1001;
5368 int64_t guestfs_blockdev_getsize64 (guestfs_h *g,
5371 struct guestfs_blockdev_getsize64_args args;
5372 struct blockdev_getsize64_ctx ctx;
5373 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5376 if (check_state (g, "guestfs_blockdev_getsize64") == -1) return -1;
5377 guestfs_set_busy (g);
5379 memset (&ctx, 0, sizeof ctx);
5381 args.device = (char *) device;
5382 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_GETSIZE64,
5383 (xdrproc_t) xdr_guestfs_blockdev_getsize64_args, (char *) &args);
5385 guestfs_set_ready (g);
5390 guestfs__switch_to_receiving (g);
5391 ctx.cb_sequence = 0;
5392 guestfs_set_reply_callback (g, blockdev_getsize64_reply_cb, &ctx);
5393 (void) ml->main_loop_run (ml, g);
5394 guestfs_set_reply_callback (g, NULL, NULL);
5395 if (ctx.cb_sequence != 1001) {
5396 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_getsize64");
5397 guestfs_set_ready (g);
5401 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_GETSIZE64, serial) == -1) {
5402 guestfs_set_ready (g);
5406 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5407 error (g, "%s", ctx.err.error_message);
5408 guestfs_set_ready (g);
5412 guestfs_set_ready (g);
5413 return ctx.ret.sizeinbytes;
5416 struct blockdev_flushbufs_ctx {
5417 /* This flag is set by the callbacks, so we know we've done
5418 * the callbacks as expected, and in the right sequence.
5419 * 0 = not called, 1 = send called,
5420 * 1001 = reply called.
5423 struct guestfs_message_header hdr;
5424 struct guestfs_message_error err;
5427 static void blockdev_flushbufs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5429 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5430 struct blockdev_flushbufs_ctx *ctx = (struct blockdev_flushbufs_ctx *) data;
5432 ml->main_loop_quit (ml, g);
5434 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5435 error (g, "%s: failed to parse reply header", "guestfs_blockdev_flushbufs");
5438 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5439 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5440 error (g, "%s: failed to parse reply error", "guestfs_blockdev_flushbufs");
5446 ctx->cb_sequence = 1001;
5449 int guestfs_blockdev_flushbufs (guestfs_h *g,
5452 struct guestfs_blockdev_flushbufs_args args;
5453 struct blockdev_flushbufs_ctx ctx;
5454 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5457 if (check_state (g, "guestfs_blockdev_flushbufs") == -1) return -1;
5458 guestfs_set_busy (g);
5460 memset (&ctx, 0, sizeof ctx);
5462 args.device = (char *) device;
5463 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_FLUSHBUFS,
5464 (xdrproc_t) xdr_guestfs_blockdev_flushbufs_args, (char *) &args);
5466 guestfs_set_ready (g);
5471 guestfs__switch_to_receiving (g);
5472 ctx.cb_sequence = 0;
5473 guestfs_set_reply_callback (g, blockdev_flushbufs_reply_cb, &ctx);
5474 (void) ml->main_loop_run (ml, g);
5475 guestfs_set_reply_callback (g, NULL, NULL);
5476 if (ctx.cb_sequence != 1001) {
5477 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_flushbufs");
5478 guestfs_set_ready (g);
5482 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_FLUSHBUFS, serial) == -1) {
5483 guestfs_set_ready (g);
5487 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5488 error (g, "%s", ctx.err.error_message);
5489 guestfs_set_ready (g);
5493 guestfs_set_ready (g);
5497 struct blockdev_rereadpt_ctx {
5498 /* This flag is set by the callbacks, so we know we've done
5499 * the callbacks as expected, and in the right sequence.
5500 * 0 = not called, 1 = send called,
5501 * 1001 = reply called.
5504 struct guestfs_message_header hdr;
5505 struct guestfs_message_error err;
5508 static void blockdev_rereadpt_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5510 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5511 struct blockdev_rereadpt_ctx *ctx = (struct blockdev_rereadpt_ctx *) data;
5513 ml->main_loop_quit (ml, g);
5515 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5516 error (g, "%s: failed to parse reply header", "guestfs_blockdev_rereadpt");
5519 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5520 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5521 error (g, "%s: failed to parse reply error", "guestfs_blockdev_rereadpt");
5527 ctx->cb_sequence = 1001;
5530 int guestfs_blockdev_rereadpt (guestfs_h *g,
5533 struct guestfs_blockdev_rereadpt_args args;
5534 struct blockdev_rereadpt_ctx ctx;
5535 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5538 if (check_state (g, "guestfs_blockdev_rereadpt") == -1) return -1;
5539 guestfs_set_busy (g);
5541 memset (&ctx, 0, sizeof ctx);
5543 args.device = (char *) device;
5544 serial = guestfs__send_sync (g, GUESTFS_PROC_BLOCKDEV_REREADPT,
5545 (xdrproc_t) xdr_guestfs_blockdev_rereadpt_args, (char *) &args);
5547 guestfs_set_ready (g);
5552 guestfs__switch_to_receiving (g);
5553 ctx.cb_sequence = 0;
5554 guestfs_set_reply_callback (g, blockdev_rereadpt_reply_cb, &ctx);
5555 (void) ml->main_loop_run (ml, g);
5556 guestfs_set_reply_callback (g, NULL, NULL);
5557 if (ctx.cb_sequence != 1001) {
5558 error (g, "%s reply failed, see earlier error messages", "guestfs_blockdev_rereadpt");
5559 guestfs_set_ready (g);
5563 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_BLOCKDEV_REREADPT, serial) == -1) {
5564 guestfs_set_ready (g);
5568 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5569 error (g, "%s", ctx.err.error_message);
5570 guestfs_set_ready (g);
5574 guestfs_set_ready (g);
5579 /* This flag is set by the callbacks, so we know we've done
5580 * the callbacks as expected, and in the right sequence.
5581 * 0 = not called, 1 = send called,
5582 * 1001 = reply called.
5585 struct guestfs_message_header hdr;
5586 struct guestfs_message_error err;
5589 static void upload_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5591 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5592 struct upload_ctx *ctx = (struct upload_ctx *) data;
5594 ml->main_loop_quit (ml, g);
5596 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5597 error (g, "%s: failed to parse reply header", "guestfs_upload");
5600 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5601 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5602 error (g, "%s: failed to parse reply error", "guestfs_upload");
5608 ctx->cb_sequence = 1001;
5611 int guestfs_upload (guestfs_h *g,
5612 const char *filename,
5613 const char *remotefilename)
5615 struct guestfs_upload_args args;
5616 struct upload_ctx ctx;
5617 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5620 if (check_state (g, "guestfs_upload") == -1) return -1;
5621 guestfs_set_busy (g);
5623 memset (&ctx, 0, sizeof ctx);
5625 args.remotefilename = (char *) remotefilename;
5626 serial = guestfs__send_sync (g, GUESTFS_PROC_UPLOAD,
5627 (xdrproc_t) xdr_guestfs_upload_args, (char *) &args);
5629 guestfs_set_ready (g);
5636 r = guestfs__send_file_sync (g, filename);
5638 guestfs_set_ready (g);
5641 if (r == -2) /* daemon cancelled */
5646 guestfs__switch_to_receiving (g);
5647 ctx.cb_sequence = 0;
5648 guestfs_set_reply_callback (g, upload_reply_cb, &ctx);
5649 (void) ml->main_loop_run (ml, g);
5650 guestfs_set_reply_callback (g, NULL, NULL);
5651 if (ctx.cb_sequence != 1001) {
5652 error (g, "%s reply failed, see earlier error messages", "guestfs_upload");
5653 guestfs_set_ready (g);
5657 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_UPLOAD, serial) == -1) {
5658 guestfs_set_ready (g);
5662 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5663 error (g, "%s", ctx.err.error_message);
5664 guestfs_set_ready (g);
5668 guestfs_set_ready (g);
5672 struct download_ctx {
5673 /* This flag is set by the callbacks, so we know we've done
5674 * the callbacks as expected, and in the right sequence.
5675 * 0 = not called, 1 = send called,
5676 * 1001 = reply called.
5679 struct guestfs_message_header hdr;
5680 struct guestfs_message_error err;
5683 static void download_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5685 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5686 struct download_ctx *ctx = (struct download_ctx *) data;
5688 ml->main_loop_quit (ml, g);
5690 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5691 error (g, "%s: failed to parse reply header", "guestfs_download");
5694 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5695 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5696 error (g, "%s: failed to parse reply error", "guestfs_download");
5702 ctx->cb_sequence = 1001;
5705 int guestfs_download (guestfs_h *g,
5706 const char *remotefilename,
5707 const char *filename)
5709 struct guestfs_download_args args;
5710 struct download_ctx ctx;
5711 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5714 if (check_state (g, "guestfs_download") == -1) return -1;
5715 guestfs_set_busy (g);
5717 memset (&ctx, 0, sizeof ctx);
5719 args.remotefilename = (char *) remotefilename;
5720 serial = guestfs__send_sync (g, GUESTFS_PROC_DOWNLOAD,
5721 (xdrproc_t) xdr_guestfs_download_args, (char *) &args);
5723 guestfs_set_ready (g);
5728 guestfs__switch_to_receiving (g);
5729 ctx.cb_sequence = 0;
5730 guestfs_set_reply_callback (g, download_reply_cb, &ctx);
5731 (void) ml->main_loop_run (ml, g);
5732 guestfs_set_reply_callback (g, NULL, NULL);
5733 if (ctx.cb_sequence != 1001) {
5734 error (g, "%s reply failed, see earlier error messages", "guestfs_download");
5735 guestfs_set_ready (g);
5739 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_DOWNLOAD, serial) == -1) {
5740 guestfs_set_ready (g);
5744 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5745 error (g, "%s", ctx.err.error_message);
5746 guestfs_set_ready (g);
5750 if (guestfs__receive_file_sync (g, filename) == -1) {
5751 guestfs_set_ready (g);
5755 guestfs_set_ready (g);
5759 struct checksum_ctx {
5760 /* This flag is set by the callbacks, so we know we've done
5761 * the callbacks as expected, and in the right sequence.
5762 * 0 = not called, 1 = send called,
5763 * 1001 = reply called.
5766 struct guestfs_message_header hdr;
5767 struct guestfs_message_error err;
5768 struct guestfs_checksum_ret ret;
5771 static void checksum_reply_cb (guestfs_h *g, void *data, XDR *xdr)
5773 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5774 struct checksum_ctx *ctx = (struct checksum_ctx *) data;
5776 ml->main_loop_quit (ml, g);
5778 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
5779 error (g, "%s: failed to parse reply header", "guestfs_checksum");
5782 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
5783 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
5784 error (g, "%s: failed to parse reply error", "guestfs_checksum");
5789 if (!xdr_guestfs_checksum_ret (xdr, &ctx->ret)) {
5790 error (g, "%s: failed to parse reply", "guestfs_checksum");
5794 ctx->cb_sequence = 1001;
5797 char *guestfs_checksum (guestfs_h *g,
5798 const char *csumtype,
5801 struct guestfs_checksum_args args;
5802 struct checksum_ctx ctx;
5803 guestfs_main_loop *ml = guestfs_get_main_loop (g);
5806 if (check_state (g, "guestfs_checksum") == -1) return NULL;
5807 guestfs_set_busy (g);
5809 memset (&ctx, 0, sizeof ctx);
5811 args.csumtype = (char *) csumtype;
5812 args.path = (char *) path;
5813 serial = guestfs__send_sync (g, GUESTFS_PROC_CHECKSUM,
5814 (xdrproc_t) xdr_guestfs_checksum_args, (char *) &args);
5816 guestfs_set_ready (g);
5821 guestfs__switch_to_receiving (g);
5822 ctx.cb_sequence = 0;
5823 guestfs_set_reply_callback (g, checksum_reply_cb, &ctx);
5824 (void) ml->main_loop_run (ml, g);
5825 guestfs_set_reply_callback (g, NULL, NULL);
5826 if (ctx.cb_sequence != 1001) {
5827 error (g, "%s reply failed, see earlier error messages", "guestfs_checksum");
5828 guestfs_set_ready (g);
5832 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_CHECKSUM, serial) == -1) {
5833 guestfs_set_ready (g);
5837 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
5838 error (g, "%s", ctx.err.error_message);
5839 guestfs_set_ready (g);
5843 guestfs_set_ready (g);
5844 return ctx.ret.checksum; /* caller will free */