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 = reply_cb called.
92 struct guestfs_message_header hdr;
93 struct guestfs_message_error err;
96 static void mount_reply_cb (guestfs_h *g, void *data, XDR *xdr)
98 guestfs_main_loop *ml = guestfs_get_main_loop (g);
99 struct mount_ctx *ctx = (struct mount_ctx *) data;
101 /* This should definitely not happen. */
102 if (ctx->cb_sequence != 0) {
103 ctx->cb_sequence = 9999;
104 error (g, "%s: internal error: reply callback called twice", "guestfs_mount");
108 ml->main_loop_quit (ml, g);
110 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
111 error (g, "%s: failed to parse reply header", "guestfs_mount");
114 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
115 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
116 error (g, "%s: failed to parse reply error", "guestfs_mount");
122 ctx->cb_sequence = 1;
125 int guestfs_mount (guestfs_h *g,
127 const char *mountpoint)
129 struct guestfs_mount_args args;
130 struct mount_ctx ctx;
131 guestfs_main_loop *ml = guestfs_get_main_loop (g);
134 if (check_state (g, "guestfs_mount") == -1) return -1;
135 guestfs_set_busy (g);
137 memset (&ctx, 0, sizeof ctx);
139 args.device = (char *) device;
140 args.mountpoint = (char *) mountpoint;
141 serial = guestfs__send_sync (g, GUESTFS_PROC_MOUNT,
142 (xdrproc_t) xdr_guestfs_mount_args, (char *) &args);
144 guestfs_end_busy (g);
148 guestfs__switch_to_receiving (g);
150 guestfs_set_reply_callback (g, mount_reply_cb, &ctx);
151 (void) ml->main_loop_run (ml, g);
152 guestfs_set_reply_callback (g, NULL, NULL);
153 if (ctx.cb_sequence != 1) {
154 error (g, "%s reply failed, see earlier error messages", "guestfs_mount");
155 guestfs_end_busy (g);
159 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MOUNT, serial) == -1) {
160 guestfs_end_busy (g);
164 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
165 error (g, "%s", ctx.err.error_message);
166 free (ctx.err.error_message);
167 guestfs_end_busy (g);
171 guestfs_end_busy (g);
176 /* This flag is set by the callbacks, so we know we've done
177 * the callbacks as expected, and in the right sequence.
178 * 0 = not called, 1 = reply_cb called.
181 struct guestfs_message_header hdr;
182 struct guestfs_message_error err;
185 static void sync_reply_cb (guestfs_h *g, void *data, XDR *xdr)
187 guestfs_main_loop *ml = guestfs_get_main_loop (g);
188 struct sync_ctx *ctx = (struct sync_ctx *) data;
190 /* This should definitely not happen. */
191 if (ctx->cb_sequence != 0) {
192 ctx->cb_sequence = 9999;
193 error (g, "%s: internal error: reply callback called twice", "guestfs_sync");
197 ml->main_loop_quit (ml, g);
199 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
200 error (g, "%s: failed to parse reply header", "guestfs_sync");
203 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
204 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
205 error (g, "%s: failed to parse reply error", "guestfs_sync");
211 ctx->cb_sequence = 1;
214 int guestfs_sync (guestfs_h *g)
217 guestfs_main_loop *ml = guestfs_get_main_loop (g);
220 if (check_state (g, "guestfs_sync") == -1) return -1;
221 guestfs_set_busy (g);
223 memset (&ctx, 0, sizeof ctx);
225 serial = guestfs__send_sync (g, GUESTFS_PROC_SYNC, NULL, NULL);
227 guestfs_end_busy (g);
231 guestfs__switch_to_receiving (g);
233 guestfs_set_reply_callback (g, sync_reply_cb, &ctx);
234 (void) ml->main_loop_run (ml, g);
235 guestfs_set_reply_callback (g, NULL, NULL);
236 if (ctx.cb_sequence != 1) {
237 error (g, "%s reply failed, see earlier error messages", "guestfs_sync");
238 guestfs_end_busy (g);
242 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_SYNC, serial) == -1) {
243 guestfs_end_busy (g);
247 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
248 error (g, "%s", ctx.err.error_message);
249 free (ctx.err.error_message);
250 guestfs_end_busy (g);
254 guestfs_end_busy (g);
259 /* This flag is set by the callbacks, so we know we've done
260 * the callbacks as expected, and in the right sequence.
261 * 0 = not called, 1 = reply_cb called.
264 struct guestfs_message_header hdr;
265 struct guestfs_message_error err;
268 static void touch_reply_cb (guestfs_h *g, void *data, XDR *xdr)
270 guestfs_main_loop *ml = guestfs_get_main_loop (g);
271 struct touch_ctx *ctx = (struct touch_ctx *) data;
273 /* This should definitely not happen. */
274 if (ctx->cb_sequence != 0) {
275 ctx->cb_sequence = 9999;
276 error (g, "%s: internal error: reply callback called twice", "guestfs_touch");
280 ml->main_loop_quit (ml, g);
282 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
283 error (g, "%s: failed to parse reply header", "guestfs_touch");
286 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
287 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
288 error (g, "%s: failed to parse reply error", "guestfs_touch");
294 ctx->cb_sequence = 1;
297 int guestfs_touch (guestfs_h *g,
300 struct guestfs_touch_args args;
301 struct touch_ctx ctx;
302 guestfs_main_loop *ml = guestfs_get_main_loop (g);
305 if (check_state (g, "guestfs_touch") == -1) return -1;
306 guestfs_set_busy (g);
308 memset (&ctx, 0, sizeof ctx);
310 args.path = (char *) path;
311 serial = guestfs__send_sync (g, GUESTFS_PROC_TOUCH,
312 (xdrproc_t) xdr_guestfs_touch_args, (char *) &args);
314 guestfs_end_busy (g);
318 guestfs__switch_to_receiving (g);
320 guestfs_set_reply_callback (g, touch_reply_cb, &ctx);
321 (void) ml->main_loop_run (ml, g);
322 guestfs_set_reply_callback (g, NULL, NULL);
323 if (ctx.cb_sequence != 1) {
324 error (g, "%s reply failed, see earlier error messages", "guestfs_touch");
325 guestfs_end_busy (g);
329 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_TOUCH, serial) == -1) {
330 guestfs_end_busy (g);
334 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
335 error (g, "%s", ctx.err.error_message);
336 free (ctx.err.error_message);
337 guestfs_end_busy (g);
341 guestfs_end_busy (g);
346 /* This flag is set by the callbacks, so we know we've done
347 * the callbacks as expected, and in the right sequence.
348 * 0 = not called, 1 = reply_cb called.
351 struct guestfs_message_header hdr;
352 struct guestfs_message_error err;
353 struct guestfs_cat_ret ret;
356 static void cat_reply_cb (guestfs_h *g, void *data, XDR *xdr)
358 guestfs_main_loop *ml = guestfs_get_main_loop (g);
359 struct cat_ctx *ctx = (struct cat_ctx *) data;
361 /* This should definitely not happen. */
362 if (ctx->cb_sequence != 0) {
363 ctx->cb_sequence = 9999;
364 error (g, "%s: internal error: reply callback called twice", "guestfs_cat");
368 ml->main_loop_quit (ml, g);
370 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
371 error (g, "%s: failed to parse reply header", "guestfs_cat");
374 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
375 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
376 error (g, "%s: failed to parse reply error", "guestfs_cat");
381 if (!xdr_guestfs_cat_ret (xdr, &ctx->ret)) {
382 error (g, "%s: failed to parse reply", "guestfs_cat");
386 ctx->cb_sequence = 1;
389 char *guestfs_cat (guestfs_h *g,
392 struct guestfs_cat_args args;
394 guestfs_main_loop *ml = guestfs_get_main_loop (g);
397 if (check_state (g, "guestfs_cat") == -1) return NULL;
398 guestfs_set_busy (g);
400 memset (&ctx, 0, sizeof ctx);
402 args.path = (char *) path;
403 serial = guestfs__send_sync (g, GUESTFS_PROC_CAT,
404 (xdrproc_t) xdr_guestfs_cat_args, (char *) &args);
406 guestfs_end_busy (g);
410 guestfs__switch_to_receiving (g);
412 guestfs_set_reply_callback (g, cat_reply_cb, &ctx);
413 (void) ml->main_loop_run (ml, g);
414 guestfs_set_reply_callback (g, NULL, NULL);
415 if (ctx.cb_sequence != 1) {
416 error (g, "%s reply failed, see earlier error messages", "guestfs_cat");
417 guestfs_end_busy (g);
421 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_CAT, serial) == -1) {
422 guestfs_end_busy (g);
426 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
427 error (g, "%s", ctx.err.error_message);
428 free (ctx.err.error_message);
429 guestfs_end_busy (g);
433 guestfs_end_busy (g);
434 return ctx.ret.content; /* caller will free */
438 /* This flag is set by the callbacks, so we know we've done
439 * the callbacks as expected, and in the right sequence.
440 * 0 = not called, 1 = reply_cb called.
443 struct guestfs_message_header hdr;
444 struct guestfs_message_error err;
445 struct guestfs_ll_ret ret;
448 static void ll_reply_cb (guestfs_h *g, void *data, XDR *xdr)
450 guestfs_main_loop *ml = guestfs_get_main_loop (g);
451 struct ll_ctx *ctx = (struct ll_ctx *) data;
453 /* This should definitely not happen. */
454 if (ctx->cb_sequence != 0) {
455 ctx->cb_sequence = 9999;
456 error (g, "%s: internal error: reply callback called twice", "guestfs_ll");
460 ml->main_loop_quit (ml, g);
462 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
463 error (g, "%s: failed to parse reply header", "guestfs_ll");
466 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
467 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
468 error (g, "%s: failed to parse reply error", "guestfs_ll");
473 if (!xdr_guestfs_ll_ret (xdr, &ctx->ret)) {
474 error (g, "%s: failed to parse reply", "guestfs_ll");
478 ctx->cb_sequence = 1;
481 char *guestfs_ll (guestfs_h *g,
482 const char *directory)
484 struct guestfs_ll_args args;
486 guestfs_main_loop *ml = guestfs_get_main_loop (g);
489 if (check_state (g, "guestfs_ll") == -1) return NULL;
490 guestfs_set_busy (g);
492 memset (&ctx, 0, sizeof ctx);
494 args.directory = (char *) directory;
495 serial = guestfs__send_sync (g, GUESTFS_PROC_LL,
496 (xdrproc_t) xdr_guestfs_ll_args, (char *) &args);
498 guestfs_end_busy (g);
502 guestfs__switch_to_receiving (g);
504 guestfs_set_reply_callback (g, ll_reply_cb, &ctx);
505 (void) ml->main_loop_run (ml, g);
506 guestfs_set_reply_callback (g, NULL, NULL);
507 if (ctx.cb_sequence != 1) {
508 error (g, "%s reply failed, see earlier error messages", "guestfs_ll");
509 guestfs_end_busy (g);
513 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LL, serial) == -1) {
514 guestfs_end_busy (g);
518 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
519 error (g, "%s", ctx.err.error_message);
520 free (ctx.err.error_message);
521 guestfs_end_busy (g);
525 guestfs_end_busy (g);
526 return ctx.ret.listing; /* caller will free */
530 /* This flag is set by the callbacks, so we know we've done
531 * the callbacks as expected, and in the right sequence.
532 * 0 = not called, 1 = reply_cb called.
535 struct guestfs_message_header hdr;
536 struct guestfs_message_error err;
537 struct guestfs_ls_ret ret;
540 static void ls_reply_cb (guestfs_h *g, void *data, XDR *xdr)
542 guestfs_main_loop *ml = guestfs_get_main_loop (g);
543 struct ls_ctx *ctx = (struct ls_ctx *) data;
545 /* This should definitely not happen. */
546 if (ctx->cb_sequence != 0) {
547 ctx->cb_sequence = 9999;
548 error (g, "%s: internal error: reply callback called twice", "guestfs_ls");
552 ml->main_loop_quit (ml, g);
554 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
555 error (g, "%s: failed to parse reply header", "guestfs_ls");
558 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
559 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
560 error (g, "%s: failed to parse reply error", "guestfs_ls");
565 if (!xdr_guestfs_ls_ret (xdr, &ctx->ret)) {
566 error (g, "%s: failed to parse reply", "guestfs_ls");
570 ctx->cb_sequence = 1;
573 char **guestfs_ls (guestfs_h *g,
574 const char *directory)
576 struct guestfs_ls_args args;
578 guestfs_main_loop *ml = guestfs_get_main_loop (g);
581 if (check_state (g, "guestfs_ls") == -1) return NULL;
582 guestfs_set_busy (g);
584 memset (&ctx, 0, sizeof ctx);
586 args.directory = (char *) directory;
587 serial = guestfs__send_sync (g, GUESTFS_PROC_LS,
588 (xdrproc_t) xdr_guestfs_ls_args, (char *) &args);
590 guestfs_end_busy (g);
594 guestfs__switch_to_receiving (g);
596 guestfs_set_reply_callback (g, ls_reply_cb, &ctx);
597 (void) ml->main_loop_run (ml, g);
598 guestfs_set_reply_callback (g, NULL, NULL);
599 if (ctx.cb_sequence != 1) {
600 error (g, "%s reply failed, see earlier error messages", "guestfs_ls");
601 guestfs_end_busy (g);
605 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LS, serial) == -1) {
606 guestfs_end_busy (g);
610 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
611 error (g, "%s", ctx.err.error_message);
612 free (ctx.err.error_message);
613 guestfs_end_busy (g);
617 guestfs_end_busy (g);
618 /* caller will free this, but we need to add a NULL entry */
619 ctx.ret.listing.listing_val =
620 safe_realloc (g, ctx.ret.listing.listing_val,
621 sizeof (char *) * (ctx.ret.listing.listing_len + 1));
622 ctx.ret.listing.listing_val[ctx.ret.listing.listing_len] = NULL;
623 return ctx.ret.listing.listing_val;
626 struct list_devices_ctx {
627 /* This flag is set by the callbacks, so we know we've done
628 * the callbacks as expected, and in the right sequence.
629 * 0 = not called, 1 = reply_cb called.
632 struct guestfs_message_header hdr;
633 struct guestfs_message_error err;
634 struct guestfs_list_devices_ret ret;
637 static void list_devices_reply_cb (guestfs_h *g, void *data, XDR *xdr)
639 guestfs_main_loop *ml = guestfs_get_main_loop (g);
640 struct list_devices_ctx *ctx = (struct list_devices_ctx *) data;
642 /* This should definitely not happen. */
643 if (ctx->cb_sequence != 0) {
644 ctx->cb_sequence = 9999;
645 error (g, "%s: internal error: reply callback called twice", "guestfs_list_devices");
649 ml->main_loop_quit (ml, g);
651 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
652 error (g, "%s: failed to parse reply header", "guestfs_list_devices");
655 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
656 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
657 error (g, "%s: failed to parse reply error", "guestfs_list_devices");
662 if (!xdr_guestfs_list_devices_ret (xdr, &ctx->ret)) {
663 error (g, "%s: failed to parse reply", "guestfs_list_devices");
667 ctx->cb_sequence = 1;
670 char **guestfs_list_devices (guestfs_h *g)
672 struct list_devices_ctx ctx;
673 guestfs_main_loop *ml = guestfs_get_main_loop (g);
676 if (check_state (g, "guestfs_list_devices") == -1) return NULL;
677 guestfs_set_busy (g);
679 memset (&ctx, 0, sizeof ctx);
681 serial = guestfs__send_sync (g, GUESTFS_PROC_LIST_DEVICES, NULL, NULL);
683 guestfs_end_busy (g);
687 guestfs__switch_to_receiving (g);
689 guestfs_set_reply_callback (g, list_devices_reply_cb, &ctx);
690 (void) ml->main_loop_run (ml, g);
691 guestfs_set_reply_callback (g, NULL, NULL);
692 if (ctx.cb_sequence != 1) {
693 error (g, "%s reply failed, see earlier error messages", "guestfs_list_devices");
694 guestfs_end_busy (g);
698 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LIST_DEVICES, serial) == -1) {
699 guestfs_end_busy (g);
703 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
704 error (g, "%s", ctx.err.error_message);
705 free (ctx.err.error_message);
706 guestfs_end_busy (g);
710 guestfs_end_busy (g);
711 /* caller will free this, but we need to add a NULL entry */
712 ctx.ret.devices.devices_val =
713 safe_realloc (g, ctx.ret.devices.devices_val,
714 sizeof (char *) * (ctx.ret.devices.devices_len + 1));
715 ctx.ret.devices.devices_val[ctx.ret.devices.devices_len] = NULL;
716 return ctx.ret.devices.devices_val;
719 struct list_partitions_ctx {
720 /* This flag is set by the callbacks, so we know we've done
721 * the callbacks as expected, and in the right sequence.
722 * 0 = not called, 1 = reply_cb called.
725 struct guestfs_message_header hdr;
726 struct guestfs_message_error err;
727 struct guestfs_list_partitions_ret ret;
730 static void list_partitions_reply_cb (guestfs_h *g, void *data, XDR *xdr)
732 guestfs_main_loop *ml = guestfs_get_main_loop (g);
733 struct list_partitions_ctx *ctx = (struct list_partitions_ctx *) data;
735 /* This should definitely not happen. */
736 if (ctx->cb_sequence != 0) {
737 ctx->cb_sequence = 9999;
738 error (g, "%s: internal error: reply callback called twice", "guestfs_list_partitions");
742 ml->main_loop_quit (ml, g);
744 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
745 error (g, "%s: failed to parse reply header", "guestfs_list_partitions");
748 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
749 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
750 error (g, "%s: failed to parse reply error", "guestfs_list_partitions");
755 if (!xdr_guestfs_list_partitions_ret (xdr, &ctx->ret)) {
756 error (g, "%s: failed to parse reply", "guestfs_list_partitions");
760 ctx->cb_sequence = 1;
763 char **guestfs_list_partitions (guestfs_h *g)
765 struct list_partitions_ctx ctx;
766 guestfs_main_loop *ml = guestfs_get_main_loop (g);
769 if (check_state (g, "guestfs_list_partitions") == -1) return NULL;
770 guestfs_set_busy (g);
772 memset (&ctx, 0, sizeof ctx);
774 serial = guestfs__send_sync (g, GUESTFS_PROC_LIST_PARTITIONS, NULL, NULL);
776 guestfs_end_busy (g);
780 guestfs__switch_to_receiving (g);
782 guestfs_set_reply_callback (g, list_partitions_reply_cb, &ctx);
783 (void) ml->main_loop_run (ml, g);
784 guestfs_set_reply_callback (g, NULL, NULL);
785 if (ctx.cb_sequence != 1) {
786 error (g, "%s reply failed, see earlier error messages", "guestfs_list_partitions");
787 guestfs_end_busy (g);
791 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LIST_PARTITIONS, serial) == -1) {
792 guestfs_end_busy (g);
796 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
797 error (g, "%s", ctx.err.error_message);
798 free (ctx.err.error_message);
799 guestfs_end_busy (g);
803 guestfs_end_busy (g);
804 /* caller will free this, but we need to add a NULL entry */
805 ctx.ret.partitions.partitions_val =
806 safe_realloc (g, ctx.ret.partitions.partitions_val,
807 sizeof (char *) * (ctx.ret.partitions.partitions_len + 1));
808 ctx.ret.partitions.partitions_val[ctx.ret.partitions.partitions_len] = NULL;
809 return ctx.ret.partitions.partitions_val;
813 /* This flag is set by the callbacks, so we know we've done
814 * the callbacks as expected, and in the right sequence.
815 * 0 = not called, 1 = reply_cb called.
818 struct guestfs_message_header hdr;
819 struct guestfs_message_error err;
820 struct guestfs_pvs_ret ret;
823 static void pvs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
825 guestfs_main_loop *ml = guestfs_get_main_loop (g);
826 struct pvs_ctx *ctx = (struct pvs_ctx *) data;
828 /* This should definitely not happen. */
829 if (ctx->cb_sequence != 0) {
830 ctx->cb_sequence = 9999;
831 error (g, "%s: internal error: reply callback called twice", "guestfs_pvs");
835 ml->main_loop_quit (ml, g);
837 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
838 error (g, "%s: failed to parse reply header", "guestfs_pvs");
841 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
842 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
843 error (g, "%s: failed to parse reply error", "guestfs_pvs");
848 if (!xdr_guestfs_pvs_ret (xdr, &ctx->ret)) {
849 error (g, "%s: failed to parse reply", "guestfs_pvs");
853 ctx->cb_sequence = 1;
856 char **guestfs_pvs (guestfs_h *g)
859 guestfs_main_loop *ml = guestfs_get_main_loop (g);
862 if (check_state (g, "guestfs_pvs") == -1) return NULL;
863 guestfs_set_busy (g);
865 memset (&ctx, 0, sizeof ctx);
867 serial = guestfs__send_sync (g, GUESTFS_PROC_PVS, NULL, NULL);
869 guestfs_end_busy (g);
873 guestfs__switch_to_receiving (g);
875 guestfs_set_reply_callback (g, pvs_reply_cb, &ctx);
876 (void) ml->main_loop_run (ml, g);
877 guestfs_set_reply_callback (g, NULL, NULL);
878 if (ctx.cb_sequence != 1) {
879 error (g, "%s reply failed, see earlier error messages", "guestfs_pvs");
880 guestfs_end_busy (g);
884 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_PVS, serial) == -1) {
885 guestfs_end_busy (g);
889 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
890 error (g, "%s", ctx.err.error_message);
891 free (ctx.err.error_message);
892 guestfs_end_busy (g);
896 guestfs_end_busy (g);
897 /* caller will free this, but we need to add a NULL entry */
898 ctx.ret.physvols.physvols_val =
899 safe_realloc (g, ctx.ret.physvols.physvols_val,
900 sizeof (char *) * (ctx.ret.physvols.physvols_len + 1));
901 ctx.ret.physvols.physvols_val[ctx.ret.physvols.physvols_len] = NULL;
902 return ctx.ret.physvols.physvols_val;
906 /* This flag is set by the callbacks, so we know we've done
907 * the callbacks as expected, and in the right sequence.
908 * 0 = not called, 1 = reply_cb called.
911 struct guestfs_message_header hdr;
912 struct guestfs_message_error err;
913 struct guestfs_vgs_ret ret;
916 static void vgs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
918 guestfs_main_loop *ml = guestfs_get_main_loop (g);
919 struct vgs_ctx *ctx = (struct vgs_ctx *) data;
921 /* This should definitely not happen. */
922 if (ctx->cb_sequence != 0) {
923 ctx->cb_sequence = 9999;
924 error (g, "%s: internal error: reply callback called twice", "guestfs_vgs");
928 ml->main_loop_quit (ml, g);
930 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
931 error (g, "%s: failed to parse reply header", "guestfs_vgs");
934 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
935 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
936 error (g, "%s: failed to parse reply error", "guestfs_vgs");
941 if (!xdr_guestfs_vgs_ret (xdr, &ctx->ret)) {
942 error (g, "%s: failed to parse reply", "guestfs_vgs");
946 ctx->cb_sequence = 1;
949 char **guestfs_vgs (guestfs_h *g)
952 guestfs_main_loop *ml = guestfs_get_main_loop (g);
955 if (check_state (g, "guestfs_vgs") == -1) return NULL;
956 guestfs_set_busy (g);
958 memset (&ctx, 0, sizeof ctx);
960 serial = guestfs__send_sync (g, GUESTFS_PROC_VGS, NULL, NULL);
962 guestfs_end_busy (g);
966 guestfs__switch_to_receiving (g);
968 guestfs_set_reply_callback (g, vgs_reply_cb, &ctx);
969 (void) ml->main_loop_run (ml, g);
970 guestfs_set_reply_callback (g, NULL, NULL);
971 if (ctx.cb_sequence != 1) {
972 error (g, "%s reply failed, see earlier error messages", "guestfs_vgs");
973 guestfs_end_busy (g);
977 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_VGS, serial) == -1) {
978 guestfs_end_busy (g);
982 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
983 error (g, "%s", ctx.err.error_message);
984 free (ctx.err.error_message);
985 guestfs_end_busy (g);
989 guestfs_end_busy (g);
990 /* caller will free this, but we need to add a NULL entry */
991 ctx.ret.volgroups.volgroups_val =
992 safe_realloc (g, ctx.ret.volgroups.volgroups_val,
993 sizeof (char *) * (ctx.ret.volgroups.volgroups_len + 1));
994 ctx.ret.volgroups.volgroups_val[ctx.ret.volgroups.volgroups_len] = NULL;
995 return ctx.ret.volgroups.volgroups_val;
999 /* This flag is set by the callbacks, so we know we've done
1000 * the callbacks as expected, and in the right sequence.
1001 * 0 = not called, 1 = reply_cb called.
1004 struct guestfs_message_header hdr;
1005 struct guestfs_message_error err;
1006 struct guestfs_lvs_ret ret;
1009 static void lvs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1011 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1012 struct lvs_ctx *ctx = (struct lvs_ctx *) data;
1014 /* This should definitely not happen. */
1015 if (ctx->cb_sequence != 0) {
1016 ctx->cb_sequence = 9999;
1017 error (g, "%s: internal error: reply callback called twice", "guestfs_lvs");
1021 ml->main_loop_quit (ml, g);
1023 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1024 error (g, "%s: failed to parse reply header", "guestfs_lvs");
1027 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1028 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1029 error (g, "%s: failed to parse reply error", "guestfs_lvs");
1034 if (!xdr_guestfs_lvs_ret (xdr, &ctx->ret)) {
1035 error (g, "%s: failed to parse reply", "guestfs_lvs");
1039 ctx->cb_sequence = 1;
1042 char **guestfs_lvs (guestfs_h *g)
1045 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1048 if (check_state (g, "guestfs_lvs") == -1) return NULL;
1049 guestfs_set_busy (g);
1051 memset (&ctx, 0, sizeof ctx);
1053 serial = guestfs__send_sync (g, GUESTFS_PROC_LVS, NULL, NULL);
1055 guestfs_end_busy (g);
1059 guestfs__switch_to_receiving (g);
1060 ctx.cb_sequence = 0;
1061 guestfs_set_reply_callback (g, lvs_reply_cb, &ctx);
1062 (void) ml->main_loop_run (ml, g);
1063 guestfs_set_reply_callback (g, NULL, NULL);
1064 if (ctx.cb_sequence != 1) {
1065 error (g, "%s reply failed, see earlier error messages", "guestfs_lvs");
1066 guestfs_end_busy (g);
1070 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LVS, serial) == -1) {
1071 guestfs_end_busy (g);
1075 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1076 error (g, "%s", ctx.err.error_message);
1077 free (ctx.err.error_message);
1078 guestfs_end_busy (g);
1082 guestfs_end_busy (g);
1083 /* caller will free this, but we need to add a NULL entry */
1084 ctx.ret.logvols.logvols_val =
1085 safe_realloc (g, ctx.ret.logvols.logvols_val,
1086 sizeof (char *) * (ctx.ret.logvols.logvols_len + 1));
1087 ctx.ret.logvols.logvols_val[ctx.ret.logvols.logvols_len] = NULL;
1088 return ctx.ret.logvols.logvols_val;
1091 struct pvs_full_ctx {
1092 /* This flag is set by the callbacks, so we know we've done
1093 * the callbacks as expected, and in the right sequence.
1094 * 0 = not called, 1 = reply_cb called.
1097 struct guestfs_message_header hdr;
1098 struct guestfs_message_error err;
1099 struct guestfs_pvs_full_ret ret;
1102 static void pvs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1104 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1105 struct pvs_full_ctx *ctx = (struct pvs_full_ctx *) data;
1107 /* This should definitely not happen. */
1108 if (ctx->cb_sequence != 0) {
1109 ctx->cb_sequence = 9999;
1110 error (g, "%s: internal error: reply callback called twice", "guestfs_pvs_full");
1114 ml->main_loop_quit (ml, g);
1116 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1117 error (g, "%s: failed to parse reply header", "guestfs_pvs_full");
1120 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1121 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1122 error (g, "%s: failed to parse reply error", "guestfs_pvs_full");
1127 if (!xdr_guestfs_pvs_full_ret (xdr, &ctx->ret)) {
1128 error (g, "%s: failed to parse reply", "guestfs_pvs_full");
1132 ctx->cb_sequence = 1;
1135 struct guestfs_lvm_pv_list *guestfs_pvs_full (guestfs_h *g)
1137 struct pvs_full_ctx ctx;
1138 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1141 if (check_state (g, "guestfs_pvs_full") == -1) return NULL;
1142 guestfs_set_busy (g);
1144 memset (&ctx, 0, sizeof ctx);
1146 serial = guestfs__send_sync (g, GUESTFS_PROC_PVS_FULL, NULL, NULL);
1148 guestfs_end_busy (g);
1152 guestfs__switch_to_receiving (g);
1153 ctx.cb_sequence = 0;
1154 guestfs_set_reply_callback (g, pvs_full_reply_cb, &ctx);
1155 (void) ml->main_loop_run (ml, g);
1156 guestfs_set_reply_callback (g, NULL, NULL);
1157 if (ctx.cb_sequence != 1) {
1158 error (g, "%s reply failed, see earlier error messages", "guestfs_pvs_full");
1159 guestfs_end_busy (g);
1163 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_PVS_FULL, serial) == -1) {
1164 guestfs_end_busy (g);
1168 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1169 error (g, "%s", ctx.err.error_message);
1170 free (ctx.err.error_message);
1171 guestfs_end_busy (g);
1175 guestfs_end_busy (g);
1176 /* caller will free this */
1177 return safe_memdup (g, &ctx.ret.physvols, sizeof (ctx.ret.physvols));
1180 struct vgs_full_ctx {
1181 /* This flag is set by the callbacks, so we know we've done
1182 * the callbacks as expected, and in the right sequence.
1183 * 0 = not called, 1 = reply_cb called.
1186 struct guestfs_message_header hdr;
1187 struct guestfs_message_error err;
1188 struct guestfs_vgs_full_ret ret;
1191 static void vgs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1193 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1194 struct vgs_full_ctx *ctx = (struct vgs_full_ctx *) data;
1196 /* This should definitely not happen. */
1197 if (ctx->cb_sequence != 0) {
1198 ctx->cb_sequence = 9999;
1199 error (g, "%s: internal error: reply callback called twice", "guestfs_vgs_full");
1203 ml->main_loop_quit (ml, g);
1205 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1206 error (g, "%s: failed to parse reply header", "guestfs_vgs_full");
1209 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1210 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1211 error (g, "%s: failed to parse reply error", "guestfs_vgs_full");
1216 if (!xdr_guestfs_vgs_full_ret (xdr, &ctx->ret)) {
1217 error (g, "%s: failed to parse reply", "guestfs_vgs_full");
1221 ctx->cb_sequence = 1;
1224 struct guestfs_lvm_vg_list *guestfs_vgs_full (guestfs_h *g)
1226 struct vgs_full_ctx ctx;
1227 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1230 if (check_state (g, "guestfs_vgs_full") == -1) return NULL;
1231 guestfs_set_busy (g);
1233 memset (&ctx, 0, sizeof ctx);
1235 serial = guestfs__send_sync (g, GUESTFS_PROC_VGS_FULL, NULL, NULL);
1237 guestfs_end_busy (g);
1241 guestfs__switch_to_receiving (g);
1242 ctx.cb_sequence = 0;
1243 guestfs_set_reply_callback (g, vgs_full_reply_cb, &ctx);
1244 (void) ml->main_loop_run (ml, g);
1245 guestfs_set_reply_callback (g, NULL, NULL);
1246 if (ctx.cb_sequence != 1) {
1247 error (g, "%s reply failed, see earlier error messages", "guestfs_vgs_full");
1248 guestfs_end_busy (g);
1252 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_VGS_FULL, serial) == -1) {
1253 guestfs_end_busy (g);
1257 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1258 error (g, "%s", ctx.err.error_message);
1259 free (ctx.err.error_message);
1260 guestfs_end_busy (g);
1264 guestfs_end_busy (g);
1265 /* caller will free this */
1266 return safe_memdup (g, &ctx.ret.volgroups, sizeof (ctx.ret.volgroups));
1269 struct lvs_full_ctx {
1270 /* This flag is set by the callbacks, so we know we've done
1271 * the callbacks as expected, and in the right sequence.
1272 * 0 = not called, 1 = reply_cb called.
1275 struct guestfs_message_header hdr;
1276 struct guestfs_message_error err;
1277 struct guestfs_lvs_full_ret ret;
1280 static void lvs_full_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1282 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1283 struct lvs_full_ctx *ctx = (struct lvs_full_ctx *) data;
1285 /* This should definitely not happen. */
1286 if (ctx->cb_sequence != 0) {
1287 ctx->cb_sequence = 9999;
1288 error (g, "%s: internal error: reply callback called twice", "guestfs_lvs_full");
1292 ml->main_loop_quit (ml, g);
1294 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1295 error (g, "%s: failed to parse reply header", "guestfs_lvs_full");
1298 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1299 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1300 error (g, "%s: failed to parse reply error", "guestfs_lvs_full");
1305 if (!xdr_guestfs_lvs_full_ret (xdr, &ctx->ret)) {
1306 error (g, "%s: failed to parse reply", "guestfs_lvs_full");
1310 ctx->cb_sequence = 1;
1313 struct guestfs_lvm_lv_list *guestfs_lvs_full (guestfs_h *g)
1315 struct lvs_full_ctx ctx;
1316 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1319 if (check_state (g, "guestfs_lvs_full") == -1) return NULL;
1320 guestfs_set_busy (g);
1322 memset (&ctx, 0, sizeof ctx);
1324 serial = guestfs__send_sync (g, GUESTFS_PROC_LVS_FULL, NULL, NULL);
1326 guestfs_end_busy (g);
1330 guestfs__switch_to_receiving (g);
1331 ctx.cb_sequence = 0;
1332 guestfs_set_reply_callback (g, lvs_full_reply_cb, &ctx);
1333 (void) ml->main_loop_run (ml, g);
1334 guestfs_set_reply_callback (g, NULL, NULL);
1335 if (ctx.cb_sequence != 1) {
1336 error (g, "%s reply failed, see earlier error messages", "guestfs_lvs_full");
1337 guestfs_end_busy (g);
1341 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LVS_FULL, serial) == -1) {
1342 guestfs_end_busy (g);
1346 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1347 error (g, "%s", ctx.err.error_message);
1348 free (ctx.err.error_message);
1349 guestfs_end_busy (g);
1353 guestfs_end_busy (g);
1354 /* caller will free this */
1355 return safe_memdup (g, &ctx.ret.logvols, sizeof (ctx.ret.logvols));
1358 struct read_lines_ctx {
1359 /* This flag is set by the callbacks, so we know we've done
1360 * the callbacks as expected, and in the right sequence.
1361 * 0 = not called, 1 = reply_cb called.
1364 struct guestfs_message_header hdr;
1365 struct guestfs_message_error err;
1366 struct guestfs_read_lines_ret ret;
1369 static void read_lines_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1371 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1372 struct read_lines_ctx *ctx = (struct read_lines_ctx *) data;
1374 /* This should definitely not happen. */
1375 if (ctx->cb_sequence != 0) {
1376 ctx->cb_sequence = 9999;
1377 error (g, "%s: internal error: reply callback called twice", "guestfs_read_lines");
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_read_lines");
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_read_lines");
1394 if (!xdr_guestfs_read_lines_ret (xdr, &ctx->ret)) {
1395 error (g, "%s: failed to parse reply", "guestfs_read_lines");
1399 ctx->cb_sequence = 1;
1402 char **guestfs_read_lines (guestfs_h *g,
1405 struct guestfs_read_lines_args args;
1406 struct read_lines_ctx ctx;
1407 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1410 if (check_state (g, "guestfs_read_lines") == -1) return NULL;
1411 guestfs_set_busy (g);
1413 memset (&ctx, 0, sizeof ctx);
1415 args.path = (char *) path;
1416 serial = guestfs__send_sync (g, GUESTFS_PROC_READ_LINES,
1417 (xdrproc_t) xdr_guestfs_read_lines_args, (char *) &args);
1419 guestfs_end_busy (g);
1423 guestfs__switch_to_receiving (g);
1424 ctx.cb_sequence = 0;
1425 guestfs_set_reply_callback (g, read_lines_reply_cb, &ctx);
1426 (void) ml->main_loop_run (ml, g);
1427 guestfs_set_reply_callback (g, NULL, NULL);
1428 if (ctx.cb_sequence != 1) {
1429 error (g, "%s reply failed, see earlier error messages", "guestfs_read_lines");
1430 guestfs_end_busy (g);
1434 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_READ_LINES, serial) == -1) {
1435 guestfs_end_busy (g);
1439 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1440 error (g, "%s", ctx.err.error_message);
1441 free (ctx.err.error_message);
1442 guestfs_end_busy (g);
1446 guestfs_end_busy (g);
1447 /* caller will free this, but we need to add a NULL entry */
1448 ctx.ret.lines.lines_val =
1449 safe_realloc (g, ctx.ret.lines.lines_val,
1450 sizeof (char *) * (ctx.ret.lines.lines_len + 1));
1451 ctx.ret.lines.lines_val[ctx.ret.lines.lines_len] = NULL;
1452 return ctx.ret.lines.lines_val;
1455 struct aug_init_ctx {
1456 /* This flag is set by the callbacks, so we know we've done
1457 * the callbacks as expected, and in the right sequence.
1458 * 0 = not called, 1 = reply_cb called.
1461 struct guestfs_message_header hdr;
1462 struct guestfs_message_error err;
1465 static void aug_init_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1467 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1468 struct aug_init_ctx *ctx = (struct aug_init_ctx *) data;
1470 /* This should definitely not happen. */
1471 if (ctx->cb_sequence != 0) {
1472 ctx->cb_sequence = 9999;
1473 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_init");
1477 ml->main_loop_quit (ml, g);
1479 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1480 error (g, "%s: failed to parse reply header", "guestfs_aug_init");
1483 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1484 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1485 error (g, "%s: failed to parse reply error", "guestfs_aug_init");
1491 ctx->cb_sequence = 1;
1494 int guestfs_aug_init (guestfs_h *g,
1498 struct guestfs_aug_init_args args;
1499 struct aug_init_ctx ctx;
1500 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1503 if (check_state (g, "guestfs_aug_init") == -1) return -1;
1504 guestfs_set_busy (g);
1506 memset (&ctx, 0, sizeof ctx);
1508 args.root = (char *) root;
1510 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_INIT,
1511 (xdrproc_t) xdr_guestfs_aug_init_args, (char *) &args);
1513 guestfs_end_busy (g);
1517 guestfs__switch_to_receiving (g);
1518 ctx.cb_sequence = 0;
1519 guestfs_set_reply_callback (g, aug_init_reply_cb, &ctx);
1520 (void) ml->main_loop_run (ml, g);
1521 guestfs_set_reply_callback (g, NULL, NULL);
1522 if (ctx.cb_sequence != 1) {
1523 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_init");
1524 guestfs_end_busy (g);
1528 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_INIT, serial) == -1) {
1529 guestfs_end_busy (g);
1533 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1534 error (g, "%s", ctx.err.error_message);
1535 free (ctx.err.error_message);
1536 guestfs_end_busy (g);
1540 guestfs_end_busy (g);
1544 struct aug_close_ctx {
1545 /* This flag is set by the callbacks, so we know we've done
1546 * the callbacks as expected, and in the right sequence.
1547 * 0 = not called, 1 = reply_cb called.
1550 struct guestfs_message_header hdr;
1551 struct guestfs_message_error err;
1554 static void aug_close_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1556 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1557 struct aug_close_ctx *ctx = (struct aug_close_ctx *) data;
1559 /* This should definitely not happen. */
1560 if (ctx->cb_sequence != 0) {
1561 ctx->cb_sequence = 9999;
1562 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_close");
1566 ml->main_loop_quit (ml, g);
1568 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1569 error (g, "%s: failed to parse reply header", "guestfs_aug_close");
1572 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1573 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1574 error (g, "%s: failed to parse reply error", "guestfs_aug_close");
1580 ctx->cb_sequence = 1;
1583 int guestfs_aug_close (guestfs_h *g)
1585 struct aug_close_ctx ctx;
1586 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1589 if (check_state (g, "guestfs_aug_close") == -1) return -1;
1590 guestfs_set_busy (g);
1592 memset (&ctx, 0, sizeof ctx);
1594 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_CLOSE, NULL, NULL);
1596 guestfs_end_busy (g);
1600 guestfs__switch_to_receiving (g);
1601 ctx.cb_sequence = 0;
1602 guestfs_set_reply_callback (g, aug_close_reply_cb, &ctx);
1603 (void) ml->main_loop_run (ml, g);
1604 guestfs_set_reply_callback (g, NULL, NULL);
1605 if (ctx.cb_sequence != 1) {
1606 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_close");
1607 guestfs_end_busy (g);
1611 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_CLOSE, serial) == -1) {
1612 guestfs_end_busy (g);
1616 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1617 error (g, "%s", ctx.err.error_message);
1618 free (ctx.err.error_message);
1619 guestfs_end_busy (g);
1623 guestfs_end_busy (g);
1627 struct aug_defvar_ctx {
1628 /* This flag is set by the callbacks, so we know we've done
1629 * the callbacks as expected, and in the right sequence.
1630 * 0 = not called, 1 = reply_cb called.
1633 struct guestfs_message_header hdr;
1634 struct guestfs_message_error err;
1635 struct guestfs_aug_defvar_ret ret;
1638 static void aug_defvar_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1640 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1641 struct aug_defvar_ctx *ctx = (struct aug_defvar_ctx *) data;
1643 /* This should definitely not happen. */
1644 if (ctx->cb_sequence != 0) {
1645 ctx->cb_sequence = 9999;
1646 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_defvar");
1650 ml->main_loop_quit (ml, g);
1652 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1653 error (g, "%s: failed to parse reply header", "guestfs_aug_defvar");
1656 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1657 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1658 error (g, "%s: failed to parse reply error", "guestfs_aug_defvar");
1663 if (!xdr_guestfs_aug_defvar_ret (xdr, &ctx->ret)) {
1664 error (g, "%s: failed to parse reply", "guestfs_aug_defvar");
1668 ctx->cb_sequence = 1;
1671 int guestfs_aug_defvar (guestfs_h *g,
1675 struct guestfs_aug_defvar_args args;
1676 struct aug_defvar_ctx ctx;
1677 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1680 if (check_state (g, "guestfs_aug_defvar") == -1) return -1;
1681 guestfs_set_busy (g);
1683 memset (&ctx, 0, sizeof ctx);
1685 args.name = (char *) name;
1686 args.expr = expr ? (char **) &expr : NULL;
1687 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_DEFVAR,
1688 (xdrproc_t) xdr_guestfs_aug_defvar_args, (char *) &args);
1690 guestfs_end_busy (g);
1694 guestfs__switch_to_receiving (g);
1695 ctx.cb_sequence = 0;
1696 guestfs_set_reply_callback (g, aug_defvar_reply_cb, &ctx);
1697 (void) ml->main_loop_run (ml, g);
1698 guestfs_set_reply_callback (g, NULL, NULL);
1699 if (ctx.cb_sequence != 1) {
1700 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_defvar");
1701 guestfs_end_busy (g);
1705 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_DEFVAR, serial) == -1) {
1706 guestfs_end_busy (g);
1710 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1711 error (g, "%s", ctx.err.error_message);
1712 free (ctx.err.error_message);
1713 guestfs_end_busy (g);
1717 guestfs_end_busy (g);
1718 return ctx.ret.nrnodes;
1721 struct aug_defnode_ctx {
1722 /* This flag is set by the callbacks, so we know we've done
1723 * the callbacks as expected, and in the right sequence.
1724 * 0 = not called, 1 = reply_cb called.
1727 struct guestfs_message_header hdr;
1728 struct guestfs_message_error err;
1729 struct guestfs_aug_defnode_ret ret;
1732 static void aug_defnode_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1734 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1735 struct aug_defnode_ctx *ctx = (struct aug_defnode_ctx *) data;
1737 /* This should definitely not happen. */
1738 if (ctx->cb_sequence != 0) {
1739 ctx->cb_sequence = 9999;
1740 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_defnode");
1744 ml->main_loop_quit (ml, g);
1746 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1747 error (g, "%s: failed to parse reply header", "guestfs_aug_defnode");
1750 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1751 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1752 error (g, "%s: failed to parse reply error", "guestfs_aug_defnode");
1757 if (!xdr_guestfs_aug_defnode_ret (xdr, &ctx->ret)) {
1758 error (g, "%s: failed to parse reply", "guestfs_aug_defnode");
1762 ctx->cb_sequence = 1;
1765 struct guestfs_int_bool *guestfs_aug_defnode (guestfs_h *g,
1770 struct guestfs_aug_defnode_args args;
1771 struct aug_defnode_ctx ctx;
1772 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1775 if (check_state (g, "guestfs_aug_defnode") == -1) return NULL;
1776 guestfs_set_busy (g);
1778 memset (&ctx, 0, sizeof ctx);
1780 args.name = (char *) name;
1781 args.expr = (char *) expr;
1782 args.val = (char *) val;
1783 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_DEFNODE,
1784 (xdrproc_t) xdr_guestfs_aug_defnode_args, (char *) &args);
1786 guestfs_end_busy (g);
1790 guestfs__switch_to_receiving (g);
1791 ctx.cb_sequence = 0;
1792 guestfs_set_reply_callback (g, aug_defnode_reply_cb, &ctx);
1793 (void) ml->main_loop_run (ml, g);
1794 guestfs_set_reply_callback (g, NULL, NULL);
1795 if (ctx.cb_sequence != 1) {
1796 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_defnode");
1797 guestfs_end_busy (g);
1801 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_DEFNODE, serial) == -1) {
1802 guestfs_end_busy (g);
1806 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1807 error (g, "%s", ctx.err.error_message);
1808 free (ctx.err.error_message);
1809 guestfs_end_busy (g);
1813 guestfs_end_busy (g);
1814 /* caller with free this */
1815 return safe_memdup (g, &ctx.ret, sizeof (ctx.ret));
1818 struct aug_get_ctx {
1819 /* This flag is set by the callbacks, so we know we've done
1820 * the callbacks as expected, and in the right sequence.
1821 * 0 = not called, 1 = reply_cb called.
1824 struct guestfs_message_header hdr;
1825 struct guestfs_message_error err;
1826 struct guestfs_aug_get_ret ret;
1829 static void aug_get_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1831 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1832 struct aug_get_ctx *ctx = (struct aug_get_ctx *) data;
1834 /* This should definitely not happen. */
1835 if (ctx->cb_sequence != 0) {
1836 ctx->cb_sequence = 9999;
1837 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_get");
1841 ml->main_loop_quit (ml, g);
1843 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1844 error (g, "%s: failed to parse reply header", "guestfs_aug_get");
1847 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1848 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1849 error (g, "%s: failed to parse reply error", "guestfs_aug_get");
1854 if (!xdr_guestfs_aug_get_ret (xdr, &ctx->ret)) {
1855 error (g, "%s: failed to parse reply", "guestfs_aug_get");
1859 ctx->cb_sequence = 1;
1862 char *guestfs_aug_get (guestfs_h *g,
1865 struct guestfs_aug_get_args args;
1866 struct aug_get_ctx ctx;
1867 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1870 if (check_state (g, "guestfs_aug_get") == -1) return NULL;
1871 guestfs_set_busy (g);
1873 memset (&ctx, 0, sizeof ctx);
1875 args.path = (char *) path;
1876 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_GET,
1877 (xdrproc_t) xdr_guestfs_aug_get_args, (char *) &args);
1879 guestfs_end_busy (g);
1883 guestfs__switch_to_receiving (g);
1884 ctx.cb_sequence = 0;
1885 guestfs_set_reply_callback (g, aug_get_reply_cb, &ctx);
1886 (void) ml->main_loop_run (ml, g);
1887 guestfs_set_reply_callback (g, NULL, NULL);
1888 if (ctx.cb_sequence != 1) {
1889 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_get");
1890 guestfs_end_busy (g);
1894 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_GET, serial) == -1) {
1895 guestfs_end_busy (g);
1899 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1900 error (g, "%s", ctx.err.error_message);
1901 free (ctx.err.error_message);
1902 guestfs_end_busy (g);
1906 guestfs_end_busy (g);
1907 return ctx.ret.val; /* caller will free */
1910 struct aug_set_ctx {
1911 /* This flag is set by the callbacks, so we know we've done
1912 * the callbacks as expected, and in the right sequence.
1913 * 0 = not called, 1 = reply_cb called.
1916 struct guestfs_message_header hdr;
1917 struct guestfs_message_error err;
1920 static void aug_set_reply_cb (guestfs_h *g, void *data, XDR *xdr)
1922 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1923 struct aug_set_ctx *ctx = (struct aug_set_ctx *) data;
1925 /* This should definitely not happen. */
1926 if (ctx->cb_sequence != 0) {
1927 ctx->cb_sequence = 9999;
1928 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_set");
1932 ml->main_loop_quit (ml, g);
1934 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
1935 error (g, "%s: failed to parse reply header", "guestfs_aug_set");
1938 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
1939 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
1940 error (g, "%s: failed to parse reply error", "guestfs_aug_set");
1946 ctx->cb_sequence = 1;
1949 int guestfs_aug_set (guestfs_h *g,
1953 struct guestfs_aug_set_args args;
1954 struct aug_set_ctx ctx;
1955 guestfs_main_loop *ml = guestfs_get_main_loop (g);
1958 if (check_state (g, "guestfs_aug_set") == -1) return -1;
1959 guestfs_set_busy (g);
1961 memset (&ctx, 0, sizeof ctx);
1963 args.path = (char *) path;
1964 args.val = (char *) val;
1965 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_SET,
1966 (xdrproc_t) xdr_guestfs_aug_set_args, (char *) &args);
1968 guestfs_end_busy (g);
1972 guestfs__switch_to_receiving (g);
1973 ctx.cb_sequence = 0;
1974 guestfs_set_reply_callback (g, aug_set_reply_cb, &ctx);
1975 (void) ml->main_loop_run (ml, g);
1976 guestfs_set_reply_callback (g, NULL, NULL);
1977 if (ctx.cb_sequence != 1) {
1978 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_set");
1979 guestfs_end_busy (g);
1983 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_SET, serial) == -1) {
1984 guestfs_end_busy (g);
1988 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
1989 error (g, "%s", ctx.err.error_message);
1990 free (ctx.err.error_message);
1991 guestfs_end_busy (g);
1995 guestfs_end_busy (g);
1999 struct aug_insert_ctx {
2000 /* This flag is set by the callbacks, so we know we've done
2001 * the callbacks as expected, and in the right sequence.
2002 * 0 = not called, 1 = reply_cb called.
2005 struct guestfs_message_header hdr;
2006 struct guestfs_message_error err;
2009 static void aug_insert_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2011 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2012 struct aug_insert_ctx *ctx = (struct aug_insert_ctx *) data;
2014 /* This should definitely not happen. */
2015 if (ctx->cb_sequence != 0) {
2016 ctx->cb_sequence = 9999;
2017 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_insert");
2021 ml->main_loop_quit (ml, g);
2023 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2024 error (g, "%s: failed to parse reply header", "guestfs_aug_insert");
2027 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2028 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2029 error (g, "%s: failed to parse reply error", "guestfs_aug_insert");
2035 ctx->cb_sequence = 1;
2038 int guestfs_aug_insert (guestfs_h *g,
2043 struct guestfs_aug_insert_args args;
2044 struct aug_insert_ctx ctx;
2045 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2048 if (check_state (g, "guestfs_aug_insert") == -1) return -1;
2049 guestfs_set_busy (g);
2051 memset (&ctx, 0, sizeof ctx);
2053 args.path = (char *) path;
2054 args.label = (char *) label;
2055 args.before = before;
2056 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_INSERT,
2057 (xdrproc_t) xdr_guestfs_aug_insert_args, (char *) &args);
2059 guestfs_end_busy (g);
2063 guestfs__switch_to_receiving (g);
2064 ctx.cb_sequence = 0;
2065 guestfs_set_reply_callback (g, aug_insert_reply_cb, &ctx);
2066 (void) ml->main_loop_run (ml, g);
2067 guestfs_set_reply_callback (g, NULL, NULL);
2068 if (ctx.cb_sequence != 1) {
2069 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_insert");
2070 guestfs_end_busy (g);
2074 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_INSERT, serial) == -1) {
2075 guestfs_end_busy (g);
2079 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2080 error (g, "%s", ctx.err.error_message);
2081 free (ctx.err.error_message);
2082 guestfs_end_busy (g);
2086 guestfs_end_busy (g);
2091 /* This flag is set by the callbacks, so we know we've done
2092 * the callbacks as expected, and in the right sequence.
2093 * 0 = not called, 1 = reply_cb called.
2096 struct guestfs_message_header hdr;
2097 struct guestfs_message_error err;
2098 struct guestfs_aug_rm_ret ret;
2101 static void aug_rm_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2103 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2104 struct aug_rm_ctx *ctx = (struct aug_rm_ctx *) data;
2106 /* This should definitely not happen. */
2107 if (ctx->cb_sequence != 0) {
2108 ctx->cb_sequence = 9999;
2109 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_rm");
2113 ml->main_loop_quit (ml, g);
2115 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2116 error (g, "%s: failed to parse reply header", "guestfs_aug_rm");
2119 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2120 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2121 error (g, "%s: failed to parse reply error", "guestfs_aug_rm");
2126 if (!xdr_guestfs_aug_rm_ret (xdr, &ctx->ret)) {
2127 error (g, "%s: failed to parse reply", "guestfs_aug_rm");
2131 ctx->cb_sequence = 1;
2134 int guestfs_aug_rm (guestfs_h *g,
2137 struct guestfs_aug_rm_args args;
2138 struct aug_rm_ctx ctx;
2139 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2142 if (check_state (g, "guestfs_aug_rm") == -1) return -1;
2143 guestfs_set_busy (g);
2145 memset (&ctx, 0, sizeof ctx);
2147 args.path = (char *) path;
2148 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_RM,
2149 (xdrproc_t) xdr_guestfs_aug_rm_args, (char *) &args);
2151 guestfs_end_busy (g);
2155 guestfs__switch_to_receiving (g);
2156 ctx.cb_sequence = 0;
2157 guestfs_set_reply_callback (g, aug_rm_reply_cb, &ctx);
2158 (void) ml->main_loop_run (ml, g);
2159 guestfs_set_reply_callback (g, NULL, NULL);
2160 if (ctx.cb_sequence != 1) {
2161 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_rm");
2162 guestfs_end_busy (g);
2166 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_RM, serial) == -1) {
2167 guestfs_end_busy (g);
2171 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2172 error (g, "%s", ctx.err.error_message);
2173 free (ctx.err.error_message);
2174 guestfs_end_busy (g);
2178 guestfs_end_busy (g);
2179 return ctx.ret.nrnodes;
2183 /* This flag is set by the callbacks, so we know we've done
2184 * the callbacks as expected, and in the right sequence.
2185 * 0 = not called, 1 = reply_cb called.
2188 struct guestfs_message_header hdr;
2189 struct guestfs_message_error err;
2192 static void aug_mv_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2194 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2195 struct aug_mv_ctx *ctx = (struct aug_mv_ctx *) data;
2197 /* This should definitely not happen. */
2198 if (ctx->cb_sequence != 0) {
2199 ctx->cb_sequence = 9999;
2200 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_mv");
2204 ml->main_loop_quit (ml, g);
2206 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2207 error (g, "%s: failed to parse reply header", "guestfs_aug_mv");
2210 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2211 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2212 error (g, "%s: failed to parse reply error", "guestfs_aug_mv");
2218 ctx->cb_sequence = 1;
2221 int guestfs_aug_mv (guestfs_h *g,
2225 struct guestfs_aug_mv_args args;
2226 struct aug_mv_ctx ctx;
2227 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2230 if (check_state (g, "guestfs_aug_mv") == -1) return -1;
2231 guestfs_set_busy (g);
2233 memset (&ctx, 0, sizeof ctx);
2235 args.src = (char *) src;
2236 args.dest = (char *) dest;
2237 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_MV,
2238 (xdrproc_t) xdr_guestfs_aug_mv_args, (char *) &args);
2240 guestfs_end_busy (g);
2244 guestfs__switch_to_receiving (g);
2245 ctx.cb_sequence = 0;
2246 guestfs_set_reply_callback (g, aug_mv_reply_cb, &ctx);
2247 (void) ml->main_loop_run (ml, g);
2248 guestfs_set_reply_callback (g, NULL, NULL);
2249 if (ctx.cb_sequence != 1) {
2250 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_mv");
2251 guestfs_end_busy (g);
2255 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_MV, serial) == -1) {
2256 guestfs_end_busy (g);
2260 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2261 error (g, "%s", ctx.err.error_message);
2262 free (ctx.err.error_message);
2263 guestfs_end_busy (g);
2267 guestfs_end_busy (g);
2271 struct aug_match_ctx {
2272 /* This flag is set by the callbacks, so we know we've done
2273 * the callbacks as expected, and in the right sequence.
2274 * 0 = not called, 1 = reply_cb called.
2277 struct guestfs_message_header hdr;
2278 struct guestfs_message_error err;
2279 struct guestfs_aug_match_ret ret;
2282 static void aug_match_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2284 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2285 struct aug_match_ctx *ctx = (struct aug_match_ctx *) data;
2287 /* This should definitely not happen. */
2288 if (ctx->cb_sequence != 0) {
2289 ctx->cb_sequence = 9999;
2290 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_match");
2294 ml->main_loop_quit (ml, g);
2296 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2297 error (g, "%s: failed to parse reply header", "guestfs_aug_match");
2300 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2301 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2302 error (g, "%s: failed to parse reply error", "guestfs_aug_match");
2307 if (!xdr_guestfs_aug_match_ret (xdr, &ctx->ret)) {
2308 error (g, "%s: failed to parse reply", "guestfs_aug_match");
2312 ctx->cb_sequence = 1;
2315 char **guestfs_aug_match (guestfs_h *g,
2318 struct guestfs_aug_match_args args;
2319 struct aug_match_ctx ctx;
2320 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2323 if (check_state (g, "guestfs_aug_match") == -1) return NULL;
2324 guestfs_set_busy (g);
2326 memset (&ctx, 0, sizeof ctx);
2328 args.path = (char *) path;
2329 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_MATCH,
2330 (xdrproc_t) xdr_guestfs_aug_match_args, (char *) &args);
2332 guestfs_end_busy (g);
2336 guestfs__switch_to_receiving (g);
2337 ctx.cb_sequence = 0;
2338 guestfs_set_reply_callback (g, aug_match_reply_cb, &ctx);
2339 (void) ml->main_loop_run (ml, g);
2340 guestfs_set_reply_callback (g, NULL, NULL);
2341 if (ctx.cb_sequence != 1) {
2342 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_match");
2343 guestfs_end_busy (g);
2347 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_MATCH, serial) == -1) {
2348 guestfs_end_busy (g);
2352 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2353 error (g, "%s", ctx.err.error_message);
2354 free (ctx.err.error_message);
2355 guestfs_end_busy (g);
2359 guestfs_end_busy (g);
2360 /* caller will free this, but we need to add a NULL entry */
2361 ctx.ret.matches.matches_val =
2362 safe_realloc (g, ctx.ret.matches.matches_val,
2363 sizeof (char *) * (ctx.ret.matches.matches_len + 1));
2364 ctx.ret.matches.matches_val[ctx.ret.matches.matches_len] = NULL;
2365 return ctx.ret.matches.matches_val;
2368 struct aug_save_ctx {
2369 /* This flag is set by the callbacks, so we know we've done
2370 * the callbacks as expected, and in the right sequence.
2371 * 0 = not called, 1 = reply_cb called.
2374 struct guestfs_message_header hdr;
2375 struct guestfs_message_error err;
2378 static void aug_save_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2380 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2381 struct aug_save_ctx *ctx = (struct aug_save_ctx *) data;
2383 /* This should definitely not happen. */
2384 if (ctx->cb_sequence != 0) {
2385 ctx->cb_sequence = 9999;
2386 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_save");
2390 ml->main_loop_quit (ml, g);
2392 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2393 error (g, "%s: failed to parse reply header", "guestfs_aug_save");
2396 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2397 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2398 error (g, "%s: failed to parse reply error", "guestfs_aug_save");
2404 ctx->cb_sequence = 1;
2407 int guestfs_aug_save (guestfs_h *g)
2409 struct aug_save_ctx ctx;
2410 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2413 if (check_state (g, "guestfs_aug_save") == -1) return -1;
2414 guestfs_set_busy (g);
2416 memset (&ctx, 0, sizeof ctx);
2418 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_SAVE, NULL, NULL);
2420 guestfs_end_busy (g);
2424 guestfs__switch_to_receiving (g);
2425 ctx.cb_sequence = 0;
2426 guestfs_set_reply_callback (g, aug_save_reply_cb, &ctx);
2427 (void) ml->main_loop_run (ml, g);
2428 guestfs_set_reply_callback (g, NULL, NULL);
2429 if (ctx.cb_sequence != 1) {
2430 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_save");
2431 guestfs_end_busy (g);
2435 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_SAVE, serial) == -1) {
2436 guestfs_end_busy (g);
2440 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2441 error (g, "%s", ctx.err.error_message);
2442 free (ctx.err.error_message);
2443 guestfs_end_busy (g);
2447 guestfs_end_busy (g);
2451 struct aug_load_ctx {
2452 /* This flag is set by the callbacks, so we know we've done
2453 * the callbacks as expected, and in the right sequence.
2454 * 0 = not called, 1 = reply_cb called.
2457 struct guestfs_message_header hdr;
2458 struct guestfs_message_error err;
2461 static void aug_load_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2463 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2464 struct aug_load_ctx *ctx = (struct aug_load_ctx *) data;
2466 /* This should definitely not happen. */
2467 if (ctx->cb_sequence != 0) {
2468 ctx->cb_sequence = 9999;
2469 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_load");
2473 ml->main_loop_quit (ml, g);
2475 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2476 error (g, "%s: failed to parse reply header", "guestfs_aug_load");
2479 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2480 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2481 error (g, "%s: failed to parse reply error", "guestfs_aug_load");
2487 ctx->cb_sequence = 1;
2490 int guestfs_aug_load (guestfs_h *g)
2492 struct aug_load_ctx ctx;
2493 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2496 if (check_state (g, "guestfs_aug_load") == -1) return -1;
2497 guestfs_set_busy (g);
2499 memset (&ctx, 0, sizeof ctx);
2501 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_LOAD, NULL, NULL);
2503 guestfs_end_busy (g);
2507 guestfs__switch_to_receiving (g);
2508 ctx.cb_sequence = 0;
2509 guestfs_set_reply_callback (g, aug_load_reply_cb, &ctx);
2510 (void) ml->main_loop_run (ml, g);
2511 guestfs_set_reply_callback (g, NULL, NULL);
2512 if (ctx.cb_sequence != 1) {
2513 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_load");
2514 guestfs_end_busy (g);
2518 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_LOAD, serial) == -1) {
2519 guestfs_end_busy (g);
2523 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2524 error (g, "%s", ctx.err.error_message);
2525 free (ctx.err.error_message);
2526 guestfs_end_busy (g);
2530 guestfs_end_busy (g);
2535 /* This flag is set by the callbacks, so we know we've done
2536 * the callbacks as expected, and in the right sequence.
2537 * 0 = not called, 1 = reply_cb called.
2540 struct guestfs_message_header hdr;
2541 struct guestfs_message_error err;
2542 struct guestfs_aug_ls_ret ret;
2545 static void aug_ls_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2547 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2548 struct aug_ls_ctx *ctx = (struct aug_ls_ctx *) data;
2550 /* This should definitely not happen. */
2551 if (ctx->cb_sequence != 0) {
2552 ctx->cb_sequence = 9999;
2553 error (g, "%s: internal error: reply callback called twice", "guestfs_aug_ls");
2557 ml->main_loop_quit (ml, g);
2559 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2560 error (g, "%s: failed to parse reply header", "guestfs_aug_ls");
2563 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2564 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2565 error (g, "%s: failed to parse reply error", "guestfs_aug_ls");
2570 if (!xdr_guestfs_aug_ls_ret (xdr, &ctx->ret)) {
2571 error (g, "%s: failed to parse reply", "guestfs_aug_ls");
2575 ctx->cb_sequence = 1;
2578 char **guestfs_aug_ls (guestfs_h *g,
2581 struct guestfs_aug_ls_args args;
2582 struct aug_ls_ctx ctx;
2583 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2586 if (check_state (g, "guestfs_aug_ls") == -1) return NULL;
2587 guestfs_set_busy (g);
2589 memset (&ctx, 0, sizeof ctx);
2591 args.path = (char *) path;
2592 serial = guestfs__send_sync (g, GUESTFS_PROC_AUG_LS,
2593 (xdrproc_t) xdr_guestfs_aug_ls_args, (char *) &args);
2595 guestfs_end_busy (g);
2599 guestfs__switch_to_receiving (g);
2600 ctx.cb_sequence = 0;
2601 guestfs_set_reply_callback (g, aug_ls_reply_cb, &ctx);
2602 (void) ml->main_loop_run (ml, g);
2603 guestfs_set_reply_callback (g, NULL, NULL);
2604 if (ctx.cb_sequence != 1) {
2605 error (g, "%s reply failed, see earlier error messages", "guestfs_aug_ls");
2606 guestfs_end_busy (g);
2610 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_AUG_LS, serial) == -1) {
2611 guestfs_end_busy (g);
2615 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2616 error (g, "%s", ctx.err.error_message);
2617 free (ctx.err.error_message);
2618 guestfs_end_busy (g);
2622 guestfs_end_busy (g);
2623 /* caller will free this, but we need to add a NULL entry */
2624 ctx.ret.matches.matches_val =
2625 safe_realloc (g, ctx.ret.matches.matches_val,
2626 sizeof (char *) * (ctx.ret.matches.matches_len + 1));
2627 ctx.ret.matches.matches_val[ctx.ret.matches.matches_len] = NULL;
2628 return ctx.ret.matches.matches_val;
2632 /* This flag is set by the callbacks, so we know we've done
2633 * the callbacks as expected, and in the right sequence.
2634 * 0 = not called, 1 = reply_cb called.
2637 struct guestfs_message_header hdr;
2638 struct guestfs_message_error err;
2641 static void rm_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2643 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2644 struct rm_ctx *ctx = (struct rm_ctx *) data;
2646 /* This should definitely not happen. */
2647 if (ctx->cb_sequence != 0) {
2648 ctx->cb_sequence = 9999;
2649 error (g, "%s: internal error: reply callback called twice", "guestfs_rm");
2653 ml->main_loop_quit (ml, g);
2655 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2656 error (g, "%s: failed to parse reply header", "guestfs_rm");
2659 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2660 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2661 error (g, "%s: failed to parse reply error", "guestfs_rm");
2667 ctx->cb_sequence = 1;
2670 int guestfs_rm (guestfs_h *g,
2673 struct guestfs_rm_args args;
2675 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2678 if (check_state (g, "guestfs_rm") == -1) return -1;
2679 guestfs_set_busy (g);
2681 memset (&ctx, 0, sizeof ctx);
2683 args.path = (char *) path;
2684 serial = guestfs__send_sync (g, GUESTFS_PROC_RM,
2685 (xdrproc_t) xdr_guestfs_rm_args, (char *) &args);
2687 guestfs_end_busy (g);
2691 guestfs__switch_to_receiving (g);
2692 ctx.cb_sequence = 0;
2693 guestfs_set_reply_callback (g, rm_reply_cb, &ctx);
2694 (void) ml->main_loop_run (ml, g);
2695 guestfs_set_reply_callback (g, NULL, NULL);
2696 if (ctx.cb_sequence != 1) {
2697 error (g, "%s reply failed, see earlier error messages", "guestfs_rm");
2698 guestfs_end_busy (g);
2702 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_RM, serial) == -1) {
2703 guestfs_end_busy (g);
2707 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2708 error (g, "%s", ctx.err.error_message);
2709 free (ctx.err.error_message);
2710 guestfs_end_busy (g);
2714 guestfs_end_busy (g);
2719 /* This flag is set by the callbacks, so we know we've done
2720 * the callbacks as expected, and in the right sequence.
2721 * 0 = not called, 1 = reply_cb called.
2724 struct guestfs_message_header hdr;
2725 struct guestfs_message_error err;
2728 static void rmdir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2730 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2731 struct rmdir_ctx *ctx = (struct rmdir_ctx *) data;
2733 /* This should definitely not happen. */
2734 if (ctx->cb_sequence != 0) {
2735 ctx->cb_sequence = 9999;
2736 error (g, "%s: internal error: reply callback called twice", "guestfs_rmdir");
2740 ml->main_loop_quit (ml, g);
2742 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2743 error (g, "%s: failed to parse reply header", "guestfs_rmdir");
2746 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2747 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2748 error (g, "%s: failed to parse reply error", "guestfs_rmdir");
2754 ctx->cb_sequence = 1;
2757 int guestfs_rmdir (guestfs_h *g,
2760 struct guestfs_rmdir_args args;
2761 struct rmdir_ctx ctx;
2762 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2765 if (check_state (g, "guestfs_rmdir") == -1) return -1;
2766 guestfs_set_busy (g);
2768 memset (&ctx, 0, sizeof ctx);
2770 args.path = (char *) path;
2771 serial = guestfs__send_sync (g, GUESTFS_PROC_RMDIR,
2772 (xdrproc_t) xdr_guestfs_rmdir_args, (char *) &args);
2774 guestfs_end_busy (g);
2778 guestfs__switch_to_receiving (g);
2779 ctx.cb_sequence = 0;
2780 guestfs_set_reply_callback (g, rmdir_reply_cb, &ctx);
2781 (void) ml->main_loop_run (ml, g);
2782 guestfs_set_reply_callback (g, NULL, NULL);
2783 if (ctx.cb_sequence != 1) {
2784 error (g, "%s reply failed, see earlier error messages", "guestfs_rmdir");
2785 guestfs_end_busy (g);
2789 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_RMDIR, serial) == -1) {
2790 guestfs_end_busy (g);
2794 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2795 error (g, "%s", ctx.err.error_message);
2796 free (ctx.err.error_message);
2797 guestfs_end_busy (g);
2801 guestfs_end_busy (g);
2806 /* This flag is set by the callbacks, so we know we've done
2807 * the callbacks as expected, and in the right sequence.
2808 * 0 = not called, 1 = reply_cb called.
2811 struct guestfs_message_header hdr;
2812 struct guestfs_message_error err;
2815 static void rm_rf_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2817 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2818 struct rm_rf_ctx *ctx = (struct rm_rf_ctx *) data;
2820 /* This should definitely not happen. */
2821 if (ctx->cb_sequence != 0) {
2822 ctx->cb_sequence = 9999;
2823 error (g, "%s: internal error: reply callback called twice", "guestfs_rm_rf");
2827 ml->main_loop_quit (ml, g);
2829 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2830 error (g, "%s: failed to parse reply header", "guestfs_rm_rf");
2833 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2834 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2835 error (g, "%s: failed to parse reply error", "guestfs_rm_rf");
2841 ctx->cb_sequence = 1;
2844 int guestfs_rm_rf (guestfs_h *g,
2847 struct guestfs_rm_rf_args args;
2848 struct rm_rf_ctx ctx;
2849 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2852 if (check_state (g, "guestfs_rm_rf") == -1) return -1;
2853 guestfs_set_busy (g);
2855 memset (&ctx, 0, sizeof ctx);
2857 args.path = (char *) path;
2858 serial = guestfs__send_sync (g, GUESTFS_PROC_RM_RF,
2859 (xdrproc_t) xdr_guestfs_rm_rf_args, (char *) &args);
2861 guestfs_end_busy (g);
2865 guestfs__switch_to_receiving (g);
2866 ctx.cb_sequence = 0;
2867 guestfs_set_reply_callback (g, rm_rf_reply_cb, &ctx);
2868 (void) ml->main_loop_run (ml, g);
2869 guestfs_set_reply_callback (g, NULL, NULL);
2870 if (ctx.cb_sequence != 1) {
2871 error (g, "%s reply failed, see earlier error messages", "guestfs_rm_rf");
2872 guestfs_end_busy (g);
2876 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_RM_RF, serial) == -1) {
2877 guestfs_end_busy (g);
2881 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2882 error (g, "%s", ctx.err.error_message);
2883 free (ctx.err.error_message);
2884 guestfs_end_busy (g);
2888 guestfs_end_busy (g);
2893 /* This flag is set by the callbacks, so we know we've done
2894 * the callbacks as expected, and in the right sequence.
2895 * 0 = not called, 1 = reply_cb called.
2898 struct guestfs_message_header hdr;
2899 struct guestfs_message_error err;
2902 static void mkdir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2904 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2905 struct mkdir_ctx *ctx = (struct mkdir_ctx *) data;
2907 /* This should definitely not happen. */
2908 if (ctx->cb_sequence != 0) {
2909 ctx->cb_sequence = 9999;
2910 error (g, "%s: internal error: reply callback called twice", "guestfs_mkdir");
2914 ml->main_loop_quit (ml, g);
2916 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
2917 error (g, "%s: failed to parse reply header", "guestfs_mkdir");
2920 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
2921 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
2922 error (g, "%s: failed to parse reply error", "guestfs_mkdir");
2928 ctx->cb_sequence = 1;
2931 int guestfs_mkdir (guestfs_h *g,
2934 struct guestfs_mkdir_args args;
2935 struct mkdir_ctx ctx;
2936 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2939 if (check_state (g, "guestfs_mkdir") == -1) return -1;
2940 guestfs_set_busy (g);
2942 memset (&ctx, 0, sizeof ctx);
2944 args.path = (char *) path;
2945 serial = guestfs__send_sync (g, GUESTFS_PROC_MKDIR,
2946 (xdrproc_t) xdr_guestfs_mkdir_args, (char *) &args);
2948 guestfs_end_busy (g);
2952 guestfs__switch_to_receiving (g);
2953 ctx.cb_sequence = 0;
2954 guestfs_set_reply_callback (g, mkdir_reply_cb, &ctx);
2955 (void) ml->main_loop_run (ml, g);
2956 guestfs_set_reply_callback (g, NULL, NULL);
2957 if (ctx.cb_sequence != 1) {
2958 error (g, "%s reply failed, see earlier error messages", "guestfs_mkdir");
2959 guestfs_end_busy (g);
2963 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MKDIR, serial) == -1) {
2964 guestfs_end_busy (g);
2968 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
2969 error (g, "%s", ctx.err.error_message);
2970 free (ctx.err.error_message);
2971 guestfs_end_busy (g);
2975 guestfs_end_busy (g);
2979 struct mkdir_p_ctx {
2980 /* This flag is set by the callbacks, so we know we've done
2981 * the callbacks as expected, and in the right sequence.
2982 * 0 = not called, 1 = reply_cb called.
2985 struct guestfs_message_header hdr;
2986 struct guestfs_message_error err;
2989 static void mkdir_p_reply_cb (guestfs_h *g, void *data, XDR *xdr)
2991 guestfs_main_loop *ml = guestfs_get_main_loop (g);
2992 struct mkdir_p_ctx *ctx = (struct mkdir_p_ctx *) data;
2994 /* This should definitely not happen. */
2995 if (ctx->cb_sequence != 0) {
2996 ctx->cb_sequence = 9999;
2997 error (g, "%s: internal error: reply callback called twice", "guestfs_mkdir_p");
3001 ml->main_loop_quit (ml, g);
3003 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3004 error (g, "%s: failed to parse reply header", "guestfs_mkdir_p");
3007 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3008 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3009 error (g, "%s: failed to parse reply error", "guestfs_mkdir_p");
3015 ctx->cb_sequence = 1;
3018 int guestfs_mkdir_p (guestfs_h *g,
3021 struct guestfs_mkdir_p_args args;
3022 struct mkdir_p_ctx ctx;
3023 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3026 if (check_state (g, "guestfs_mkdir_p") == -1) return -1;
3027 guestfs_set_busy (g);
3029 memset (&ctx, 0, sizeof ctx);
3031 args.path = (char *) path;
3032 serial = guestfs__send_sync (g, GUESTFS_PROC_MKDIR_P,
3033 (xdrproc_t) xdr_guestfs_mkdir_p_args, (char *) &args);
3035 guestfs_end_busy (g);
3039 guestfs__switch_to_receiving (g);
3040 ctx.cb_sequence = 0;
3041 guestfs_set_reply_callback (g, mkdir_p_reply_cb, &ctx);
3042 (void) ml->main_loop_run (ml, g);
3043 guestfs_set_reply_callback (g, NULL, NULL);
3044 if (ctx.cb_sequence != 1) {
3045 error (g, "%s reply failed, see earlier error messages", "guestfs_mkdir_p");
3046 guestfs_end_busy (g);
3050 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MKDIR_P, serial) == -1) {
3051 guestfs_end_busy (g);
3055 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3056 error (g, "%s", ctx.err.error_message);
3057 free (ctx.err.error_message);
3058 guestfs_end_busy (g);
3062 guestfs_end_busy (g);
3067 /* This flag is set by the callbacks, so we know we've done
3068 * the callbacks as expected, and in the right sequence.
3069 * 0 = not called, 1 = reply_cb called.
3072 struct guestfs_message_header hdr;
3073 struct guestfs_message_error err;
3076 static void chmod_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3078 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3079 struct chmod_ctx *ctx = (struct chmod_ctx *) data;
3081 /* This should definitely not happen. */
3082 if (ctx->cb_sequence != 0) {
3083 ctx->cb_sequence = 9999;
3084 error (g, "%s: internal error: reply callback called twice", "guestfs_chmod");
3088 ml->main_loop_quit (ml, g);
3090 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3091 error (g, "%s: failed to parse reply header", "guestfs_chmod");
3094 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3095 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3096 error (g, "%s: failed to parse reply error", "guestfs_chmod");
3102 ctx->cb_sequence = 1;
3105 int guestfs_chmod (guestfs_h *g,
3109 struct guestfs_chmod_args args;
3110 struct chmod_ctx ctx;
3111 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3114 if (check_state (g, "guestfs_chmod") == -1) return -1;
3115 guestfs_set_busy (g);
3117 memset (&ctx, 0, sizeof ctx);
3120 args.path = (char *) path;
3121 serial = guestfs__send_sync (g, GUESTFS_PROC_CHMOD,
3122 (xdrproc_t) xdr_guestfs_chmod_args, (char *) &args);
3124 guestfs_end_busy (g);
3128 guestfs__switch_to_receiving (g);
3129 ctx.cb_sequence = 0;
3130 guestfs_set_reply_callback (g, chmod_reply_cb, &ctx);
3131 (void) ml->main_loop_run (ml, g);
3132 guestfs_set_reply_callback (g, NULL, NULL);
3133 if (ctx.cb_sequence != 1) {
3134 error (g, "%s reply failed, see earlier error messages", "guestfs_chmod");
3135 guestfs_end_busy (g);
3139 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_CHMOD, serial) == -1) {
3140 guestfs_end_busy (g);
3144 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3145 error (g, "%s", ctx.err.error_message);
3146 free (ctx.err.error_message);
3147 guestfs_end_busy (g);
3151 guestfs_end_busy (g);
3156 /* This flag is set by the callbacks, so we know we've done
3157 * the callbacks as expected, and in the right sequence.
3158 * 0 = not called, 1 = reply_cb called.
3161 struct guestfs_message_header hdr;
3162 struct guestfs_message_error err;
3165 static void chown_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3167 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3168 struct chown_ctx *ctx = (struct chown_ctx *) data;
3170 /* This should definitely not happen. */
3171 if (ctx->cb_sequence != 0) {
3172 ctx->cb_sequence = 9999;
3173 error (g, "%s: internal error: reply callback called twice", "guestfs_chown");
3177 ml->main_loop_quit (ml, g);
3179 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3180 error (g, "%s: failed to parse reply header", "guestfs_chown");
3183 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3184 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3185 error (g, "%s: failed to parse reply error", "guestfs_chown");
3191 ctx->cb_sequence = 1;
3194 int guestfs_chown (guestfs_h *g,
3199 struct guestfs_chown_args args;
3200 struct chown_ctx ctx;
3201 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3204 if (check_state (g, "guestfs_chown") == -1) return -1;
3205 guestfs_set_busy (g);
3207 memset (&ctx, 0, sizeof ctx);
3211 args.path = (char *) path;
3212 serial = guestfs__send_sync (g, GUESTFS_PROC_CHOWN,
3213 (xdrproc_t) xdr_guestfs_chown_args, (char *) &args);
3215 guestfs_end_busy (g);
3219 guestfs__switch_to_receiving (g);
3220 ctx.cb_sequence = 0;
3221 guestfs_set_reply_callback (g, chown_reply_cb, &ctx);
3222 (void) ml->main_loop_run (ml, g);
3223 guestfs_set_reply_callback (g, NULL, NULL);
3224 if (ctx.cb_sequence != 1) {
3225 error (g, "%s reply failed, see earlier error messages", "guestfs_chown");
3226 guestfs_end_busy (g);
3230 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_CHOWN, serial) == -1) {
3231 guestfs_end_busy (g);
3235 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3236 error (g, "%s", ctx.err.error_message);
3237 free (ctx.err.error_message);
3238 guestfs_end_busy (g);
3242 guestfs_end_busy (g);
3247 /* This flag is set by the callbacks, so we know we've done
3248 * the callbacks as expected, and in the right sequence.
3249 * 0 = not called, 1 = reply_cb called.
3252 struct guestfs_message_header hdr;
3253 struct guestfs_message_error err;
3254 struct guestfs_exists_ret ret;
3257 static void exists_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3259 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3260 struct exists_ctx *ctx = (struct exists_ctx *) data;
3262 /* This should definitely not happen. */
3263 if (ctx->cb_sequence != 0) {
3264 ctx->cb_sequence = 9999;
3265 error (g, "%s: internal error: reply callback called twice", "guestfs_exists");
3269 ml->main_loop_quit (ml, g);
3271 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3272 error (g, "%s: failed to parse reply header", "guestfs_exists");
3275 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3276 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3277 error (g, "%s: failed to parse reply error", "guestfs_exists");
3282 if (!xdr_guestfs_exists_ret (xdr, &ctx->ret)) {
3283 error (g, "%s: failed to parse reply", "guestfs_exists");
3287 ctx->cb_sequence = 1;
3290 int guestfs_exists (guestfs_h *g,
3293 struct guestfs_exists_args args;
3294 struct exists_ctx ctx;
3295 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3298 if (check_state (g, "guestfs_exists") == -1) return -1;
3299 guestfs_set_busy (g);
3301 memset (&ctx, 0, sizeof ctx);
3303 args.path = (char *) path;
3304 serial = guestfs__send_sync (g, GUESTFS_PROC_EXISTS,
3305 (xdrproc_t) xdr_guestfs_exists_args, (char *) &args);
3307 guestfs_end_busy (g);
3311 guestfs__switch_to_receiving (g);
3312 ctx.cb_sequence = 0;
3313 guestfs_set_reply_callback (g, exists_reply_cb, &ctx);
3314 (void) ml->main_loop_run (ml, g);
3315 guestfs_set_reply_callback (g, NULL, NULL);
3316 if (ctx.cb_sequence != 1) {
3317 error (g, "%s reply failed, see earlier error messages", "guestfs_exists");
3318 guestfs_end_busy (g);
3322 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_EXISTS, serial) == -1) {
3323 guestfs_end_busy (g);
3327 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3328 error (g, "%s", ctx.err.error_message);
3329 free (ctx.err.error_message);
3330 guestfs_end_busy (g);
3334 guestfs_end_busy (g);
3335 return ctx.ret.existsflag;
3338 struct is_file_ctx {
3339 /* This flag is set by the callbacks, so we know we've done
3340 * the callbacks as expected, and in the right sequence.
3341 * 0 = not called, 1 = reply_cb called.
3344 struct guestfs_message_header hdr;
3345 struct guestfs_message_error err;
3346 struct guestfs_is_file_ret ret;
3349 static void is_file_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3351 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3352 struct is_file_ctx *ctx = (struct is_file_ctx *) data;
3354 /* This should definitely not happen. */
3355 if (ctx->cb_sequence != 0) {
3356 ctx->cb_sequence = 9999;
3357 error (g, "%s: internal error: reply callback called twice", "guestfs_is_file");
3361 ml->main_loop_quit (ml, g);
3363 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3364 error (g, "%s: failed to parse reply header", "guestfs_is_file");
3367 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3368 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3369 error (g, "%s: failed to parse reply error", "guestfs_is_file");
3374 if (!xdr_guestfs_is_file_ret (xdr, &ctx->ret)) {
3375 error (g, "%s: failed to parse reply", "guestfs_is_file");
3379 ctx->cb_sequence = 1;
3382 int guestfs_is_file (guestfs_h *g,
3385 struct guestfs_is_file_args args;
3386 struct is_file_ctx ctx;
3387 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3390 if (check_state (g, "guestfs_is_file") == -1) return -1;
3391 guestfs_set_busy (g);
3393 memset (&ctx, 0, sizeof ctx);
3395 args.path = (char *) path;
3396 serial = guestfs__send_sync (g, GUESTFS_PROC_IS_FILE,
3397 (xdrproc_t) xdr_guestfs_is_file_args, (char *) &args);
3399 guestfs_end_busy (g);
3403 guestfs__switch_to_receiving (g);
3404 ctx.cb_sequence = 0;
3405 guestfs_set_reply_callback (g, is_file_reply_cb, &ctx);
3406 (void) ml->main_loop_run (ml, g);
3407 guestfs_set_reply_callback (g, NULL, NULL);
3408 if (ctx.cb_sequence != 1) {
3409 error (g, "%s reply failed, see earlier error messages", "guestfs_is_file");
3410 guestfs_end_busy (g);
3414 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_IS_FILE, serial) == -1) {
3415 guestfs_end_busy (g);
3419 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3420 error (g, "%s", ctx.err.error_message);
3421 free (ctx.err.error_message);
3422 guestfs_end_busy (g);
3426 guestfs_end_busy (g);
3427 return ctx.ret.fileflag;
3431 /* This flag is set by the callbacks, so we know we've done
3432 * the callbacks as expected, and in the right sequence.
3433 * 0 = not called, 1 = reply_cb called.
3436 struct guestfs_message_header hdr;
3437 struct guestfs_message_error err;
3438 struct guestfs_is_dir_ret ret;
3441 static void is_dir_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3443 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3444 struct is_dir_ctx *ctx = (struct is_dir_ctx *) data;
3446 /* This should definitely not happen. */
3447 if (ctx->cb_sequence != 0) {
3448 ctx->cb_sequence = 9999;
3449 error (g, "%s: internal error: reply callback called twice", "guestfs_is_dir");
3453 ml->main_loop_quit (ml, g);
3455 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3456 error (g, "%s: failed to parse reply header", "guestfs_is_dir");
3459 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3460 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3461 error (g, "%s: failed to parse reply error", "guestfs_is_dir");
3466 if (!xdr_guestfs_is_dir_ret (xdr, &ctx->ret)) {
3467 error (g, "%s: failed to parse reply", "guestfs_is_dir");
3471 ctx->cb_sequence = 1;
3474 int guestfs_is_dir (guestfs_h *g,
3477 struct guestfs_is_dir_args args;
3478 struct is_dir_ctx ctx;
3479 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3482 if (check_state (g, "guestfs_is_dir") == -1) return -1;
3483 guestfs_set_busy (g);
3485 memset (&ctx, 0, sizeof ctx);
3487 args.path = (char *) path;
3488 serial = guestfs__send_sync (g, GUESTFS_PROC_IS_DIR,
3489 (xdrproc_t) xdr_guestfs_is_dir_args, (char *) &args);
3491 guestfs_end_busy (g);
3495 guestfs__switch_to_receiving (g);
3496 ctx.cb_sequence = 0;
3497 guestfs_set_reply_callback (g, is_dir_reply_cb, &ctx);
3498 (void) ml->main_loop_run (ml, g);
3499 guestfs_set_reply_callback (g, NULL, NULL);
3500 if (ctx.cb_sequence != 1) {
3501 error (g, "%s reply failed, see earlier error messages", "guestfs_is_dir");
3502 guestfs_end_busy (g);
3506 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_IS_DIR, serial) == -1) {
3507 guestfs_end_busy (g);
3511 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3512 error (g, "%s", ctx.err.error_message);
3513 free (ctx.err.error_message);
3514 guestfs_end_busy (g);
3518 guestfs_end_busy (g);
3519 return ctx.ret.dirflag;
3522 struct pvcreate_ctx {
3523 /* This flag is set by the callbacks, so we know we've done
3524 * the callbacks as expected, and in the right sequence.
3525 * 0 = not called, 1 = reply_cb called.
3528 struct guestfs_message_header hdr;
3529 struct guestfs_message_error err;
3532 static void pvcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3534 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3535 struct pvcreate_ctx *ctx = (struct pvcreate_ctx *) data;
3537 /* This should definitely not happen. */
3538 if (ctx->cb_sequence != 0) {
3539 ctx->cb_sequence = 9999;
3540 error (g, "%s: internal error: reply callback called twice", "guestfs_pvcreate");
3544 ml->main_loop_quit (ml, g);
3546 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3547 error (g, "%s: failed to parse reply header", "guestfs_pvcreate");
3550 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3551 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3552 error (g, "%s: failed to parse reply error", "guestfs_pvcreate");
3558 ctx->cb_sequence = 1;
3561 int guestfs_pvcreate (guestfs_h *g,
3564 struct guestfs_pvcreate_args args;
3565 struct pvcreate_ctx ctx;
3566 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3569 if (check_state (g, "guestfs_pvcreate") == -1) return -1;
3570 guestfs_set_busy (g);
3572 memset (&ctx, 0, sizeof ctx);
3574 args.device = (char *) device;
3575 serial = guestfs__send_sync (g, GUESTFS_PROC_PVCREATE,
3576 (xdrproc_t) xdr_guestfs_pvcreate_args, (char *) &args);
3578 guestfs_end_busy (g);
3582 guestfs__switch_to_receiving (g);
3583 ctx.cb_sequence = 0;
3584 guestfs_set_reply_callback (g, pvcreate_reply_cb, &ctx);
3585 (void) ml->main_loop_run (ml, g);
3586 guestfs_set_reply_callback (g, NULL, NULL);
3587 if (ctx.cb_sequence != 1) {
3588 error (g, "%s reply failed, see earlier error messages", "guestfs_pvcreate");
3589 guestfs_end_busy (g);
3593 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_PVCREATE, serial) == -1) {
3594 guestfs_end_busy (g);
3598 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3599 error (g, "%s", ctx.err.error_message);
3600 free (ctx.err.error_message);
3601 guestfs_end_busy (g);
3605 guestfs_end_busy (g);
3609 struct vgcreate_ctx {
3610 /* This flag is set by the callbacks, so we know we've done
3611 * the callbacks as expected, and in the right sequence.
3612 * 0 = not called, 1 = reply_cb called.
3615 struct guestfs_message_header hdr;
3616 struct guestfs_message_error err;
3619 static void vgcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3621 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3622 struct vgcreate_ctx *ctx = (struct vgcreate_ctx *) data;
3624 /* This should definitely not happen. */
3625 if (ctx->cb_sequence != 0) {
3626 ctx->cb_sequence = 9999;
3627 error (g, "%s: internal error: reply callback called twice", "guestfs_vgcreate");
3631 ml->main_loop_quit (ml, g);
3633 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3634 error (g, "%s: failed to parse reply header", "guestfs_vgcreate");
3637 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3638 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3639 error (g, "%s: failed to parse reply error", "guestfs_vgcreate");
3645 ctx->cb_sequence = 1;
3648 int guestfs_vgcreate (guestfs_h *g,
3649 const char *volgroup,
3650 char * const* const physvols)
3652 struct guestfs_vgcreate_args args;
3653 struct vgcreate_ctx ctx;
3654 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3657 if (check_state (g, "guestfs_vgcreate") == -1) return -1;
3658 guestfs_set_busy (g);
3660 memset (&ctx, 0, sizeof ctx);
3662 args.volgroup = (char *) volgroup;
3663 args.physvols.physvols_val = (char **) physvols;
3664 for (args.physvols.physvols_len = 0; physvols[args.physvols.physvols_len]; args.physvols.physvols_len++) ;
3665 serial = guestfs__send_sync (g, GUESTFS_PROC_VGCREATE,
3666 (xdrproc_t) xdr_guestfs_vgcreate_args, (char *) &args);
3668 guestfs_end_busy (g);
3672 guestfs__switch_to_receiving (g);
3673 ctx.cb_sequence = 0;
3674 guestfs_set_reply_callback (g, vgcreate_reply_cb, &ctx);
3675 (void) ml->main_loop_run (ml, g);
3676 guestfs_set_reply_callback (g, NULL, NULL);
3677 if (ctx.cb_sequence != 1) {
3678 error (g, "%s reply failed, see earlier error messages", "guestfs_vgcreate");
3679 guestfs_end_busy (g);
3683 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_VGCREATE, serial) == -1) {
3684 guestfs_end_busy (g);
3688 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3689 error (g, "%s", ctx.err.error_message);
3690 free (ctx.err.error_message);
3691 guestfs_end_busy (g);
3695 guestfs_end_busy (g);
3699 struct lvcreate_ctx {
3700 /* This flag is set by the callbacks, so we know we've done
3701 * the callbacks as expected, and in the right sequence.
3702 * 0 = not called, 1 = reply_cb called.
3705 struct guestfs_message_header hdr;
3706 struct guestfs_message_error err;
3709 static void lvcreate_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3711 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3712 struct lvcreate_ctx *ctx = (struct lvcreate_ctx *) data;
3714 /* This should definitely not happen. */
3715 if (ctx->cb_sequence != 0) {
3716 ctx->cb_sequence = 9999;
3717 error (g, "%s: internal error: reply callback called twice", "guestfs_lvcreate");
3721 ml->main_loop_quit (ml, g);
3723 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3724 error (g, "%s: failed to parse reply header", "guestfs_lvcreate");
3727 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3728 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3729 error (g, "%s: failed to parse reply error", "guestfs_lvcreate");
3735 ctx->cb_sequence = 1;
3738 int guestfs_lvcreate (guestfs_h *g,
3740 const char *volgroup,
3743 struct guestfs_lvcreate_args args;
3744 struct lvcreate_ctx ctx;
3745 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3748 if (check_state (g, "guestfs_lvcreate") == -1) return -1;
3749 guestfs_set_busy (g);
3751 memset (&ctx, 0, sizeof ctx);
3753 args.logvol = (char *) logvol;
3754 args.volgroup = (char *) volgroup;
3755 args.mbytes = mbytes;
3756 serial = guestfs__send_sync (g, GUESTFS_PROC_LVCREATE,
3757 (xdrproc_t) xdr_guestfs_lvcreate_args, (char *) &args);
3759 guestfs_end_busy (g);
3763 guestfs__switch_to_receiving (g);
3764 ctx.cb_sequence = 0;
3765 guestfs_set_reply_callback (g, lvcreate_reply_cb, &ctx);
3766 (void) ml->main_loop_run (ml, g);
3767 guestfs_set_reply_callback (g, NULL, NULL);
3768 if (ctx.cb_sequence != 1) {
3769 error (g, "%s reply failed, see earlier error messages", "guestfs_lvcreate");
3770 guestfs_end_busy (g);
3774 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_LVCREATE, serial) == -1) {
3775 guestfs_end_busy (g);
3779 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3780 error (g, "%s", ctx.err.error_message);
3781 free (ctx.err.error_message);
3782 guestfs_end_busy (g);
3786 guestfs_end_busy (g);
3791 /* This flag is set by the callbacks, so we know we've done
3792 * the callbacks as expected, and in the right sequence.
3793 * 0 = not called, 1 = reply_cb called.
3796 struct guestfs_message_header hdr;
3797 struct guestfs_message_error err;
3800 static void mkfs_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3802 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3803 struct mkfs_ctx *ctx = (struct mkfs_ctx *) data;
3805 /* This should definitely not happen. */
3806 if (ctx->cb_sequence != 0) {
3807 ctx->cb_sequence = 9999;
3808 error (g, "%s: internal error: reply callback called twice", "guestfs_mkfs");
3812 ml->main_loop_quit (ml, g);
3814 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3815 error (g, "%s: failed to parse reply header", "guestfs_mkfs");
3818 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3819 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3820 error (g, "%s: failed to parse reply error", "guestfs_mkfs");
3826 ctx->cb_sequence = 1;
3829 int guestfs_mkfs (guestfs_h *g,
3833 struct guestfs_mkfs_args args;
3834 struct mkfs_ctx ctx;
3835 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3838 if (check_state (g, "guestfs_mkfs") == -1) return -1;
3839 guestfs_set_busy (g);
3841 memset (&ctx, 0, sizeof ctx);
3843 args.fstype = (char *) fstype;
3844 args.device = (char *) device;
3845 serial = guestfs__send_sync (g, GUESTFS_PROC_MKFS,
3846 (xdrproc_t) xdr_guestfs_mkfs_args, (char *) &args);
3848 guestfs_end_busy (g);
3852 guestfs__switch_to_receiving (g);
3853 ctx.cb_sequence = 0;
3854 guestfs_set_reply_callback (g, mkfs_reply_cb, &ctx);
3855 (void) ml->main_loop_run (ml, g);
3856 guestfs_set_reply_callback (g, NULL, NULL);
3857 if (ctx.cb_sequence != 1) {
3858 error (g, "%s reply failed, see earlier error messages", "guestfs_mkfs");
3859 guestfs_end_busy (g);
3863 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_MKFS, serial) == -1) {
3864 guestfs_end_busy (g);
3868 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {
3869 error (g, "%s", ctx.err.error_message);
3870 free (ctx.err.error_message);
3871 guestfs_end_busy (g);
3875 guestfs_end_busy (g);
3880 /* This flag is set by the callbacks, so we know we've done
3881 * the callbacks as expected, and in the right sequence.
3882 * 0 = not called, 1 = reply_cb called.
3885 struct guestfs_message_header hdr;
3886 struct guestfs_message_error err;
3889 static void sfdisk_reply_cb (guestfs_h *g, void *data, XDR *xdr)
3891 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3892 struct sfdisk_ctx *ctx = (struct sfdisk_ctx *) data;
3894 /* This should definitely not happen. */
3895 if (ctx->cb_sequence != 0) {
3896 ctx->cb_sequence = 9999;
3897 error (g, "%s: internal error: reply callback called twice", "guestfs_sfdisk");
3901 ml->main_loop_quit (ml, g);
3903 if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) {
3904 error (g, "%s: failed to parse reply header", "guestfs_sfdisk");
3907 if (ctx->hdr.status == GUESTFS_STATUS_ERROR) {
3908 if (!xdr_guestfs_message_error (xdr, &ctx->err)) {
3909 error (g, "%s: failed to parse reply error", "guestfs_sfdisk");
3915 ctx->cb_sequence = 1;
3918 int guestfs_sfdisk (guestfs_h *g,
3923 char * const* const lines)
3925 struct guestfs_sfdisk_args args;
3926 struct sfdisk_ctx ctx;
3927 guestfs_main_loop *ml = guestfs_get_main_loop (g);
3930 if (check_state (g, "guestfs_sfdisk") == -1) return -1;
3931 guestfs_set_busy (g);
3933 memset (&ctx, 0, sizeof ctx);
3935 args.device = (char *) device;
3938 args.sectors = sectors;
3939 args.lines.lines_val = (char **) lines;
3940 for (args.lines.lines_len = 0; lines[args.lines.lines_len]; args.lines.lines_len++) ;
3941 serial = guestfs__send_sync (g, GUESTFS_PROC_SFDISK,
3942 (xdrproc_t) xdr_guestfs_sfdisk_args, (char *) &args);
3944 guestfs_end_busy (g);
3948 guestfs__switch_to_receiving (g);
3949 ctx.cb_sequence = 0;
3950 guestfs_set_reply_callback (g, sfdisk_reply_cb, &ctx);
3951 (void) ml->main_loop_run (ml, g);
3952 guestfs_set_reply_callback (g, NULL, NULL);
3953 if (ctx.cb_sequence != 1) {
3954 error (g, "%s reply failed, see earlier error messages", "guestfs_sfdisk");
3955 guestfs_end_busy (g);
3959 if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_SFDISK, serial) == -1) {
3960 guestfs_end_busy (g);
3964 if (ctx.hdr.status == GUESTFS_STATUS_ERROR) {